exec的Python变量范围?

时间:2016-01-13 02:07:06

标签: python dynamic exec

以下是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

1 个答案:

答案 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]