Элегантные способы распечатать набор атрибутов экземпляра в Python 2.6? - PullRequest
0 голосов
/ 08 июня 2010

Сначала немного фона. Я анализирую простой формат файла и хочу повторно использовать результаты в коде Python позже, поэтому я создал очень простую иерархию классов и написал анализатор для построения объектов из исходных записей в текстовых файлах, из которых я работаю .

В то же время я хотел бы загрузить данные в устаревшую базу данных, файлы загрузчика для которой имеют простой формат с разделением табуляцией. Самый простой способ - сделать что-то вроде:

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

Поскольку существует так много столбцов для печати, я подумал, что я буду использовать класс Template, чтобы немного легче было видеть, что к чему, т.е.

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

И я подумал, что мог бы использовать запись вместо карты, используемой при вызове substitute, с некоторыми дополнительными ключевыми словами для производных значений:

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

К сожалению, это не удается, жалуясь, что экземпляр записи не имеет атрибута __getitem__.

Итак, мой вопрос состоит из двух частей:

  • мне нужно реализовать __getitem__ и если да, то как?
  • есть ли более элегантный способ для чего-то подобного, когда вам просто нужно вывести набор атрибутов, имя которых вы уже знаете?

Ответы [ 2 ]

2 голосов
/ 08 июня 2010

Если вы сделаете длину attr1 свойством или атрибутом класса записи (так что вы действительно просто печатаете атрибуты экземпляра, как следует из заголовка), вы можете просто сделать это.

attrs = ['id', 'attr1', 'attr1_len', ...]
print '\t'.join(getattr(record, attr) for attr in attrs)
2 голосов
/ 08 июня 2010
class MyRecord:
    #....  
    def __getitem__(self, key):
        return getattr(self, key)
...