【问题标题】:Is there any way to make user-defined functions appear in a totally different namespace?有没有办法让用户定义的函数出现在完全不同的命名空间中?
【发布时间】:2019-05-03 01:44:24
【问题描述】:

我正在为 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 识别并具有描述的行为?

【问题讨论】:

  • 您考虑过globals()locals() 变量吗?他们可能会在这里为您提供帮助。

标签: python namespaces pycharm jupyter-notebook


【解决方案1】:

您可以尝试像eval(expression, globals()) 一样将globals() 传递给eval。我相信 Jupyter Notebooks 会将任何已定义的函数放入全局命名空间中。

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

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

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

f = SingleVariable('sin(s)')

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

【讨论】:

    猜你喜欢
    • 2020-02-23
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多