Преобразование f (x) в f ([x]) с использованием декоратора в python - PullRequest
3 голосов
/ 16 октября 2011
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))

Я написал это несколько лет назад.Когда вы украшаете любую функцию f(X) с помощью @foo, она становится f(list of Xs).

Как называется этот процесс?Что это?Как называется его функциональное программирование?

Это не карри.Я знаю, что простой map9(f,list of Xs) мог бы это сделать.

Как декораторы / операции декорирования называются математически?

Ответы [ 4 ]

4 голосов
/ 17 октября 2011

Есть две преобразования, выполненные для вашей исходной функции:

  1. она преобразуется из функции с тремя аргументами в функцию, которая принимает преобразование из трех кортежей
  2. из функциииз 3-х кортежей в функцию, которая принимает список из 3-х кортежей

Первое преобразование
В Haskell есть функция с именем uncurry, документированная здесь .(Это версия с двумя аргументами; 3-, 4-, ... версии также могут быть легко созданы).

Второе преобразование
Также в Haskell естьнаборы функций с lift в их именах. Вот страница в вики Haskell о подъеме.Я думаю, что страница объясняет это лучше, чем я мог:

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

Так что в вашем случае вы поднимаете функцию с работы с кортежами до работы со списком кортежей.


Примечания:

  • ОП запросил математическое имя для декораторов.Я не знаю, что это будет, но я слышал, что Haskell должен быть похож на исполняемую математику, поэтому я думаю, что терминология Haskell является хорошей отправной точкой.YMMV.
  • ОП запросил имя FP этих процессов.Опять же, я не знаю, но я предполагаю, что терминология Хаскелла приемлема.
2 голосов
/ 16 октября 2011

Декораторы просто имеют специальный синтаксис, но нет правил, которые декораторы могут возвращать, и нет математического описания. В конце концов, они могут быть любым вызываемым.

Ваша функция - только частично примененная карта звездного неба:

from functools import partial
from itertools import starmap

def foo(f):
    return partial(starmap, f)
1 голос
/ 17 октября 2011

В функциональном языке, таком как Haskell, вы бы сделали это, частично применив функцию map к функции, которая принимает кортеж аргументов, в результате чего получается функция, которая принимает список кортежей аргументов. Как отметил Йохен Ритцель в другом ответе, даже в Python вы можете реализовать это довольно тривиально, используя functools.partial.

Поэтому я предполагаю, что этот процесс называется «частичное применение карты», или что-то подобное. Я не знаю ни одного конкретного имени для этого особого случая.

0 голосов
/ 16 октября 2011

Их просто называют Decorators. То, что он делает , может называться function chaining или function annotation, но я немного осмотрелся и не нашел специального функционального / математического имени для этого процесса кроме тех 2 (цепочка / аннотация).

Индекс PEP> PEP 318 - Декораторы для функций и методов

На имя «Декоратор»

Был ряд жалоб на выбор имени «декоратор» для этой функции. Основным является то, что имя не в соответствии с его использованием в книге GoF [11]. Название «декоратор» вероятно, больше обязан его использованию в области компилятора - синтаксическое дерево гулял и комментировал. Вполне возможно, что лучшее имя может превратиться до.

...