Question

D'abord le contexte. Je l'analyse d'un format de fichier simple, et que vous souhaitez réutiliser les résultats dans le code python plus tard, donc je fait une hiérarchie de classes très simple et écrit l'analyseur pour construire des objets à partir des enregistrements originaux dans les fichiers texte que je travaille à partir .

En même temps, je voudrais charger les données dans une base de données existante, les fichiers du chargeur pour lequel prendre un format simple onglet séparé. 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, i.e..

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 ne fonctionne pas, se plaignant que l'instance d'enregistrement ne dispose pas d'un __getitem__ d'attribut.

Alors ma question est double:

  • dois-je mettre en œuvre __getitem__ et si oui, comment?
  • est-il une façon plus élégante pour quelque chose comme ça où vous avez juste besoin de sortir un tas d'attributs que vous connaissez déjà le nom?
Était-ce utile?

La solution

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

Autres conseils

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top