为什么exec不会定义我的变量?

时间:2014-04-29 03:09:11

标签: python python-2.7

我有这堂课:

class MyClass:
    def __init__(self):
        self.execute()
    def execute(self):
        exec('self.myVar = 1') in MyClass()

当我试着打电话时

exec('self.myVar = 1') in MyClass()

我明白了:

TypeError: exec: arg 2 must be a dictionary or None

我做错了什么?

1 个答案:

答案 0 :(得分:3)

来自文档

  

如果只指定了in之后的第一个表达式,它应该是一个字典,它将用于全局变量和局部变量。如果给出两个表达式,则它们都必须是字典,并且它们分别用于全局变量和局部变量。

基本上,in之后的表达式应该是globals()locals(),并且要在exec语句中包含您想要在范围内的任何其他键。实质上,您使用in来定义exec的执行范围,如在这些命名空间中执行此语句

从语义上讲,它等同于eval(statement, globals, locals)

在您的情况下,您可以完全省略in MyClass()子句。

请注意,eval / exec如果您不是构造语句字符串的人,则容易受到任意代码执行的影响(我假设您的代码示例是用于说明您的问题的玩具示例) ,请记住这一点。