变量没有在exec之后定义('variable = value')

时间:2016-02-11 10:26:52

标签: python django python-3.x

我非常坚持这一个^^。我有一个视图,其中我使用名为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()无法正常工作。

1 个答案:

答案 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