2009-04-27 18 views
30

Cuando ejecuto el siguiente código en Python 2.5.2:formato de cadenas en Python versión 2.6 antes de lo

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

me sale:

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' 

No entiendo el problema.

De dir('hello') no hay ningún atributo format.

¿Cómo puedo solucionar esto?

Respuesta

7

¿Qué versión de Python usas?

Editar Para Python 2.5, utilice "x = %s" % (x) (para las cadenas de impresión)

Si desea imprimir otros tipos, see here.

+0

Python 2.5.2 ... – user46646

+5

str.format() solo funciona en 2.6+ y py3k –

8

Creo que es una característica de Python 3.0, aunque está en la versión 2.6. Pero si tiene una versión de Python por debajo de eso, ese tipo de formato de cadena no funcionará.

Si está intentando imprimir cadenas formateadas en general, use la sintaxis de estilo printf de Python a través del operador %. Por ejemplo:

print '%.2f' % some_var 
32

Para las versiones de Python por debajo de 2.6, utilice el % operator para interpolar una secuencia de valores en una cadena de formato:

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

También debe tener en cuenta que este operador puede interpolar por nombre de una asignación, en lugar argumentos de tan sólo posicionales:

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

en combinación con el hecho de que la incorporada en Vars() devuelve atributos de un espacio de nombres como una asignación, esto puede ser muy útil:

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

Esta es una buena descripción, pero no describe cómo implementar el formateo en el ejemplo presentado. –

7

Aunque las respuestas existentes describen las causas y apuntan en la dirección de una solución, ninguno de ellos proporcionan una solución que logra lo que hace la pregunta.

Tiene dos opciones para resolver el problema. El primero es actualizar a Python 2.6 o superior, que admite el format string construct.

La segunda opción es usar el older string formatting with the % operator. El código equivalente de lo que has presentado sería el siguiente.

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

Este código cortó produce exactamente la misma salida en Python 2.5 como su código de ejemplo produce en Python 2.6 y mayor.