Как я могу использовать оператор для создания функций в Python? - PullRequest
0 голосов
/ 11 января 2019

Довольно просто написать функцию, которая составляет две другие функции. (Для простоты предположим, что они являются одним параметром.)

def compose(f, g):
    fg = lambda x: f(g(x))
    return fg

def add1(x):
    return x + 1

def add2(x):
    return x + 2

print(compose(add1, add2)(5))  # => 8

Я бы хотел сделать композицию, используя оператор, например, (add1 . add2)(5).

Есть ли способ сделать это?

Я пробовал различные составы декораторов, но не мог заставить их работать.

def composable(f):
  """
    Nothing I tried worked. I won't clutter up the question 
    with my failed attempts.
  """

@composable
def add1(x):
    return x + 1

Спасибо.

1 Ответ

0 голосов
/ 11 января 2019

Сначала в синтаксисе Python допускается только определенное количество символов оператора. Точка "." не является допустимым оператором.

Эта страница (на самом деле эта страница относится к модулю Python operator, но соглашение об именах такое же, как у datamodel , а содержание более организовано) перечислены все доступные операторы и соответствующие методы экземпляра. Например, если вы хотите использовать «@» в качестве оператора, вы можете написать декоратор так:

import functools

class Composable:

    def __init__(self, func):
        self.func = func
        functools.update_wrapper(self, func)

    def __matmul__(self, other):
        return lambda *args, **kw: self.func(other.func(*args, **kw))

    def __call__(self, *args, **kw):
        return self.func(*args, **kw)

Для проверки:

@Composable
def add1(x):
    return x + 1

@Composable
def add2(x):
    return x + 2

print((add1 @ add2)(5))
# 8
...