15

Python 2.7 でうまく動作するコードがいくつかあります。

Python 2.7.3 (default, Jan  2 2013, 13:56:14) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from sys import stdout
>>> foo = 'Bar'
>>> numb = 10
>>> stdout.write('{} {}\n'.format(numb, foo))
10 Bar
>>>

しかし、2.6 では ValueError 例外が発生します。

Python 2.6.8 (unknown, Jan 26 2013, 14:35:25) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from sys import stdout
>>> foo = 'Bar'
>>> numb = 10
>>> stdout.write('{} {}\n'.format(numb, foo))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: zero length field name in format
>>>

ドキュメント ( 2.62.7 ) を見ると、2 つのバージョン間で行われた変更について言及されていないことがわかります。ここで何が起きてるの?

4

2 に答える 2

28

Python 2.6 以前 (および Python 3.0) では、プレースホルダーに番号を付ける必要があります。

'{0} {1}\n'.format(numb, foo)

Python 2.7 および Python 3.1 以降で省略されている場合、番号付けは暗黙的です。ドキュメントを参照してください。

バージョン 2.7 で変更: 位置引数指定子は省略できるため、'{} {}'と同等'{0} {1}'です。

暗黙的な番号付けは人気があります。スタック オーバーフローの多くの例では、この方法でクイック フォーマット文字列を作成する方が簡単であるため、これを使用しています。2.6 をまだサポートしなければならないプロジェクトに取り組んでいるときに、それらを何度も含めるのを忘れていました。

于 2013-10-29T20:28:01.657 に答える
5

これはドキュメントにあります:
http://docs.python.org/2/library/string.html#format-string-syntax

そのセクションのほぼ半分:

バージョン 2.7 で変更: 位置引数指定子は省略できるため、'{} {}'と同等'{0} {1}'です。

于 2013-10-29T20:28:04.900 に答える