12

Mam trochę kodu, który działa dobrze w Pythonie 2.7.Str.format() dla Pythona 2.6 daje błąd, gdy 2.7 nie ma

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 
>>> 

Ale w 2.6 dostaję wyjątek 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 
>>> 

Gdy pominie dokumentacji (2.6, 2.7), widzę żadnej wzmianki o zmianach które zostały wykonane pomiędzy dwiema wersjami. Co tu się dzieje?

Odpowiedz

22

Pythona 2,6 i przed (a także Python 3.0) wymagają że numer zastępcze:

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

Numeracja, jeśli zostanie pominięty w Pythonie 2,7 Python 3.1, i w górę, jest ukryte, patrz documentation:

Zmieniono w wersji 2.7: pozycyjne specyfikatory argument może być pominięta, tak '{} {}' odpowiada '{0} {1}'.

Niejawna numeracja jest popularna; wiele przykładów tutaj na przepełnieniu stosu używa go, ponieważ łatwiej jest w ten sposób ulepszyć łańcuch formatu szybkiego. Zapomniałem uwzględnić je więcej niż jeden raz podczas pracy nad projektami, które muszą jeszcze wspierać 2.6.

+0

Dziękuję. Byłem zajęty, patrząc tylko na dokumentację samej metody, że na początku tęskniłem za tekstem. – Mogget