Действительно ли это - хорошая идея иметь сахар синтаксиса к композиции функций в Python?

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

from functools import partial

class _compfunc(partial):
    def __lshift__(self, y):
        f = lambda *args, **kwargs: self.func(y(*args, **kwargs)) 
        return _compfunc(f)

    def __rshift__(self, y):
        f = lambda *args, **kwargs: y(self.func(*args, **kwargs)) 
        return _compfunc(f)

def composable(f):
    return _compfunc(f)

@composable    
def f1(x):
    return x * 2

@composable
def f2(x):
    return  x + 3

@composable
def f3(x):
    return (-1) * x

@composable
def f4(a):
    return a + [0]

print (f1 >> f2 >> f3)(3) #-9
print (f4 >> f1)([1, 2]) #[1, 2, 0, 1, 2, 0]
print (f4 << f1)([1, 2]) #[1, 2, 1, 2, 0]

Проблема: без поддержки языка мы не можем использовать этот синтаксис на встроенных функциях или лямбдах как это:

((lambda x: x + 3) >> abs)(2)

Вопрос: действительно ли это полезно? Он стоящий, чтобы обсуждения в почтовом списке Python?

18
задан si14 17 February 2010 в 15:00
поделиться

2 ответа

ИМХО: нет, это не так. Хотя мне нравится Haskell, похоже, это не подходит для Python. Вместо (f1 >> f2 >> f3) вы можете сделать compose (f1, f2, f3) , и это решит вашу проблему - вы можете использовать его с любыми вызываемыми без каких-либо перегрузка, украшение или изменение ядра (кто-то из IIRC уже предлагал functools.compose хотя бы один раз; я не могу найти его прямо сейчас).

Кроме того, определение языка сейчас заморожено, поэтому они, вероятно, все равно отклонят такое изменение - см. PEP 3003 .

8
ответ дан 30 November 2019 в 08:52
поделиться

Композиция функций - не самая распространенная операция в Python, особенно в том смысле, что оператор композиции явно необходим. Если что-то было добавлено, я не уверен, что мне нравится выбор << и >> для Python, которые не так очевидны для меня, как кажутся вам.

Я подозреваю, что многим людям будет удобнее использовать функцию compose , порядок которой не вызывает проблем: compose (f, g) (x) будет означать f (g (x)) , тот же порядок, что и o в математике и . в Haskell. Python пытается избегать использования знаков препинания, когда подходят английские слова, особенно когда специальные символы не имеют широко известного значения. (Исключения сделаны для вещей, которые кажутся слишком полезными, чтобы пропустить их, например @ для декораторов (с большим сомнением) и * и ** для аргументов функции.)

Если вы решите отправить это в python-ideas, вы Вероятно, вы выиграете гораздо больше людей, если найдете в stdlib или популярных библиотеках Python экземпляры, в которых композиция функций могла бы сделать код более понятным, простым в написании, поддерживаемым или эффективным.

6
ответ дан 30 November 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: