我非常坚持这一个^^。我有一个视图,其中我使用名为modifier_dico的函数,该函数位于名为fonctions.py的文件中。 modifier_dico的第2行如下:
def modifier_dico(tweet,nom_dico, dico_cat):
exec('dico= {}')
我的观点如下:
def classer_tweet(request):
modifier_dico(tweet.text,"dico_status.txt", {})
当我尝试访问此视图时,我在Django的调试页面上得到name 'dico' is not defined
。
但是当我查看the local vars of modifier_dico in the traceback时,我的变量 dico 的值为 {}
看起来exec()
无法正常工作。
答案 0 :(得分:4)
您没有指定要设置名称的命名空间,因此名称是在fonctions.modifier_dico()
函数的范围内设置的,而不是classer_tweet()
。来自exec()
function documentation:
在所有情况下,如果省略了可选部分,则代码将在当前范围内执行。
您必须传入另一个字典才能将要设置的名称作为第二个参数:
exec('dico = {}', namespace)
您不能使用exec()
在函数中设置本地,除非在给定函数中已经分配了。由于优化了如何访问函数中的本地命名空间,因此这是一个严格的限制。来自相同的文档:
注意:默认 locals 的行为与下面的函数
locals()
相同:对默认 locals 字典的修改不应该是尝试。如果您需要在函数exec()
返回后查看代码对 locals 的影响,请传递显式的 locals 字典。
来自链接的locals()
function documentation:
注意:不应修改此词典的内容;更改可能不会影响解释器使用的本地和自由变量的值。
因此,您无法使用exec()
在视图函数中设置其他局部变量。你真的应该使用字典来处理任意名称空间。
您可能仍会看到locals()
字典中的更改,但由于该函数会返回反映实际本地人在一个方向上的反射,因此该函数本身实际上不可用。换句话说,函数的实际本地复制到locals()
返回的字典中,不会复制该字典的添加内容:
>>> def no_local_foo():
... exec('foo = "bar"')
... print(locals())
... foo
...
>>> no_local_foo()
{'foo': 'bar'}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in no_local_foo
NameError: name 'foo' is not defined