我一直在使用SymPy
函数parse_expr()
来评估引用变量的字符串表达式。现在,我在解析包含具有"nan"
值的变量的表达式时遇到了问题。我试图通过将{"nan": 0}
之类的东西作为local_dict
或global_dict
参数传递来将"nan"
值替换为0
,但找不到使其工作的方法。
如何解析和计算引用具有"nan"
值的变量的表达式?我可以通过将参数传递给"nan"
映射到特定值parse_expr()
吗?
>>> from sympy.parsing.sympy_parser import parse_expr
>>> data = {'result': {'a': 'nan', 'b': 123}}
>>> expr = "result['b'] + 123" # <-- This works well.
>>> parse_expr(expr, data)
>>> 246
>>> expr = "result['a'] + 123" # <-- This doesn't work.
>>> parse_expr(expr, data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File ".../sympy-1.2rc1-py3.6.egg/sympy/parsing/sympy_parser.py", line 950, in parse_expr
return eval_expr(code, local_dict, global_dict)
File ".../sympy-1.2rc1-py3.6.egg/sympy/parsing/sympy_parser.py", line 863, in eval_expr
code, global_dict, local_dict) # take local objects in preference
File "<string>", line 1, in <module>
TypeError: must be str, not Integer
实际的nan
值由 SymPy 理解,并得到适当的处理:
from math import nan
data = {'result': {'a': nan, 'b': 123}}
expr = "result['a'] + 123"
parse_expr(expr, local_dict=data) # returns nan
结果是正确的:nan 加上任何数字都是 nan。
但是你的字典包含一个字符串'nan'
它没有特殊的含义:它也可以'foo'
。这只是坏数据,所以你应该在将数据传递给 SymPy 之前修复数据:
data = {'result': {'a': 'nan', 'b': 123}}
for key in data['result']:
if data['result'][key] == 'nan':
data['result'][key] = 0
现在parse_expr(expr, local_dict=data)
返回 123。
Sympy 应该被构建为处理nan
s。问题是它不会自动将'nan'
转换为浮点nan
。例如,以下操作也会失败:
>>> from sympy.parsing.sympy_parser import parse_expr
>>> data = {'result': {'a': '321', 'b': 123}}
>>> expr = "result['b'] + 123" # <-- This works well.
>>> parse_expr(expr, data)
246
>>> expr = "result['a'] + 123" # <-- This doesn't work.
>>> parse_expr(expr, data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/jonathan/anaconda3/lib/python3.7/site-packages/sympy/parsing/sympy_parser.py", line 950, in parse_expr
return eval_expr(code, local_dict, global_dict)
File "/home/jonathan/anaconda3/lib/python3.7/site-packages/sympy/parsing/sympy_parser.py", line 863, in eval_expr
code, global_dict, local_dict) # take local objects in preference
File "<string>", line 1, in <module>
TypeError: can only concatenate str (not "Integer") to str
使用浮点nan
而不是字符串可以:
>>> from sympy.parsing.sympy_parser import parse_expr
>>> from math import nan
>>> data = {'result': {'a': nan, 'b': 123}}
>>> expr = "result['b'] + 123" # <-- This works well.
>>> parse_expr(expr, data)
246
>>> expr = "result['a'] + 123" # <-- This also works.
>>> parse_expr(expr, data)
nan