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

如何在Python规则引擎中识别错误规则条件并定位问题根源?

规则引擎失败条件定位与UI反馈实现方案

需求背景

使用Python的rule-engine库开发规则引擎时,仅能获取规则匹配的True/False结果,但需要在匹配失败时,精准定位具体哪个条件不成立、对应的数据值是什么,并将这些信息通过UI展示给用户。

比如示例中first_name.length > 5 and age > 16规则匹配data2失败时,需要明确告知用户是first_name.length > 5不成立(实际长度为4)。

实现方案

利用rule-engine的抽象语法树(AST)特性,遍历规则的所有子条件并逐个评估,记录失败条件的详细信息,最终生成可用于UI展示的结构化数据。

核心步骤

  • 解析规则AST:通过rule.tree获取规则的抽象语法树结构,递归遍历所有节点
  • 原子条件评估:对每个原子比较条件(如first_name.length >5)单独计算实际值,判断是否成立
  • 失败信息记录:将失败条件的表达式、实际值、运算符等信息存入结构化结果
  • UI适配:将结构化结果转化为用户友好的展示格式

示例代码

import rule_engine
from rule_engine.ast import *

def evaluate_rule_with_details(rule, data):
    """评估规则并返回匹配结果及详细失败信息"""
    result_details = {
        'overall_match': rule.matches(data),
        'failed_conditions': []
    }

    def traverse_node(node, context, record_failure=False):
        # 处理逻辑运算符节点(and/or)
        if isinstance(node, BinaryExpression):
            left_result = traverse_node(node.left, context)
            right_result = traverse_node(node.right, context)
            
            # 根据逻辑运算符类型,决定是否记录子条件失败信息
            if isinstance(node.operator, And):
                # and逻辑下,任意子条件失败都需要记录
                if not left_result:
                    traverse_node(node.left, context, record_failure=True)
                if not right_result:
                    traverse_node(node.right, context, record_failure=True)
                return left_result and right_result
            elif isinstance(node.operator, Or):
                # or逻辑下,仅当所有子条件都失败时记录
                if not left_result and not right_result:
                    traverse_node(node.left, context, record_failure=True)
                    traverse_node(node.right, context, record_failure=True)
                return left_result or right_result
        
        # 处理原子比较条件节点
        elif isinstance(node, Comparison):
            try:
                # 计算条件左右两边的实际数据值
                left_value = node.left.evaluate(context)
                right_value = node.right.evaluate(context)
                condition_result = node.operator.evaluate(left_value, right_value)
                
                # 如果需要记录失败信息,添加到结果中
                if record_failure and not condition_result:
                    result_details['failed_conditions'].append({
                        'condition': str(node),
                        'actual_value': left_value,
                        'required_value': right_value,
                        'operator': str(node.operator)
                    })
                return condition_result
            except Exception as e:
                # 处理数据缺失、类型错误等异常
                result_details['failed_conditions'].append({
                    'condition': str(node),
                    'error': f"数据异常:{str(e)}"
                })
                return False
        
        # 处理其他类型节点(如属性获取、字面量)
        else:
            try:
                return node.evaluate(context)
            except Exception as e:
                result_details['failed_conditions'].append({
                    'condition': str(node),
                    'error': f"数据异常:{str(e)}"
                })
                return False

    # 创建规则评估上下文
    context = rule_engine.Context(data=data)
    traverse_node(rule.tree, context)
    return result_details

# 测试代码
if __name__ == "__main__":
    rule = rule_engine.Rule('first_name.length > 5 and age > 16')
    
    data1 = {
        'first_name': 'Luke Walker',
        'last_name': 'Skywalker',
        'email': 'luke@rebels.org',
        'age': 25
    }
    data2 = {
        'first_name': 'Luke',
        'last_name': 'Vader',
        'email': 'dvader@rebels.org',
        'age': 100
    }

    # 评估并输出结果
    print("data1评估结果:", evaluate_rule_with_details(rule, data1))
    print("\ndata2评估结果:", evaluate_rule_with_details(rule, data2))

输出示例

data2的评估结果如下,包含明确的失败条件信息:

{
    'overall_match': False,
    'failed_conditions': [
        {
            'condition': 'first_name.length > 5',
            'actual_value': 4,
            'required_value': 5,
            'operator': '>'
        }
    ]
}

UI展示建议

  • 将每个失败条件渲染为清晰的提示条目,例如:

    ❌ 条件不满足:first_name.length > 5,实际值为4,要求大于5

  • 对于多层嵌套的复杂规则,使用缩进或树形结构展示条件层级,方便用户理解逻辑关系
  • 高亮显示失败的字段和条件,提升信息可读性

内容的提问来源于stack exchange,提问作者solver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:15:05