2012-02-08 65 views
3

寻找此代码为什么会提高的良好解释SyntaxErrorexec的行为的任何解释?

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 
+6

这究竟应该怎么办? – 2012-02-08 14:35:34

+3

@DanielRoseman:实际的问题似乎是:为什么'foo()'是有效的Python而bar()不是?在我看来,这是一个非常有效的问题,尽管应该说清楚一点。 – 2012-02-08 14:40:49

+1

@DanielRoseman:D此代码仅供解释。真正的代码是更可接受的版本。我只是在寻找高管的解释。 – Shekhar 2012-02-08 14:42:14

回答

7

在Python 2.x中,exec报表可能不会出现具有本地 “功能” 与自由变量函数内。生成器表达式隐式地定义了应该在每次迭代中执行的代码的某种“函数”(或更确切地说,代码对象)。在foo()中,此代码仅包含对xy的引用,这些引用是生成器表达式内的本地名称。在bar()中,该代码还包含对自由变量echo的引用,因此bar()不适合使用exec

另外请注意,您的exec语句可能应该读

exec s in {}, d 

这将他们变成合格 EXEC语句,使代码有效。

请注意,您的代码可以在Python 3.x中工作。 exec()已经变成了函数,并且不能再修改封闭函数的局部变量,从而使得上述对于使用exec的限制是不必要的。

+0

完美。和python 3.x提示+1。 – Shekhar 2012-02-08 14:52:45

+1

@Shekhar:添加了一个重要的细节... – 2012-02-08 14:56:00

+0

谢谢。还注意到'exec in ..'只适用于2.x. – Shekhar 2012-02-08 15:00:32

3

您可能会尝试使用python 3.x手册编写python 2.x代码。对于Python 3.2,我不会得到这个错误,在Python 2.7中exec的语法是quite different

相关问题