Python 变量未在exec后定义(';变量=值';)
我被这件事缠住了。我有一个视图,其中使用了名为modifier_dico的函数,该函数位于名为fonctions.py的文件中。修饰符_dico的前两行如下所示:Python 变量未在exec后定义(';变量=值';),python,django,python-3.x,Python,Django,Python 3.x,我被这件事缠住了。我有一个视图,其中使用了名为modifier_dico的函数,该函数位于名为fonctions.py的文件中。修饰符_dico的前两行如下所示: def modifier_dico(tweet,nom_dico, dico_cat): exec('dico= {}') 我的观点是: def classer_tweet(request): modifier_dico(tweet.text,"dico_status.txt", {}) 当我尝试访问此视图时,我在
def modifier_dico(tweet,nom_dico, dico_cat):
exec('dico= {}')
我的观点是:
def classer_tweet(request):
modifier_dico(tweet.text,"dico_status.txt", {})
当我尝试访问此视图时,我在Django的debug页面上得到名称'dico'未定义
但是当我看时,我有一个变量dico,它的值是{}
看起来exec()
没有像我预期的那样工作。您没有指定要在哪个命名空间中设置名称,因此名称是在函数的作用域中设置的。modifier\u dico()
函数,而不是classer\u tweet()
。从:
在所有情况下,如果省略了可选部分,则代码将在当前范围内执行
您必须传入另一个字典,才能将名称设置为第二个参数:
exec('dico = {}', namespace)
不能使用exec()
在函数中设置局部变量,除非已在给定函数中指定了名称。这是一个硬限制,因为优化了如何访问函数中的本地名称空间。来自同一文件:
注意:默认局部变量的作用与下面的函数locals()
所述相同:不应尝试修改默认局部变量字典。如果需要在函数exec()
返回后查看代码对局部变量的影响,请传递一个显式局部变量字典
从链接:
注意:本词典的内容不得修改;更改可能不会影响解释器使用的本地变量和自由变量的值
因此,不能使用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
>>def no_local_foo():
... exec('foo=“bar”')
... 打印(局部变量())
... 福
...
>>>没有本地的
{'foo':'bar'}
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第4行,无本地文件
NameError:未定义名称“foo”