Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 变量未在exec后定义(';变量=值';)_Python_Django_Python 3.x - Fatal编程技术网

Python 变量未在exec后定义(';变量=值';)

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", {}) 当我尝试访问此视图时,我在

我被这件事缠住了。我有一个视图,其中使用了名为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", {})
当我尝试访问此视图时,我在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”