有什么方法可以使用户定义的函数出现在完全不同的名称空间中?

时间:2019-05-03 01:44:24

标签: python namespaces pycharm jupyter-notebook

我正在用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

这对于sinln之类的函数很好,因为它们可以提前加载以便被eval识别。但是,这显然不适用于用户定义的函数,因为它们在实际评估函数的名称空间中不存在。返回示例函数fg,我希望将函数定义为

h = SingleVariable('f(g(x))')

等同于

h = SingleVariable('sin(x+4)')

我正在用PyCharm编写程序包,并通过导入Jupyter Notebook对其进行测试。我考虑过在初始化新的SingleVariable对象时将函数添加到某种列表中,但这需要以某种方式获取要分配给它的变量的名称。

是否可以将我在Jupyter Notebook中定义的功能添加到PyCharm程序包的名称空间中,以便eval可以识别它们并描述其行为?

1 个答案:

答案 0 :(得分:0)

您可以尝试将globals()传递给e eval(expression, globals())。我相信Jupyter Notebooks会将所有已定义的功能放入全局名称空间。

但是,使用exec()和globals()会引起很多问题-因此请确保您真正了解自己在做什么。

这会有些复杂,但是如果您打算将其构建得非常通用,则可能需要查看像http://www.dabeaz.com/ply/example.html这样的词法库,它可以帮助您确保输入的内容有效并已被解析正确。

作为您可能遇到的问题类型的一个小示例-我认为基于示例代码:

f = SingleVariable('sin(s)')

可能无法按您期望的方式工作...