exec的Python变量范围?
下面是两段代码片段 我想复制f1的效果,其中外部变量x由内部函数g修改 但是,不是定义内部函数g,而是通过执行/解释字符串来获得g 代码: 在f1中,我得到[1]作为打印输出,但在f2中,我得到x未定义错误。我想知道如何在字符串定义的函数g中访问变量x 后续行动: 如果我想给g应用一个装饰器,会发生什么?假设我有一个超时修饰符,如果函数运行时间过长,该修饰符会导致函数失败:exec的Python变量范围?,python,dynamic,exec,Python,Dynamic,Exec,下面是两段代码片段 我想复制f1的效果,其中外部变量x由内部函数g修改 但是,不是定义内部函数g,而是通过执行/解释字符串来获得g 代码: 在f1中,我得到[1]作为打印输出,但在f2中,我得到x未定义错误。我想知道如何在字符串定义的函数g中访问变量x 后续行动: 如果我想给g应用一个装饰器,会发生什么?假设我有一个超时修饰符,如果函数运行时间过长,该修饰符会导致函数失败: def f1(): x = [] @timeout(1) def g(): x.append(1)
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添加名称空间。在locals中使用本地名称空间exec strr,它可以工作:
def f2():
x = []
strr = "def g():\n x.append(1)\n"
exec strr in locals()
locals()["g"]()
print x
>>> f2()
[1]
def f2():
x = []
strr = "def g():\n x.append(1)\n"
exec strr in locals()
locals()["g"]()
print x
>>> f2()
[1]