Я пишу некоторый код для пакета исчисления в Python. В идеале я хотел бы поддержать композиции пользовательских функций. Например, пользователь может определить функции в моем классе SingleVariable следующим образом:
f = SingleVariable('sin(x)')
g = SingleVariable('x+4')
и затем композиция
h = SingleVariable('f(g(x))')
Эти функции могут быть интегрированы, дифференцированы и т. Д. Метод, используемый для оценки функции в точке, выглядит следующим образом:
def infix_to_function(infix, variable):
def f(x):
expression = infix.replace(variable, str(x)).replace('^', '**')
return eval(expression)
return f
Это прекрасно работает для таких функций, как sin
и ln
, потому что они могут быть загружены заранее, чтобы их можно было распознать с помощью eval
. Однако это, очевидно, не работает для пользовательских функций, потому что они не существуют в пространстве имен, в котором функция фактически оценивается. Возвращаясь к примеру функций f
и g
, я хотел бы функцию, определенную как
h = SingleVariable('f(g(x))')
эквивалентно
h = SingleVariable('sin(x+4)')
Я пишу пакет в PyCharm и проверяю его, импортируя в Блокнот Jupyter. Я думал о добавлении функции в какой-то список при инициализации нового объекта SingleVariable
, но для этого нужно каким-то образом получить имя переменной, которой он назначен.
Есть ли способ добавить функции, которые я определил в блокноте Jupyter, в пространство имен пакета PyCharm, чтобы они могли быть распознаны eval
и иметь описанное поведение?