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

理查德·格林

我将装饰器放在引号中,因为按照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支持Monica

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python装饰器向函数及其签名添加参数

来自分类Dev

是否可以在Python中使用装饰器向函数添加参数?

来自分类Dev

如何以编程方式创建python装饰器

来自分类Dev

以编程方式向编辑器eclipse插件添加文本

来自分类Dev

使用Python装饰器向方法添加方法

来自分类Dev

装饰器模式-向接口添加方法

来自分类Dev

使用装饰器向字典添加功能

来自分类Dev

装饰器模式-向接口添加方法

来自分类Dev

以编程方式向容器添加控件

来自分类Dev

以编程方式向Spark DataFrame添加几列

来自分类Dev

以编程方式快速向NavigationBar添加约束

来自分类Dev

以编程方式向元素添加属性

来自分类Dev

以编程方式向按钮添加操作

来自分类Dev

以编程方式向图像添加边框

来自分类Dev

以编程方式向UITextField添加约束

来自分类Dev

以编程方式向Spark DataFrame添加几列

来自分类Dev

无法以编程方式向图层添加要素

来自分类Dev

以编程方式向视图添加约束

来自分类Dev

以编程方式向按钮添加事件

来自分类Dev

Python函数装饰器之谜

来自分类Dev

Python装饰器函数执行

来自分类Dev

Python装饰器函数变量

来自分类Dev

Python函数装饰器之谜

来自分类Dev

如何以编程方式向控制器添加/删除模型?

来自分类Dev

如何以编程方式在预制件中向 UnityEvent 添加侦听器

来自分类Dev

以编程方式用装饰器包装所有模块的功能

来自分类Dev

烧杯:如何访问装饰器以编程方式创建的缓存?

来自分类Dev

从函数内以编程方式添加 simulink 块

来自分类Dev

如何以编程方式向 StackView 中的每个按钮添加单独的选择器/侦听器 swift 4.2