Python 3.5.1
Не могли бы вы взглянуть на код и картинку.
Это какой-то код Django, но вопрос касается Python.
Я получаю ошибку:
Exception Value:
name 'objects' is not defined
Exception Location:
/home/michael/workspace/pharchive/pharchive/general/templatetags/md_aux.py in get_aux_info, line 17
Строка 17 - это context = Context ({"объекты": объекты}). На картинке это видно.
Я пробовал добавить objects = [] чуть выше. Но это не помогло. В этом случае объекты действительно были пустыми. Итак, я это закомментировал.
Что ж, на скриншоте видно, что мы получим, если остановимся на точке останова. Мы видим, что объекты var действительно доступны в контексте. И в нем что-то есть.
В любом случае, я застрял с переменной областью видимости.
Я не понимаю: 1. Почему objects = [] мне не помогли. 2. Почему я получаю эту ошибку, когда объекты доступны.
Не могли бы вы дать мне удар здесь?
@register.simple_tag
def get_aux_info(master_document, aux_type):
md = MasterDocument.objects.get(pk=master_document)
template = get_template("general/md_tags.html")
#objects = []
code = "objects = md." + aux_type +"s.all()"
exec(code)
context = Context({"objects": objects})
return template.render(context)
1 ответ
Намного более простой подход, чем создание и exec
использование кода в виде строки, - это доступ к атрибуту с помощью встроенного getattr
. Это проясняет, что происходит, и полностью устраняет текущие проблемы с областью действия:
objects = getattr(md, aux_type + 's').all()
Python имеет обширную поддержку такого рода самоанализа; использование exec
(и eval
) обычно является предупреждением о том, что вы приближаетесь к чему-то не так.
Похожие вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.
exec
? Развеobjects = getattr(md, aux_type + 's').all()
не справился бы с этой работой?