当前位置: 首页 > news >正文

Python规则引擎DIY:从零开始构建规则引擎

在软件开发领域,规则引擎是一种非常有用的技术,它允许开发者定义和执行一系列基于条件的逻辑。尽管Python社区中有许多现成的规则引擎框架,但本文将展示如何从零开始构建一个基本的规则引擎。我们将介绍这个引擎的基本结构,并通过代码示例来解释每个部分的功能。

引言

本文介绍基于Python的简单规则引擎。该引擎的设计初衷是为了提供基础框架,开发者可以根据自己的需求进行扩展和定制。接下来,我们将逐步构建这个引擎,包括定义事实(Fact)、条件(Condition)和动作(Action)等核心组件。
在这里插入图片描述

定义事实(Fact)

在我们的规则引擎中,事实是存储信息的基本单元。每个事实可以包含任何与规则引擎设计相关的数据。以下是如何定义一个简单的事实类:

from typing import Any

class Fact:
    def __init__(self, **kwargs: Any):
        self.__dict__.update(kwargs)

通过这个类,我们可以轻松地创建包含任意关键字参数的事实对象。例如:

person_fact = Fact(name="John Brown", age=35, occupation="Software Developer")

访问事实的属性就像访问对象的成员或方法一样简单。

定义条件(Condition)

条件用于评估事实是否满足特定的逻辑要求。每个条件包含一个名称和一个评估函数,该函数接收一个事实作为输入并返回一个布尔值。

from rule_engine.fact import Fact
from typing import Callable, Any

class Condition:
    def __init__(self, name: str, evaluation_function: Callable[[Fact], bool]):
        self.name = name
        self.eval_func = evaluation_function

    def evaluate(self, fact: Fact) -> bool:
        return self.eval_func(fact)

定义动作(Action)

动作是在所有条件都满足时执行的操作。每个动作包含一个名称和一个执行函数,该函数接收一个事实作为输入并执行相应的操作。

from typing import Callable, Any
from rule_engine.fact import Fact

class Action:
    def __init__(self, name: str, execution_function: Callable[[Fact], None]):
        self.name = name
        self.exec_func = execution_function

    def execute(self, fact: Fact) -> None:
        self.exec_func(fact)

构建规则(Rule)

规则是将条件和动作组合在一起的逻辑单元。以下是如何定义一个规则类:

from rule_engine.condition import Condition
from rule_engine.action import Action
from rule_engine.fact import Fact
from typing import Any, List
from functools import reduce

class Rule:
    def __init__(self, condition: Condition, action: Action):
        self.conditions = [condition]
        self.actions = [action]

    def add_condition(self, condition: Condition) -> None:
        self.conditions.append(condition)

    def add_action(self, action: Action) -> None:
        self.actions.append(action)

    def evaluate(self, facts: List[Fact]) -> Any:
        def fact_generator(conditions: List[Condition], facts: List[Fact]):
            all_conditions_true = True
            for fact in facts:
                results = map(lambda condition: condition.evaluate(fact), conditions)
                all_conditions_true = reduce(lambda x, y: x and y, results)
                if all_conditions_true:
                    yield fact

        true_facts = list(fact_generator(self.conditions, facts))
        if len(true_facts) > 0:
            for fact in true_facts:
                for action in self.actions:
                    action.execute(fact)

使用示例

现在,让我们通过一个简单的示例来展示如何使用这个规则引擎:

from rule_engine.fact import Fact
from rule_engine.condition import Condition
from rule_engine.action import Action
from rule_engine.rule import Rule

age_cond = Condition(name="Age>=21", evaluation_function=lambda fact: fact.age >= 21)
occupation_cond = Condition(name="Occupation==Software Developer", evaluation_function=lambda fact: fact.occupation == "Software Developer")
print_action = Action(name="Print Fact", execution_function=lambda fact: print("Name: {} Age: {} Occupation: {}".format(fact.name, fact.age, fact.occupation)))

john = Fact(age=25, name="John Brown", occupation="Software Developer")
sarah = Fact(age=35, name="Sarah Purple", occupation="Data Engineer")
barry = Fact(age=27, name="Barry White", occupation="Software Developer")

rule = Rule(condition=age_cond, action=print_action)
rule.add_condition(occupation_cond)
rule.evaluate([john, sarah, barry])

结论

本文介绍了一个简单的Python规则引擎的构建过程。通过定义事实、条件和动作等核心组件,我们可以创建灵活且可扩展的规则逻辑。希望这个示例能够激发你对规则引擎的兴趣,并鼓励你在自己的项目中尝试使用它。希望对你有所启发,感谢阅读!

相关文章:

  • Linux》》Ubuntu22.04下Docker的安装 Docker
  • 【VS】vs生成前事件,复制脚本文件至运行目录
  • Python Numpy面试题及参考答案 草
  • Prompt 工程
  • MySQL中IN关键字与EXIST关键字的比较
  • JAVA:利用 Jsoup 轻松解析和操作 HTML 的技术指南
  • 展望 AIGC 前景:通义万相 2.1 与蓝耘智算平台共筑 AI 生产力高地
  • 如何在Android中实现SQLite数据库操作
  • 【设计模式】设计模式介绍
  • 力扣热门100题【525,1314】
  • 数字隔离器,如何提升储能系统的安全与效能?
  • Python - 爬虫;爬虫-网页抓取数据-工具curl
  • Python精进系列:filter 模块
  • leetcode 142. 环形链表 II
  • STM第三天点亮LED
  • 修改nginx配置,同一台服务器部署多个前端项目
  • [C语言笔记]07、数组
  • 阿里云操作系统控制台评测:国产AI+运维 一站式运维管理平台
  • 心脏扩散张量成像中的异常值检测:是剔除异常测量值还是采用稳健拟合方法?|文献速递-医学影像人工智能进展
  • 基于SpringBoot+Vue的社区物业管理平台+LW示例参考
  • “上海-日喀则”直飞航线正式通航,将于5月1日开启首航
  • 恒瑞医药赴港上市获证监会备案,拟发行不超8.15亿股
  • 公交公司须关注新出行需求:“单车巴士”能否常态化
  • 哈马斯同意释放剩余所有以色列方面被扣押人员,以换取停火五年
  • 文化体验+商业消费+服务创新,上海搭建入境旅游新模式
  • 四川甘孜州白玉县发生4.9级地震,震源深度10千米