gpt4 book ai didi

python - 以编程方式将 "decorators"添加到 python 函数

转载 作者:行者123 更新时间:2023-12-01 23:22:31 24 4
gpt4 key购买 nike

我将装饰器放在引号中,因为按照 python 标准,它们不是严格的装饰器,尽管它们需要像一个一样。

假设我有 3 个装饰器,f、g、h。

def f(x):
return x+1

def g(x):
return x+2

def h(x):
return x * 3

和我“真正的”fn

def orig_fn(z):
return z + 100

如何修改 orig_fn 以便在运行时链接 f,g,h 的不同组合?

如果我使用 f,g,h 中的多个,那么它们都应该被应用 - 即 orig_fn 可能返回 f(g(orig_fn(x)) 。

我已经尝试过类似的东西(我正在做的真正的事情是修改类函数 - 因此包含 MethodType)。 fn_chain 类似于 [f,g],我正在尝试通用地解决这个问题 - current_fn 是类中的原始函数。

 if fn_chain:
print "-> creating chain"
for fn in fn_chain:
def modified_fn(self,*args,**kwargs):
return fn(self, current_fn, *args,**kwargs)
#current_fn = modified_fn

setattr(cls,f_name,types.MethodType(modified_fn,cls))

最佳答案

构建一个函数来组合其他函数非常简单:

def compose(*funcs):
# If we compose(f, g), we want to apply g first.
funcs = funcs[::-1]

def composition(val):
for func in funcs:
val = func(val)
return val

return composition

然后您可以调用 compose(f, g, orig_fn) 来获得执行 f(g(orig_fn(x))) 的函数。

关于python - 以编程方式将 "decorators"添加到 python 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34073067/

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