gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:36:25 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com