以下是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
错误。我想知道如何在字符串定义的函数x
中访问变量g
。
跟进:
如果我想将装饰器应用于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
答案 0 :(得分:1)
您需要为exec
添加名称空间。使用本地名称空间(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]