Exec和变量scop

2024-10-03 23:30:38 发布

您现在位置: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})。在这幅画里它是可见的。你知道吗

我试着在稍微上面添加objects=[]。但那没用。在这种情况下,对象实际上是空的。所以,我把它注释掉了。你知道吗

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

你知道吗


Tags: 对象代码infomastergetobjects错误context
1条回答
网友
1楼 · 发布于 2024-10-03 23:30:38

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

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

Python对这种内省有广泛的支持;使用exec(和eval)通常是一种警告,表明您正在以错误的方式处理某些事情。你知道吗

相关问题 更多 >