¿Formas elegantes de imprimir un montón de atributos de instancia en Python 2.6?
-
24-10-2019 - |
Pregunta
Primero algunos antecedentes. Estoy analizando un formato de archivo simple y deseo reutilizar los resultados en el código de Python más tarde, por lo que hice una jerarquía de clase muy simple y escribí el analizador para construir objetos a partir de los registros originales en los archivos de texto que estoy trabajando .
Al mismo tiempo, me gustaría cargar los datos en una base de datos heredadas, los archivos del cargador para los cuales toman un formato simple separado por pestañas. La forma más directa sería hacer algo como:
print "{0}\t{1}\t....".format(record.id, record.attr1, len(record.attr1), ...)
Sin embargo, porque hay muchas columnas para imprimir, pensé que usaría el Template
clase para que sea un poco más fácil ver qué es qué, es decir:
templ = Template("$id\t$attr1\t$attr1_len\t...")
Y pensé que podría usar el registro en lugar del mapa utilizado por un substitute
Llame, con algunas palabras clave adicionales para valores derivados:
print templ.substitute(record, attr1_len=len(record.attr1), ...)
Desafortunadamente, esto falla, quejándose de que la instancia de registro no tiene un atributo __getitem__
.
Entonces mi pregunta es doble:
- ¿Necesito implementar
__getitem__
Y si es así, ¿cómo? - ¿Hay una manera más elegante para algo como esto en el que solo necesita generar un montón de atributos para los que ya conoce el nombre?
Solución
class MyRecord:
#....
def __getitem__(self, key):
return getattr(self, key)
Otros consejos
Si hace la longitud de ATtr1 una propiedad o atributo de la clase de registro (por lo que realmente solo está imprimiendo los atributos de instancia como lo indica el título), podría hacerlo.
attrs = ['id', 'attr1', 'attr1_len', ...]
print '\t'.join(getattr(record, attr) for attr in attrs)