首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么在函数内部调用exec()时会有不同的工作方式,以及如何避免这种情况

为什么在函数内部调用exec()时会有不同的工作方式,以及如何避免这种情况
EN

Stack Overflow用户
提问于 2019-04-19 22:10:32
回答 2查看 89关注 0票数 4

我尝试在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在函数中工作吗?

EN

回答 2

Stack Overflow用户

发布于 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()

再说一次,这几乎肯定不是你想要解决这个问题的方式。

**编辑**发布了错误的代码版本,我一直在检查,这个版本是我想要包含的。

票数 2
EN

Stack Overflow用户

发布于 2019-04-19 22:27:26

在所有情况下,如果省略exec()的可选部分,则在当前范围内执行代码。

https://docs.python.org/3.5/library/functions.html#exec

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55763182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档