Элегантные способы распечатки атрибутов экземпляра в Python 2.6?
-
24-10-2019 - |
Вопрос
Сначала немного фона. Я анализирую простой формат файла и хочу повторно использовать результаты в коде Python позже, поэтому я сделал очень простую иерархию класса и написал синтаксический анализатор для создания объектов из исходных записей в текстовых файлах, с которыми я работаю Анкет
В то же время я хотел бы загрузить данные в устаревшую базу данных, файлы Loader, для которых принимают простой формат, разделенный вкладками. Самый простой способ - просто сделать что -то вроде:
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__
А если да, то как? - Есть ли более элегантный способ для чего -то подобного, где вам просто нужно вывести кучу атрибутов, для которых вы уже знаете название?
Решение
class MyRecord:
#....
def __getitem__(self, key):
return getattr(self, key)
Другие советы
Если вы сделаете длину ATTR1 и атрибутом класса записей (так что вы действительно просто печатаете атрибуты экземпляра, как следует из названия), вы можете просто сделать это.
attrs = ['id', 'attr1', 'attr1_len', ...]
print '\t'.join(getattr(record, attr) for attr in attrs)