gpt4 book ai didi

exec 的 Python 变量作用域?

转载 作者:太空宇宙 更新时间:2023-11-03 17:03:57 24 4
gpt4 key购买 nike

下面是 2 个代码片段。

我想复制 f1 的效果,其中外部变量 x 由内部函数 g 修改。

但是,g 不是定义内部函数 g,而是通过执行/解释字符串来获取。

代码:

def f1():
x = []
def g():
x.append(1)
g()
print x


def f2():
x = []
strr = "def g():\n x.append(1)\n"
exec(strr)
locals()["g"]()
print x

f1 中,我得到 [1] 作为打印输出,但在 f2 中,我得到 x undefined 错误。我想知道如何在字符串定义的函数 g 中访问变量 x

跟进:

如果我想对 g 应用装饰器会发生什么?假设我有一个“超时”装饰器,如果运行时间太长,它就会导致函数失败:

def f1():
x = []
@timeout(1)
def g():
x.append(1)
g()
print x

编辑:我设法解决它如下,由于超时没有在本地定义,我必须将超时的定义从全局移动到本地,照常进行。

def f2():
x = []
strr = "@timeout(1)\ndef g():\n x.append(1)\n"
locals()['timeout'] = globals()['timeout']
exec strr in locals()
locals()["g"]()
print x

最佳答案

您需要添加exec的 namespace 。使用本地 namespace (exec strr in locals())并且它可以工作:

def f2():
x = []
strr = "def g():\n x.append(1)\n"
exec strr in locals()
locals()["g"]()
print x

>>> f2()
[1]

关于exec 的 Python 变量作用域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34757224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com