Самое смешное, что это вполне возможно.Несколько дней назад я создал проект для таких вещей.
Вот он: FuncBuilder
К настоящему времени вы можете определять только переменные, но вы можете использовать мой метаклассс помощью некоторых других функций построить класс по вашему желанию.
Проблемы:
- Это медленно
- Это действительно медленно
- Вы думаете, что хотите этого, но правильное описание функций - это то, что они хотели описать.
Вы должны использовать свой первый код.
Просто как подтверждение концепции:
from funcbuilder import OperatorMachinery
class FuncOperations(metaclass=OperatorMachinery):
def __init__(self, function):
self.func = function
def __call__(self, *args, **kwargs):
return self.func(*args, **kwargs)
def func(self, *n, oper=None):
if not n:
return type(self)(lambda x: oper(self.func(x)))
return type(self)(lambda x: oper(self.func(x), n[0](x)))
FuncOperations.apply_operators([func, func])
Теперь вы можете кодировать так:
@FuncOperations
def f(x):
return x + 1
@FuncOperations
def g(x):
return x + 2
И желаемое поведение:
>>> z = f * g
>>> z(3)
20
Я добавил лучшую версию этогопроект FuncBuilder .Он работает с любой операцией между объектом FuncOperation
и другим вызываемым объектом.Также работает на одинарных операциях.: D
Вы можете играть с ним, чтобы сделать такие функции, как:
z = -f + g * h