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

如何基于Python对象应用规则引擎并匹配对应规则?

Python对象规则匹配实现方案

问题概述

需要为Python对象应用一组规则,核心目标是判断对象是否匹配规则,以及明确具体匹配的规则。已知CLIPS工具,但不确定其是否支持Python对象匹配,同时顾虑其冗余性及AI导向的特性。

示例对象定义

from typing import List

class Student:
    def __init__(self):
        self.country: str
        self.name: str
        self.surname: str
        self.grade: int

class StudentsExamReport:
    def __init__(self):
        self.exam_id: str
        self.students: List[Student]

示例规则

若超过3名学生的成绩低于4则匹配

可选实现方案

1. 自定义轻量规则引擎(推荐简单场景)

针对规则逻辑不复杂的场景,直接自定义规则结构和匹配逻辑,无需依赖第三方库,灵活性高且轻量化。

实现思路:

  • 定义规则类,包含规则描述和匹配判断函数
  • 遍历规则集合,对目标对象逐一执行匹配检查

代码示例:

class Rule:
    def __init__(self, description: str, condition):
        self.description = description
        self.condition = condition

def check_rules(report: StudentsExamReport, rules: List[Rule]) -> List[str]:
    matched_rules = []
    for rule in rules:
        if rule.condition(report):
            matched_rules.append(rule.description)
    return matched_rules

# 定义示例规则
low_grade_rule = Rule(
    description="超过3名学生成绩低于4",
    condition=lambda r: len([s for s in r.students if s.grade < 4]) > 3
)

# 使用示例
sample_report = StudentsExamReport()
# 假设已为sample_report.students填充数据
matched = check_rules(sample_report, [low_grade_rule])
print(matched)  # 输出匹配的规则描述列表

2. 使用CLIPS的Python绑定(适合复杂规则场景)

CLIPS确实可以通过Python封装库(如pyclips)实现与Python对象的交互,将Python对象转换为CLIPS可识别的事实后,即可定义规则进行匹配。若你的规则逻辑复杂、涉及多维度关联判断,这种方案更合适。

代码示例:

import clips

# 初始化CLIPS环境
env = clips.Environment()

# 定义CLIPS事实模板
env.build("(deftemplate student (slot grade))")
env.build("(deftemplate exam-report (slot exam-id))")

# 定义规则
env.build("""
(defrule low-grade-rule
    (exam-report (exam-id ?eid))
    (test (> (length$ (find-all-facts ((?s student)) (test (< ?s:grade 4)))) 3))
    =>
    (printout t "规则匹配:超过3名学生成绩低于4" crlf)
)
""")

# 将Python对象转换为CLIPS事实
sample_report = StudentsExamReport()
sample_report.exam_id = "mid-term-001"
# 假设已填充学生数据
env.assert_string(f'(exam-report (exam-id {sample_report.exam_id}))')
for student in sample_report.students:
    env.assert_string(f'(student (grade {student.grade}))')

# 运行规则匹配
env.run()

3. 使用轻量Python规则库(如rule-engine)

若不想自己实现逻辑,又觉得CLIPS过重,可以选择Python生态下的轻量规则库,这类库专为常规业务规则匹配设计,语法简洁且贴合Python使用习惯。

代码示例(需先安装rule-engine):

from rule_engine import Rule, Context

# 定义规则语法(针对StudentsExamReport结构)
rule = Rule('len(students[grade < 4]) > 3')

# 创建上下文,映射对象属性
context = Context(type_resolver=lambda obj: obj.__class__)

# 匹配检查
sample_report = StudentsExamReport()
# 假设已填充学生数据
if rule.matches(sample_report, context=context):
    print("匹配规则:超过3名学生成绩低于4")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:55:24