使用Python中的修饰器将f(x)转换为f([x])

3
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)也可以做到这一点。

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


1
不太确定,但也许反柯里化是你要寻找的?请参见以下链接: https://dev59.com/HFbUa4cB1Zd3GeqPCdYK http://jacksondunstan.com/articles/371 - naeg
也许,但在这种情况下函数仍然只接受单个参数。 - Pratik Deoghare
4个回答

4

你原始的函数执行了两个转换:

  1. 将一个三参数函数转换为接受3元组的函数
  2. 将一个3元组函数转换为接受3元组列表的函数

第一个转换
在Haskell中,有一个名为uncurry的函数,文档在这里。(还可以轻松创建2、3、4等版本)。

第二个转换
同样在Haskell中,有一组带有lift名称的函数。 这里是Haskell维基关于lifting的页面。我认为该页面比我能解释得更好:

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

装饰器只是具有特殊语法的函数,但没有规定装饰器的返回值类型,也没有数学描述。实际上,它们可以是任何可调用对象。

你的函数只是部分应用了 starmap:

from functools import partial
from itertools import starmap

def foo(f):
    return partial(starmap, f)

1
在像Haskell这样的函数式语言中,您可以通过将map函数部分应用于接受元组参数的函数来实现,从而得到一个接受参数元组列表的函数。正如Jochen Ritzel在另一个答案中指出的那样,即使在Python中,您也可以使用functools.partial相当轻松地实现这一点。
因此,我认为这个过程被称为“map的部分应用”,或者类似的东西。我不知道这种特殊情况的任何特定名称。

0
它们被简单地称为“装饰器”。它所做的可以被称为“函数链接”或“函数注释”,但我找了很多,除了这两个(链接/注释)之外,没有发现任何特殊的功能/数学名称来描述这个过程。 PEP索引> PEP 318-函数和方法的装饰器 在“装饰器”的名称上
有一些关于选择“装饰器”作为此功能名称的抱怨。主要问题是该名称与GoF书中的使用不一致[11]。“装饰器”的名称可能更多地归功于其在编译器领域的使用——语法树被遍历并进行注释。也许会出现一个更好的名称。

我认为这个问题不是关于生成器,而是关于问题中特定装饰器所执行的转换。 - user395760
我想知道在数学上装饰器被称为什么? - Pratik Deoghare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接