modi eleganti per stampare un gruppo di attributi di istanza in Python 2.6?
-
24-10-2019 - |
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?
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)