You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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错误。

错误原因

  1. 符号拼写错误:表达式中的sensoe2是拼写错误,正确应为sensor2,导致Sympy无法识别该符号,代入数值时无法替换,表达式中残留未定义的符号,无法确定其真值。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:55:04