2016-06-25 3 views
0

Python 3.5.1Exec и переменная область

Не могли бы вы ознакомиться с кодом и изображением.

Это код 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 ({ "объекты": объекты}). На картинке видно.

Я попытался добавить объекты = [] чуть выше. Но это не помогло. В этом случае объекты были действительно пустыми. Итак, я прокомментировал это.

Ну, на скриншоте мы можем получить то, что получим, если остановимся в точке останова. Мы видим, что объекты var действительно доступны в контексте. И в нем есть что-то.

В любом случае, я застрял с переменным объемом.

Я не понимаю: 1. Почему объекты = [] не помогли мне. 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) 

http://s019.radikal.ru/i636/1606/d5/a646b7fe8941.png

+0

Почему вы используете 'exec'? Не будет 'objects = getattr (md, aux_type + 's). All()' выполняет работу? – jonrsharpe

+0

Мне удалось справиться с самим exec. Ну, я не был в моем арсенале. Теперь это. Спасибо . Если вы сформируете его в качестве ответа, я с радостью приму его. – Michael

ответ

0

Гораздо проще подход, чем строительство и exec uting код в виде строки будет иметь доступ к атрибуту, используя встроенный в getattr функции. Это делает его более ясным, что происходит и боковых шаги текущих проблем области действия полностью:

objects = getattr(md, aux_type + 's').all() 

Python имеет обширную поддержку для такого рода самоанализ; использование execeval) обычно является предупреждением о том, что вы приближаетесь к чему-то не так.

Смежные вопросы