Python:重新定义函数,使其引用自己

标签 python python-3.x function reference functional-programming

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

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

如果我现在希望 process 取代 fun 来用于将来对 fun 的所有调用,我需要执行类似的操作

# Does not work
fun = process

但这不起作用,因为这会产生循环引用问题,因为现在从 fun 的主体内调用 fun。我发现的一个解决方案是在 process 内部引用 fun 的副本,如下所示:

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

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

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

最佳答案

Python不会构建函数的副本。 copy.copy(fun) 仅返回 fun;不同之处在于,您将其保存到 fun_cp 变量中,该变量与您保存 process 的变量不同,因此当process 尝试寻找它。

我会做一些类似于你所做的事情,将原始函数保存到不同的变量,只是没有“副本”:

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

如果您想对多个函数应用相同的包装,定义一个装饰器并执行 fun =decorate(fun) 的可重用性更高,但对于一次性来说,它的工作量超出了必要的范围,并且额外的缩进。

关于Python:重新定义函数,使其引用自己,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52358965/

相关文章:

python-3.x - pytest-ordering 相对顺序不起作用?

javascript - 无法在js中打印foobar只打印foo和bar

C 隐式声明与内部函数声明不同

Python 多重继承和 super()

python - 如何在Python中找到列表中单词最多的句子?

python-3.x - 如何使用 dataframe.ewma 找到指数加权移动平均线?

JavaScript:如何使用不同的参数多次运行一个函数?

python - 使用 Python 关闭没有特定标签的 EC2 实例

python - 如何解决 TensorFlow 中的 'BiasGrad requires tensor size <= int32 max' InvalidArgumentError?

python - 如何在Python中从剪贴板复制图像?