Erreur de formatage du texte: '= ' alignement non autorisé dans le spécificateur de format de chaîne

Que '=' alignment dans le message d'erreur suivant, et pourquoi ce code de cause?

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

Le code a un problème subtil: la valeur d'entrée "1" est le texte, n'est pas un nombre. Mais le message d'erreur ne semble pas avoir quelque chose à voir avec cela.

Rien dans le message d'erreur indique pourquoi "' = "alignement" est pertinente, et il n'apparaît pas dans le code. Quelle est donc la signification de l'émission de ce message d'erreur?

19
demandé sur bignose 2016-03-16 21:58:45

5 réponses

le message d'erreur se produit parce que '=' alignment a été implicite par le spécificateur de format.

str.format format spec mini-language parser a décidé le l'alignement spécificateur de "=", parce que:

précédant le champ width d'un caractère zero ('0') permet zero-padding pour les caractères numériques. C'est l'équivalent d'un remplissez le caractère " 0 "avec un type d'alignement"=".

donc en spécifiant 0N comme la "zero-padding N largeur", il est implicite à la fois "l'entrée est un type numérique", et "les zéros devrait aller entre le signe et les chiffres". Cette dernière implication est ce que l'on entend par '=' alignment.

la valeur "1" n'est pas numérique, le code de traitement d'alignement "="soulève cette exception. Le message est écrit en espérant que vous savez de quoi il parle parce que vous avez demandé (implicitement) l'alignement"=".

Oui, je pense que le message d'erreur doit être améliorer. J'ai soulevait un problème.

27
répondu bignose 2016-11-21 22:50:11

Une solution de contournement est d'utiliser '>' (justifier à droite) rembourrage, qui est avec la syntaxe suivante:

[[fill]align][width]

à aligner étant > et le remplir d'être 0.

Fill default to espace.

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

le problème est que align par défaut à = ce qui signifie

force le remplissage à être placé après le signe (s'il y en a) mais avant les chiffres. Ceci est utilisé pour l'impression des champs sous la forme ‘+000000120’. Ce l'option d'alignement n'est valable que pour les types numériques. Elle devient la valeur par défaut lorsque ' 0 ' précède immédiatement la largeur du champ.

Source (Python 3 docs)

Il n'y a aucun signe dans la chaîne. Vous pouvez également spécifier l'aligner manuellement et utiliser la syntaxe suivante:

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

remarque:

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

qui fonctionne avec la même logique, mais pour aligner être justifier à gauche (<) et au centre (^)

6
répondu Artyer 2016-10-01 18:21:33

str.__format__ ne sait pas quoi faire avec votre 03 partie. Cela ne fonctionne qu'avec des nombres:

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

si vous voulez réellement zéro-pad une chaîne, vous pouvez utiliser rjust:

>>> "1".rjust(3, "0")
'001'
3
répondu L3viathan 2016-03-16 19:03:43

vous essayez d'insérer 'string->"1" où un float->3.44 est requis. Supprimez les guillemets "1", i.e. num=1, et cela fonctionnera

0
répondu diahron 2016-03-16 19:08:03

ce format serait acceptable

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

mais la façon dont vous avez l'espace réservé spécifié {num:03} ne l'est pas. C'est une valeur intéressante Error cependant, si vous supprimez le : l'erreur intéressante est remplacée par un standard KeyError.

-1
répondu pholtz 2016-03-16 19:03:29