我有这堂课:
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
我做错了什么?
答案 0 :(得分:3)
来自文档
如果只指定了
in
之后的第一个表达式,它应该是一个字典,它将用于全局变量和局部变量。如果给出两个表达式,则它们都必须是字典,并且它们分别用于全局变量和局部变量。
基本上,in
之后的表达式应该是globals()
和locals()
,并且要在exec
语句中包含您想要在范围内的任何其他键。实质上,您使用in
来定义exec
的执行范围,如在这些命名空间中执行此语句。
从语义上讲,它等同于eval(statement, globals, locals)
在您的情况下,您可以完全省略in MyClass()
子句。
请注意,eval
/ exec
如果您不是构造语句字符串的人,则容易受到任意代码执行的影响(我假设您的代码示例是用于说明您的问题的玩具示例) ,请记住这一点。