2016-03-16 13 views
11

Che cosa significa '=' alignment nel seguente messaggio di errore e perché questo codice lo causa?Errore di formattazione del testo: '=' allineamento non consentito nello specificatore del formato stringa

>>> "{num:03}".format(num="1") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: '=' alignment not allowed in string format specifier 

Il codice ha un problema sottile: il valore di ingresso è "1" testo, non un numero. Ma il messaggio di errore non sembra avere nulla a che fare con quello.

Nulla nel messaggio di errore indica perché "'=' allineamento" è rilevante, e non compare nel codice. Quindi qual è il significato di emettere quel messaggio di errore?

risposta

18

Il messaggio di errore si verifica perché '=' alignment è stato implicato dalla di formato.

Il str.formatformat spec mini-language parser ha deciso il allineamento identificatore “=” perché:

Preceding the width field by a zero ('0') character enables sign-aware zero-padding for numeric types. This is equivalent to a fill character of '0' with an alignment type of '='.

Così specificando 0N come lo “zero-padding la larghezza N”, si è implicita sia “l'ingresso è un tipo numerico ", e" gli zeri dovrebbero andare tra il segno e le cifre ". Quest'ultima implicazione è ciò che si intende per '=' alignment.

Poiché il valore "1" non è numerico, il codice di gestione "=" - allineamento solleva tale eccezione. Il messaggio è scritto aspettando che tu sappia di cosa sta parlando perché hai richiesto (implicitamente) l'allineamento "=".

Sì, penso che il messaggio di errore debba essere migliorato. Ho raised an issue for that.

-1

Questo formato sarebbe accettabile

"{num}:03".format(num="1") 

, ma il modo in cui si ha il segnaposto specificato {num:03} non lo è. Si tratta di un valore ValueError interessante se, se si rimuove lo :, l'errore interessante viene sostituito da uno standard KeyError.

+0

Questo non fa ciò che OP intendeva. Vogliono allineare a sinistra una stringa imbottita usando 'format'. –

+0

Ah ok, ora vedo. Questo ha più senso. – pholtz

3

str.__format__ non sa cosa fare con la parte 03. Che solo funziona con i numeri:

>>> "{num:03}".format(num=1) 
'001' 

Se si vuole realmente a zero-pad una stringa, è possibile utilizzare rjust:

>>> "1".rjust(3, "0") 
'001' 
0

Si sta tentando di inserire 'stringa -> "1" dove è richiesto un float-> 3.44. Rimuovere le virgolette "1", vale a dire num = 1, e funzionerà

4

Una soluzione è quella di utilizzare '>' (a destra giustificare) padding, che è con la sintassi:

[[fill]align][width] 

con align essere > e riempire essendo 0.

Fill default su spazio.

>>> "{num:0>3}".format(num="1") 
'001' 

Il problema è che di default adeguamento alla = che significa

Forces the padding to be placed after the sign (if any) but before the digits. This is used for printing fields in the form ‘+000000120’. This alignment option is only valid for numeric types. It becomes the default when ‘0’ immediately precedes the field width.

Source (Python 3 docs)

v'è alcun segno nella stringa. È inoltre possibile specificare l'allineare manualmente e utilizzare la sintassi:

[align]0[width] 
>>> "{num:>03}".format(num="1") 
'001' 

Si noti inoltre:

>>> "{num:^03} {num:<03}".format(num="1") 
'010 100' 

che funziona con la stessa logica, ma per align essere stato lasciato giustificare (<) e center (^)

Problemi correlati