Frage

Erstens etwas Hintergrund. Ich analysiere ein einfaches Dateiformat und möchte die Ergebnisse später in Python-Code wiederverwenden. Deshalb habe ich eine sehr einfache Klassenhierarchie erstellt und den Parser geschrieben, um Objekte aus den ursprünglichen Datensätzen in den Textdateien zu konstruieren, aus denen ich arbeite .

Gleichzeitig möchte ich die Daten in eine Legacy-Datenbank laden. Der unkomplizierteste Weg wäre, nur so etwas wie zu tun:

print "{0}\t{1}\t....".format(record.id, record.attr1, len(record.attr1), ...)

Weil es so viele Spalten zum Ausdrucken gibt, dachte ich, ich würde das verwenden Template Klasse, um es ein bisschen einfacher zu machen zu sehen, was was ist, dh:

templ = Template("$id\t$attr1\t$attr1_len\t...")

Und ich dachte, ich könnte den Datensatz anstelle der von a verwendeten Karte verwenden substitute Rufen Sie mit einigen zusätzlichen Schlüsselwörtern für abgeleitete Werte an:

print templ.substitute(record, attr1_len=len(record.attr1), ...)

Leider scheitert dies und beschwert sich darüber, dass die Datensatzinstanz kein Attribut hat __getitem__.

Meine Frage ist also zweifach:

  • Muss ich implementieren __getitem__ Und wenn ja, wie?
  • Gibt es eine elegantere Möglichkeit für so etwas, wo Sie nur eine Reihe von Attributen ausgeben müssen, für die Sie den Namen bereits kennen?
War es hilfreich?

Lösung

class MyRecord:
    #....  
    def __getitem__(self, key):
        return getattr(self, key)

Andere Tipps

Wenn Sie die Länge von Attr1 zu einer Eigenschaft oder einem Attribut der Datensatzklasse machen (also drucken Sie wirklich nur Instanzattribute, wie der Titel impliziert), können Sie dies einfach tun.

attrs = ['id', 'attr1', 'attr1_len', ...]
print '\t'.join(getattr(record, attr) for attr in attrs)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top