12

Ho un codice che funziona bene in Python 2.7.Str.format() per Python 2.6 restituisce un errore in cui 2.7 non è

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

Ma in 2.6 ottengo un'eccezione 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 
>>> 

Quando si cerca attraverso la documentazione (2.6, 2.7), riesco a vedere alcuna menzione di cambiamenti essendo stato fatto tra le due versioni. Cosa sta succedendo qui?

risposta

22

Python 2.6 e prima (così come Python 3.0) richiedono che di numerare i segnaposto:

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

la numerazione, se omesso in Python 2.7 e Python 3.1 e fino, è implicita, vedere la documentation:

Modificato nella versione 2.7: Le specificazioni per argomenti posizionali possono essere omessi, così '{} {}' è equivalente a '{0} {1}'.

La numerazione implicita è popolare; un sacco di esempi qui su Stack Overflow lo usano in quanto è più facile creare una stringa di formato veloce in questo modo. Ho dimenticato di includerli più di una volta quando lavoro su progetti che devono ancora supportare 2.6.

+0

Grazie. Ero impegnato a guardare la documentazione del metodo stesso che all'inizio mi mancava il testo. – Mogget