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?
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.
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.
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 (^
)
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'
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
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
.