Sympy报错Cannot determine truth value of relational问题咨询
问题:Sympy评估传感器表达式时抛出"Cannot determine truth value of relational"错误
问题场景
实现了一个基于Sympy的传感器表达式评估类,代码如下:
from sympy import * class Example: def __init__(self): self.data = { 'sensor1': 0, 'sensor2': 0, 'sensor3': 0 } self.registry = { '678985': {"data": [{"MID": "sensor1", "D": 50}]}, '123454': {"data": [{"MID": "sensor2", "D": 5}]}, '345609': {"data": [{"MID": "sensor3", "D": 500}]} } self.symbols = {sensor_id: symbols(sensor_id) for sensor_id in self.data.keys()} def evaluate_expression(self, expression): try: for sensor_id, sensor_info in self.registry.items(): for modality in sensor_info["data"]: m_id = modality["MID"] data = modality["D"] if m_id in self.data: self.data[m_id] = data expression = expression.replace('&&', 'and').replace('||', 'or').replace('!', 'not') sympy_expr = sympify(expression, locals=self.symbols) #parsing substitutions = {self.symbols[key]: value for key, value in self.data.items()} substituted_expr = sympy_expr.subs(substitutions) #substituting the value from the registry result = substituted_expr.simplify() # result = bool(substituted_expr) return result except Exception as e: raise ValueError(f"Failed to evaluate expression:{expression} as: {e}") a = Example() e = "sensor1 > 10 && sensor1 <= 100 && sensor2 == 2 || sensor3 < 1000 && sensor3 > 400" a.evaluate_expression(e)
当传入表达式sensor1> 10 && sensor1 <=100 && sensoe2 ==2 || sensor3 < 1000 && sensor3 > 400时,替换逻辑运算符后运行抛出Cannot determine truth value of relational错误。
错误原因
- 符号拼写错误:表达式中的
sensoe2是拼写错误,正确应为sensor2,导致Sympy无法识别该符号,代入数值时无法替换,表达式中残留未定义的符号,无法确定其真值。 - Sympy逻辑表达式未显式转布尔值:即使所有符号都正确替换,Sympy返回的是
And/Or类型的逻辑对象,而非Python原生布尔值,直接返回或隐式转换时会触发错误。
解决方法
1. 修正表达式拼写错误
将表达式中的sensoe2改为sensor2,确保所有符号都在预定义的symbols字典中。
2. 修改代码,显式转换为布尔值并检查未定义符号
更新evaluate_expression方法,添加未定义符号检查,并将Sympy表达式转为Python布尔值:
def evaluate_expression(self, expression): try: for sensor_id, sensor_info in self.registry.items(): for modality in sensor_info["data"]: m_id = modality["MID"] data = modality["D"] if m_id in self.data: self.data[m_id] = data expression = expression.replace('&&', 'and').replace('||', 'or').replace('!', 'not') sympy_expr = sympify(expression, locals=self.symbols) # 检查是否有未定义的符号 free_symbols = sympy_expr.free_symbols if free_symbols: undefined = [str(s) for s in free_symbols] raise ValueError(f"Expression contains undefined sensor IDs: {', '.join(undefined)}") substitutions = {self.symbols[key]: value for key, value in self.data.items()} substituted_expr = sympy_expr.subs(substitutions) # 显式转换为Python布尔值 result = bool(substituted_expr) return result except Exception as e: raise ValueError(f"Failed to evaluate expression:{expression} as: {e}")
说明
- 添加未定义符号检查可以提前发现拼写错误,避免后续的真值判断错误。
- 使用
bool(substituted_expr)将Sympy的逻辑表达式对象转为Python原生布尔值,解决"无法确定真值"的问题。
内容的提问来源于stack exchange,提问作者Anirudh Mohan
相关产品推荐
相关产品推荐

