Я неоднократно оказываюсь в положении, когда я пишу определенные поля экземпляра модели django в список по разным причинам (экспорт в CSV, ведение журнала), и я думаю, что то же самое верно для многих других людей.
Создание отчета может потребовать обхода внешних ключей, ЕСЛИ они существуют.Чем больше отчет, тем больше нечитаемый код становится, когда я обертываю попытки получения атрибута в try/except
блоках.
Опциональные внешние ключи также являются проблемами: item.optional_fk.optional_date.method()
for item in django_model_instances:
try:
date_created = item.order.date_created.strftime('%Y/%m/%d')
except AttributeError:
date_created = ''
try:
date_complete = item.order.date_complete.strftime('%Y/%m/%d')
except AttributeError:
date_complete = ''
# perhaps more try/except...
writer.writerow([
item.optional_fk.optional_field.strtime('%Y'),
item.optional_fk.method(),
item.bar,
date_created,
# other attributes...
date_complete,
# other attributes...
])
Когда выбольше столбцов для написания кода начинает выглядеть как монстр.
Мне нравится удобочитаемость использования eval()
, заключенного в try/except
, но я читаю, что следует избегать eval
, как чумы.
Использование eval в Python - плохая практика?
- Почти всегда есть лучший способ сделать это - попытаться найти лучший способ без написания слишком большого количества кода:)
- Оченьопасно и небезопасно - строки жестко запрограммированы
- затрудняет отладку - верно
- медленно - код для создания отчетов, этоможет быть медленным.
.
def no_exceptions_getter(item, statement):
try:
return eval(statement)
except AttributeError, e:
log.debug(e)
return ''
for item in django_model_instances:
writer.writerow([no_exceptions_getter(item, x) for x in (
'item.foo',
'item.bar',
'item.date_created.strftime("%Y/%m/%d")',
'item.date_complete.strftime("%Y/%m/%d")',
'item.optional_foreign_key.foo',
# more items in a readable list format
)])
Я не вижу проблем с безопасностью, скоростью или отладкой.Итак, мой вопрос к вам, эксперты, таков: это нормально для использования eval?