Python中__init__嵌套函数用eval触发NameError的原因咨询
问题原因解析
- 直接调用
close_game()时,click作为__init__内部的嵌套函数,能通过Python的闭包机制,访问到外层__init__作用域里定义的close_game函数,所以能正常执行。 - 使用
eval("close_game()")时,问题出在eval的作用域查找规则:eval默认会优先从当前调用它的函数(也就是click)的局部作用域里查找变量,但close_game并不在click的局部作用域中——它是__init__作用域的变量,属于闭包捕获的变量,不会被纳入click的局部作用域字典。eval不会去闭包的捕获变量集合里查找名字,所以找不到close_game,就抛出了NameError。
如果想让eval正常执行,可以手动把__init__的局部作用域传给它,修改代码如下:
eval("close_game()", locals())
内容的提问来源于stack exchange,提问作者Lesolas
相关产品推荐
相关产品推荐

