multiple - python 3 format string
Utilice str.format() para acceder a los atributos del objeto (5)
Tengo un objeto Python con atributos a
, b
, c
.
Sigo usando el formato de cadena anterior, por lo que normalmente imprimo esto manualmente:
print ''My object has strings a=%s, b=%s, c=%s'' % (obj.a, obj.b, obj.c)
Últimamente, mis cadenas se han vuelto súper largas, y preferiría poder simplemente pasar el objeto a una función de formato de cadena, algo así como:
print ''My object has strings a=%a, b=%b, c=%c''.format(obj)
Sin embargo, la sintaxis es incorrecta. es posible?
Algunas de las respuestas sugeridas que se basan en vars(...)
no funcionan con objetos inmutables:
>>> class foo(object):
... __slots__ = ()
... def __init__(self):
... self.x = 1
...
>>> vars(foo())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in __init__
AttributeError: ''foo'' object has no attribute ''x''
Creo que es preferible seguir con algo confiable y hacer una lista explícita de lo que necesita para imprimir.
Si necesita imprimir una tonelada de atributos, entonces almacenar esos valores como atributos podría no ser la mejor idea.
Como @igniteflow escribió en un comentario enterrado:
''My object has strings a={a}, b={b}, c={c}''.format(**obj.__dict__)
Con mi entendimiento limitado de Python: .__dict__
es un dict con todos los atributos de instancias y el operador **
básicamente los desempaqueta y los agrega como clave = valor args al método
Creo que es preferible usar vars() para acceder a los atributos de un objeto como dict
lugar de usng __dict__
.
Para que pudieras hacer esto:
"My object has strings a={a}, b={b}, c={c}".format(**vars(obj))
Para obtener más información sobre por qué vars()
es preferible a __dict__
, consulte la respuesta a la pregunta ¿ Usar dict o vars ()? .
En aras de la integridad, basándose en @igniteflow y @Christian, puede utilizar el operador de formato de cadena %
y escribir:
''My object has strings a=%(a)s, b=%(b)s, c=%(c)s'' % obj.__dict__
Puede usar la notación .attribute_name
dentro de los campos de formato en sí mismos:
print ''My object has strings a={0.a}, b={0.b}, c={0.c}''.format(obj)
A continuación se muestra una demostración:
>>> class Test(object):
... def __init__(self, a, b, c):
... self.a = a
... self.b = b
... self.c = c
...
>>> obj = Test(1, 2, 3)
>>> ''My object has strings a={0.a}, b={0.b}, c={0.c}''.format(obj)
''My object has strings a=1, b=2, c=3''
>>>
Sin embargo, tenga en cuenta que debe numerar los campos de formato al hacer esto. Además, como puede ver, la función str.format
tiene sus campos de formato indicados con llaves {...}
, no el signo %
.
Para obtener más información, aquí hay una referencia sobre la sintaxis de cadenas de formato en Python.