web-dev-qa-db-fra.com

Formatage des chaînes en Python antérieure à 2.6

Lorsque j'exécute le code suivant dans Python 2.5.2:

for x in range(1, 11):
    print '{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x)

Je reçois:

Traceback (most recent call last):
  File "<pyshell#9>", line 2, in <module>
    print '{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x)
AttributeError: 'str' object has no attribute 'format'

Je ne comprends pas le problème.

De dir('hello') il n'y a pas d'attribut format.

Comment puis-je resoudre ceci?

34
user46646

Le str.format la méthode était introduite dans Python 3.0 et rétroportée à Python 2.6 et versions ultérieures).

47
SilentGhost

Votre exemple de code semble être écrit pour Python 2.6 ou version ultérieure, où le str.format la méthode a été introduite .

Pour Python inférieures à 2.6, utilisez l'opérateur% pour interpoler une séquence de valeurs dans une chaîne de format:

for x in range(1, 11):
    print '%2d %3d %4d' % (x, x*x, x*x*x)

Vous devez également savoir que cet opérateur peut interpoler par nom à partir d'un mappage, au lieu de simplement des arguments de position:

>>> "%(foo)s %(bar)d" % {'bar': 42, 'foo': "spam", 'baz': None}
'spam 42'

En combinaison avec le fait que la fonction vars () intégrée renvoie les attributs d'un espace de noms en tant que mappage, cela peut être très pratique:

>>> bar = 42
>>> foo = "spam"
>>> baz = None
>>> "%(foo)s %(bar)d" % vars()
'spam 42'
36
bignose

Je crois que c'est une fonction Python 3.0, bien qu'elle soit dans la version 2.6. Mais si vous avez une version de Python ci-dessous, ce type de formatage de chaîne ne fonctionnera pas.

Si vous essayez d'imprimer des chaînes formatées en général, utilisez la syntaxe de style printf de Python via % opérateur. Par exemple:

print '%.2f' % some_var
8
hbw

Bien que les réponses existantes décrivent les causes et pointent dans la direction d'un correctif, aucune d'entre elles ne fournit réellement une solution qui accomplit ce que la question demande.

Vous avez deux options pour résoudre le problème. La première consiste à passer à Python 2.6 ou supérieur, qui prend en charge la construction de chaîne de format .

La deuxième option consiste à utiliser formatage de chaîne plus ancien avec l'opérateur% . Le code équivalent de ce que vous avez présenté serait le suivant.

for x in range(1,11):
  print '%2d %3d %4d' % (x, x*x, x*x*x)

Ce code coupé produit exactement la même sortie en Python 2.5 que votre exemple de code produit en Python 2.6 et supérieur).

7
Jason R. Coombs

Quelle version Python version utilisez-vous?

Modifier Pour Python 2.5, utilisez "x = %s" % (x) (pour imprimer des chaînes)

Si vous souhaitez imprimer d'autres types, voir ici .

7
Loïc Wolff