执行和变量范围

时间:2016-06-25 07:53:52

标签: python

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”:objects})。在图片中它是可见的。

我尝试在上面添加一些对象= []。但这没有帮助。在这种情况下,对象真的是空的。所以,我评论了它。

好吧,在屏幕截图中,如果我们在断点处停下来,我们可以得到什么。我们可以看到对象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

1 个答案:

答案 0 :(得分:0)

比构建更简单的方法,exec将代码作为字符串使用内置的getattr函数来访问属性。这样可以更清楚地了解正在发生的事情,并完全解决当前的范围问题:

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

Python对这种内省有广泛的支持;使用exec(和eval)通常会警告您正在以错误的方式接近某些内容。