当前位置:  开发笔记 > 编程语言 > 正文

以编程方式向Python函数添加“装饰器”

如何解决《以编程方式向Python函数添加“装饰器”》经验,为你挑选了1个好方法。

我把装饰器用引号引起来,因为按照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)))



1> user2357112 ..:

构建一个包含其他功能的功能非常简单:

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)))

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有