首页 > 解决方案 > Python:重新定义函数,使其引用自己的自身

问题描述

假设我有一些功能fun,其实际代码体超出了我的控制范围。我可以创建一个新函数,在调用之前进行一些预处理fun,即

def process(x):
    x += 1
    return fun(x)

如果我现在想process代替fun所有未来的电话fun,我需要做类似的事情

# Does not work
fun = process

然而,这不起作用,因为这会产生一个循环引用问题,就像现在funfun. 我发现的一个解决方案是引用funinside of的副本process,如下所示:

# Works
import copy
fun_cp = copy.copy(fun)
def process(x):
    x += 1
    return fun_cp(x)
fun = process

但是这个解决方案让我很困扰,因为我真的不知道 Python 如何构造函数的副本。我想我的问题与使用继承和super函数扩展类方法的问题相同,但这里我没有类。

我怎样才能正确地做到这一点?我认为这是一项足够普遍的任务,应该存在一些或多或少惯用的解决方案,但我没有找到它。

标签: pythonpython-3.xfunctionreferencefunctional-programming

解决方案


这看起来像是 python 闭包的一个用例。有一个函数返回你的函数。

def getprocess(f):
    def process(x):
        x += 1
        return f(x)  # f is referenced from the enclosing scope.

    return process

myprocess = getprocess(fun) 
myprocess = getprocess(myprocess) 

推荐阅读