Возьмем простой случай функции Python, которая вычисляет математическую функцию:
def func(x, a, b, c):
"""Return the value of the quadratic function, ax^2 + bx + c."""
return a*x**2 + b*x + c
Предположим, я хочу "прикрепить" дополнительную информацию в виде атрибута функции. Например, представление LaTeX. Я знаю, что благодаря PEP232 Я могу сделать это вне определения функции:
def func(x, a, b, c):
return a*x**2 + b*x + c
func.latex = r'$ax^2 + bx + c$'
но я хотел бы сделать это в самом определении функции. Если я напишу
def func(x, a, b, c):
func.latex = r'$ax^2 + bx + c$'
return a*x**2 + b*x + c
это, безусловно, работает, но только после того, как я впервые вызвал func
(потому что Python "ленив" при выполнении функций (?))
Является ли мой единственный способ написать класс, подлежащий вызову?
class MyFunction:
def __init__(self, func, latex):
self.func = func
self.latex = latex
def __call__(self, *args, **kwargs):
return self.func(*args, **kwargs)
func = MyFunction(lambda x,a,b,c: a*x**2+b*x+c, r'$ax^2 + bx + c$')
Или есть особенность языка, который я не замечаю, чтобы сделать это аккуратно?