Python闭包和替换周围的范围

Rev*_*nzo 2 python closures

我知道在使用Groovy闭包时,我可以更改闭包,delegate因此可以在外部定义闭包内的函数调用.

我可以在Python中做类似的事情吗?

具体来说,如果您采用以下代码:

def configure():
  build()

def wrap(function):
  def build():
    print 'build'

  function()

wrap(configure)
Run Code Online (Sandbox Code Playgroud)

我想要打印'build'(只进行更改wrap()).

一些说明:

我不想传递函数,configure()因为可能有很多函数可以被调用configure().

我也不想全局定义它们,因为可能会有大量可以调用的函数,configure()我不想污染全局命名空间.

Rev*_*nzo 5

是否是一个很好的方法是有争议的,但这是一个不修改全局命名空间的解决方案.

def configure():
  build()

def wrap(f):
  import new
  def build():
    print 'build'

  new.function(f.func_code, locals(), f.func_name, f.func_defaults, f.func_closure)()

wrap(configure)
Run Code Online (Sandbox Code Playgroud)

我在如何修改python中的本地命名空间中找到了它