【问题标题】:Converting f(x) into f([x]) using decorator in python在 python 中使用装饰器将 f(x) 转换为 f([x])
【发布时间】:2011-10-20 01:33:48
【问题描述】:
class foo(object):
        def __init__(self,f):
                self.f = f
        def __call__(self,args_list):
                def wrapped_f(args_list):
                        return [self.f(*args) for args in args_list]
                return wrapped_f(args_list)

if __name__=='__main__':

        class abc(object):
                @foo
                def f(a,b,c):
                        return a+b+c

        a = range(5)
        b = range(5)
        c = range(5)
        data = list(zip(a,b,c))
        print(abc.f(data))

这是我几年前写的。当您用@foo 装饰任何功能f(X) 时,它变为 f(list of Xs)

这个过程叫什么?它是什么?它的函数式编程名称是什么?

它不是咖喱。我知道简单的map9(f,list of Xs) 可以做到。

什么是装饰器/装饰操作在数学上称为?

【问题讨论】:

标签: python functional-programming decorator lifting


【解决方案1】:

对您的原始函数执行了两种转换:

  1. 它从三个参数的函数转换为采用三元组的函数
  2. 从 3 元组函数转换为采用 3 元组列表的函数

第一次转型
在 Haskell 中,有一个名为 uncurry 的函数,记录在 here。 (这是一个双参数版本;也可以轻松创建 3-、4-、... 版本。

第二次转型
同样在 Haskell 中,有一组函数名称中带有 liftHere's Haskell wiki 上关于提升的页面。我认为该页面比我能更好地解释它:

Lifting is a concept which allows you to transform a function into a   
corresponding function within another (usually more general) setting.

因此,在您的情况下,您将函数从对元组进行操作提升到对元组列表进行操作。


注意事项:

  • OP 要求提供装饰器的数学名称。我不知道那会是什么,但我听说 Haskell 应该像可执行数学,所以我认为 Haskell 的术语是一个很好的起点。 YMMV。
  • OP 要求提供这些进程的 FP 名称。同样,我不知道,但我认为 Haskell 的术语是可以接受的。

【讨论】:

    【解决方案2】:

    装饰器只是有特殊的语法,但装饰器可以返回什么没有规则,也没有数学描述。毕竟它们可以是任何可调用的。

    您的函数只是部分应用的星图:

    from functools import partial
    from itertools import starmap
    
    def foo(f):
        return partial(starmap, f)
    

    【讨论】:

      【解决方案3】:

      在像 Haskell 这样的函数式语言中,您可以通过将 map 函数部分应用于接受参数元组的函数,从而生成一个接受参数元组列表的函数。正如 Jochen Ritzel 在另一个答案中指出的那样,即使在 Python 中,您也可以使用 functools.partial 轻松实现这一点。

      因此我认为这个过程被称为“地图的部分应用”,或者类似的东西。我不知道这种特殊情况的任何特定名称。

      【讨论】:

        【解决方案4】:

        它们被简单地称为Decorators。它的作用可以称为function chainingfunction annotation,但我环顾四周并没有发现特殊的函数/数学名称除了那些 2(链接/注释)之外的这个过程。

        PEP Index > PEP 318 -- Decorators for Functions and Methods

        关于“装饰者”这个名字

        有许多关于名称选择的投诉 此功能的“装饰器”。最主要的是名字不 与 GoF 书 [11] 中的用法一致。名称“装饰者” 可能更多归功于它在编译器领域的使用——语法树是 走路和注释。一个更好的名字很可能会变成 起来。

        【讨论】:

        • 我认为这个问题不是关于生成器,而是关于问题中特定装饰器执行的转换。
        • 我想知道数学上叫什么装饰器?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-18
        • 1970-01-01
        • 2021-07-18
        • 2021-03-15
        • 2017-02-09
        • 1970-01-01
        相关资源
        最近更新 更多