Вместо написания:
Код: Выделить всё
f(g(x))Я прекрасно понимаю, что это самое вероятно, это не очень хорошая идея для производственного кода, но я хочу понять, что происходит.
Следующий код должен работать, но
< pre class="lang-py Prettyprint-override">
Код: Выделить всё
import types
def compose(f, g):
return lambda *args, **kwargs: f(g(*args, **kwargs))
def make_composable(f):
f.__matmul__ = types.MethodType(compose, f)
return f
@make_composable
def f(n):
return 2 * n
@make_composable
def g(n):
return 3 * n
assert (f.__matmul__(g)) (2) == f(g(2))
assert (f @ g) (2) == f(g(2))
Код: Выделить всё
TypeError: unsupported operand type(s) for @: 'function' and 'function'
Подробнее здесь: https://stackoverflow.com/questions/791 ... omposition
Мобильная версия