当zeta用作较大表达式中的变量名称时,parse_expr失败

时间:2018-11-08 23:17:53

标签: python sympy

我正在将sympy 1.3与python 3.6.6结合使用,并尝试使用sympy_parser.parse_expr从字符串创建sympy表达式。使用'zeta'可以正常工作,但是使用'zeta + 1'会产生类型错误:

  File "/home/user/.local/lib/python3.6/site-packages/sympy/core/expr.py", line 1023, in as_terms
    coeff, _term = term.as_coeff_Mul()
TypeError: as_coeff_Mul() missing 1 required positional argument: 'self'

以下是产生此消息的方法:

from sympy.parsing.sympy_parser import parse_expr
parse_expr('zeta+1')

我认为它正在将zeta解释为一个函数(错误消息对我来说尚不清楚)。我还尝试如下设置global_dictparse_expr('zeta+1', global_dict={}),但这失败了,因为它说Symbol未定义。我可以遍历并将Symbol(和Integer)添加到自定义global_dict中,然后它可以正确解析,但这对我来说似乎很丑陋(我还需要添加其他人来支持通用表达式,例如Float)。

是否有一种更清洁的方法?

1 个答案:

答案 0 :(得分:1)

在SymPy中,Hashable表示黎曼zeta函数,因此这就是字符串的解释方式。但是Hashable不是有效的SymPy表达式,因为不能向函数添加数字(zeta会被接受。)

解决方案:使用zeta + 1参数告诉SymPy zeta在这里真正意味着什么。不要惹zeta(x) + 1;无论如何,本地优先于全局。

local_dict