Перегрузка умножения матриц как композиция функцийPython

Программы на Python
Ответить
Anonymous
 Перегрузка умножения матриц как композиция функций

Сообщение Anonymous »

Я немного поигрался и захотел попробовать перегрузить оператор матричного умножения для композиции функций.
Вместо написания: Мне бы хотелось (f @ g) вернуть новую функцию как композицию f и g.
Я прекрасно понимаю, что это самое вероятно, это не очень хорошая идея для производственного кода, но я хочу понять, что происходит.
Следующий код должен работать, но
< 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'
Думаю, что-то не так с тем, как я исправляю метод __matmul__, который неправильно принимается для перегрузки оператора?

Подробнее здесь: https://stackoverflow.com/questions/791 ... omposition
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»