寻找有关此代码引发的原因的详细解释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)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
在Python 2.x中,exec语句可能不会出现在具有自由变量的本地"函数"的函数中.生成器表达式隐式地为应该在每次迭代中执行的代码定义某种"函数"(或更确切地说,代码对象).在foo(),此代码仅包含对x和的引用y,它们是生成器表达式中的本地名称.在bar(),代码中还包含对自由变量的引用,该引用echo取消bar()了对使用的限制exec.
另请注意,您的exec陈述可能应该阅读
exec s in {}, d
Run Code Online (Sandbox Code Playgroud)
这将把它们变成合格的 exec语句,使代码有效.
请注意,您的代码可以在Python 3.x中使用. exec()已经变成了一个函数,并且不能再修改封闭函数的局部变量,从而对上面的使用做了exec不必要的限制.
| 归档时间: |
|
| 查看次数: |
3202 次 |
| 最近记录: |