我正在使用 Python numexpr 模块来评估用户输入(数字或公式)。数字可能很复杂,只要我避免使用科学记数法,这就有效:
>>> import numexpr as ne
>>> ne.evaluate("1000000000000j")
array(0.+1.e+12j)
>>> ne.evaluate("0.+1.e+12j")
ValueError: Expression 0.+1.e+12j has forbidden control characters.
我尝试用科学计数法计算具有一些变化的复数,并期望 numexpr 处理这些数字。然而,我总是遇到上面描述的 ValueError。
这是一个错误还是我做错了什么?
尝试计算表达式
numexpr
时使用 "0.+1.e+12j"
看到的错误是由于 numexpr
解析复数的方式与标准 Python 不同。它不接受 "0.+1.e+12j"
为有效,因为它更喜欢显式定义数字和逻辑单元之间的运算的表达式。
但是,如果将表达式重新修改为
"1.e+12 * 1j"
,numexpr
会正确处理它,因为此选项通过乘法运算显式分离标量和虚数单位,numexpr
可以有效处理:
>>> ne.evaluate("1.e+12 * 1j")
array(0.+1.e+12j)
这是一个错误,正如 @jason 评论的那样:
https://github.com/pydata/numexpr/issues/442#issuecomment-1754515334
https://github.com/pandas-dev/pandas/issues/54449
https://github.com/pandas-dev/pandas/issues/54542
使用
ast
代替
import ast
ast.literal_eval("0.+1.e+12j")
numexpr
使用 eval()
,这是一个很大的安全问题。