2010-06-08 12 views
0

D'abord un peu d'arrière-plan. J'analyse un format de fichier simple et souhaite réutiliser les résultats dans le code python plus tard, j'ai donc créé une hiérarchie de classes très simple et écrit l'analyseur pour construire des objets à partir des enregistrements originaux dans les fichiers texte sur lesquels je travaille .Des manières élégantes d'imprimer un tas d'attributs d'instance dans python 2.6?

Dans le même temps, je voudrais charger les données dans une base de données héritée, les fichiers du chargeur pour lesquels un format simple séparé par des tabulations. La façon la plus simple serait de faire quelque chose comme:

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

Parce qu'il ya tant de colonnes pour imprimer si, je pensais que j'utiliser la classe Template pour le rendre un peu plus facile de voir ce qui est quoi, à savoir:

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

Et je me suis dit que je pouvais utiliser le disque en place de la carte utilisée par un appel substitute, avec quelques mots-clés supplémentaires pour les valeurs dérivées:

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

Malheureusement, cela échoue, se plaignant que l'instance d'enregistrement n'a pas d'attribut __getitem__.

Donc, ma question est double:

  • dois-je mettre en œuvre __getitem__ et si oui, comment?
  • Y a-t-il un moyen plus élégant pour quelque chose comme ça où vous avez juste besoin de sortir un tas d'attributs dont vous connaissez déjà le nom?

Répondre

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

Merci! J'ai ajouté un essai - excepté pour transformer 'AttributeError's en' KeyError's. – wds

2

Si vous faites la longueur de attr1 une propriété ou un attribut de la classe d'enregistrement (si vous imprimez vraiment juste les attributs d'instance comme le titre l'indique), vous pouvez simplement le faire.

attrs = ['id', 'attr1', 'attr1_len', ...] 
print '\t'.join(getattr(record, attr) for attr in attrs) 
+0

Très soigné. Malheureusement, je ne peux pas vraiment éviter certains attributs dérivés ici et là (je pourrais les ajouter tous à l'objet, mais cela semble être un double travail et ne fait que salir l'espace de noms). – wds

+0

Les attributs dérivés sont exactement ce pour quoi les propriétés sont bonnes, mais je ne peux pas dire à partir de votre question combien vous auriez besoin ou si elles sont toutes juste ou quoi. – FogleBird

+0

Il y a une mise en forme de sortie ici et là (regrouper des listes en valeurs séparées par des virgules et autres), ce qui n'aurait aucun sens à dupliquer. Pas si cela peut être évité de toute façon. +1 cependant, c'est la meilleure réponse à la question s'il n'y a pas quelques problèmes de détail comme ça. – wds