我正在用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 Notebook对其进行测试。我考虑过在初始化新的SingleVariable
对象时将函数添加到某种列表中,但这需要以某种方式获取要分配给它的变量的名称。
是否可以将我在Jupyter Notebook中定义的功能添加到PyCharm程序包的名称空间中,以便eval
可以识别它们并描述其行为?
答案 0 :(得分:0)
您可以尝试将globals()
传递给e eval(expression, globals())
。我相信Jupyter Notebooks会将所有已定义的功能放入全局名称空间。
但是,使用exec()和globals()会引起很多问题-因此请确保您真正了解自己在做什么。
这会有些复杂,但是如果您打算将其构建得非常通用,则可能需要查看像http://www.dabeaz.com/ply/example.html这样的词法库,它可以帮助您确保输入的内容有效并已被解析正确。
作为您可能遇到的问题类型的一个小示例-我认为基于示例代码:
f = SingleVariable('sin(s)')
可能无法按您期望的方式工作...