寻找有关此代码引发SyntaxError
的原因的详细说明。
def echo(x):
return x
def foo(s):
d = {}
exec(s, {}, d)
return dict((x,y) for x,y in d.items())
def bar(s):
d = {}
exec(s, {}, d)
return dict((x, echo(y)) for x,y in d.items()) # comment this to compile
s = 'a=1'
foo(s)
File "test.py", line 11
exec(s, {}, d)
SyntaxError: unqualified exec is not allowed in function 'bar' it contains a
nested function with free variables
答案 0 :(得分:7)
在Python 2.x中,exec
语句可能不会出现在具有自由变量的本地“函数”的函数中。生成器表达式隐式地为应该在每次迭代中执行的代码定义某种“函数”(或更确切地说,代码对象)。在foo()
中,此代码仅包含对x
和y
的引用,这些引用是生成器表达式中的本地名称。在bar()
中,代码还包含对自由变量echo
的引用,该引用取消bar()
使用exec
的资格。
另请注意,您的exec
语句可能应该阅读
exec s in {}, d
将它们转换为限定的 exec语句,使代码有效。
请注意,您的代码可以在Python 3.x中使用。 exec()
已经变成了一个函数,不能再修改封闭函数的局部变量,因此不必对exec
的使用进行上述限制。
答案 1 :(得分:3)
您可能尝试使用python 3.x手册编写python 2.x代码。使用Python 3.2我没有收到此错误,在Python 2.7中,exec
语法为quite different。