Domanda

In primo luogo alcuni retroscena. Sto analisi di un formato di file semplice, e desiderio di ri-utilizzare i risultati in codice Python tardi, così ho fatto una gerarchia di classi molto semplice e ha scritto il parser per costruire oggetti dai documenti originali nei file di testo su cui sto lavorando da .

Allo stesso tempo, mi piacerebbe per caricare i dati in un database legacy, i file caricatore per cui prendere un semplice formato separato da tabulazione. Il modo più semplice sarebbe quella di fare proprio qualcosa di simile:

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

Perché ci sono così tante colonne per stampare fuori, però, ho pensato di utilizzare la classe Template per renderlo un po 'più facile per vedere come stanno le cose, cioè:.

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

E ho pensato che avrei potuto semplicemente usare il record al posto della mappa utilizzata da una chiamata substitute, con alcune parole chiave aggiuntive per valori derivati:

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

Purtroppo questo non riesce, lamentando che l'istanza di registrazione non ha un __getitem__ attributo.

Quindi la mia domanda è duplice:

  • ho bisogno di implementare __getitem__ e se sì, come?
  • c'è un modo più elegante per qualcosa come questo in cui è sufficiente l'uscita un gruppo di attributi si conosce già il nome per?
È stato utile?

Soluzione

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

Altri suggerimenti

Se si effettua la lunghezza del attr1 una proprietà o un attributo della classe di registrazione (in modo che stai davvero solo la stampa di esempio attributi, come il titolo suggerisce), si può solo fare questo.

attrs = ['id', 'attr1', 'attr1_len', ...]
print '\t'.join(getattr(record, attr) for attr in attrs)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top