对exec行为的解释?
想找个简单明了的解释,为什么这段代码会出现 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
2 个回答
3
你可能是在用 Python 3.x 的手册来写 Python 2.x 的代码。使用 Python 3.2 的时候我没有遇到这个错误,而在 Python 2.7 中,exec
的写法是完全不同的。
7
在Python 2.x中,exec
语句不能出现在有局部“函数”的函数里,这些局部“函数”有自由变量。生成器表达式会隐式地定义某种“函数”(更准确地说,是一个代码对象),这个代码会在每次迭代时执行。在foo()
中,这段代码只包含对x
和y
的引用,它们是生成器表达式内部的局部变量。而在bar()
中,代码还引用了自由变量echo
,这就使得bar()
不能使用exec
。
另外,你的exec
语句可能应该写成
exec s in {}, d
这样会把它们变成合格的exec语句,使得代码有效。
需要注意的是,在Python 3.x中,你的代码是可以正常工作的。exec()
已经变成了一个函数,不能再修改外部函数的局部变量,因此上面提到的关于exec
使用的限制就不再必要了。