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



我将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(。

有更干净的方法吗?

在SymPy中,zeta表示黎曼ζ函数,因此这就是字符串的解释方式。但是zeta + 1不是一个有效的SymPy表达式,因为不能向函数添加数字(zeta(x) + 1本来是可以接受的。(

解决方案:使用local_dict参数告诉SymPy zeta在这里的真正含义。不要惹global_dict;无论如何,本地优先于全局。

from sympy import symbols
zeta = symbols('zeta')
parse_expr('zeta + 1', local_dict={'zeta': zeta})

最新更新