假设我有一些函数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/