我把装饰器用引号引起来,因为按照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))
user2357112 .. 5
构建一个包含其他功能的功能非常简单:
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)))
。
构建一个包含其他功能的功能非常简单:
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)))
。