我尝试在python 语句中声明两个函数。让我们称它们为f1()和f2()。
我发现当在某个函数中调用exec时,f2()对f1()是不可见的。但是,当、exec、和函数调用放在全局代码中时,就不会发生这种情况。
# Case 1: Working fine
code = """
def f1(): print "bar"
def f2(): f1()
"""
exec(code)
f2() # Prints "bar" as expected
# Case 2: Throws NameError: global name 'f1' is not defined
code = """
def f1(): print "bar"
def f2(): f1()
"""
def foo():
exec(code)
f2() # NameError
foo()
有人能给我解释一下如何避免这种NameError,让exec在函数中工作吗?
发布于 2019-04-19 22:26:59
Kevin的评论很好,而且有一些重复-使用exec是危险的,几乎总是有更好的方法。
但是,在回答第一个问题时,f1()和f2()都在全局名称空间中,因此当您调用f2()时,它可以找到f1()。在第二种情况下,它们是在foo()函数的本地空间中创建的。当调用f2()时,它找不到本地的f1()定义。
您可以使用以下命令修复此问题:
code = """
global f1
def f1(): print "bar"
def f2(): f1()
"""
def foo():
exec(code)
f2()
foo()
再说一次,这几乎肯定不是你想要解决这个问题的方式。
**编辑**发布了错误的代码版本,我一直在检查,这个版本是我想要包含的。
发布于 2019-04-19 22:27:26
在所有情况下,如果省略exec()的可选部分,则在当前范围内执行代码。
https://stackoverflow.com/questions/55763182
复制相似问题