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?
¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top