3. 规则引擎基础

规则引擎基础:规则优先级排序 学习卡片

任务说明

本案例在规则引擎中引入 priority 字段,实现按优先级从高到低排序执行,并在首个命中规则处停止,返回该规则。规则以字典列表形式定义,每条规则包含名称、优先级和判定函数。

核心实现

class Rule:
    def __init__(self, name, priority, condition):
        self.name = name
        self.priority = priority
        self.condition = condition

    def match(self, ctx):
        return self.condition(ctx)

class RuleEngine:
    def __init__(self, rules):
        # 按优先级从高到低排序,优先级数值越大越先执行
        self.rules = sorted(rules, key=lambda r: r.priority, reverse=True)

    def run(self, ctx):
        for rule in self.rules:
            if rule.match(ctx):
                return rule.name
        return None

if __name__ == "__main__":
    rules = [
        Rule("黑名单拦截", 100, lambda c: c.get("in_blacklist")),
        Rule("大额预警", 80, lambda c: c.get("amount", 0) >= 50000),
        Rule("异地登录", 60, lambda c: c.get("city") != c.get("home_city")),
        Rule("默认放行", 0, lambda c: True),
    ]

    engine = RuleEngine(rules)

    ctx1 = {"in_blacklist": True, "amount": 80000, "city": "北京", "home_city": "上海"}
    ctx2 = {"in_blacklist": False, "amount": 60000, "city": "上海", "home_city": "上海"}
    ctx3 = {"in_blacklist": False, "amount": 100, "city": "上海", "home_city": "上海"}

    print(engine.run(ctx1))
    print(engine.run(ctx2))
    print(engine.run(ctx3))

运行与验证

直接运行脚本:python rule_engine.py。观察输出:

  • ctx1 同时命中黑名单与大额,因黑名单优先级 100 最高,输出 黑名单拦截。
  • ctx2 未命中黑名单,命中大额预警(80),输出 大额预警。
  • ctx3 仅命中默认放行(0),输出 默认放行。

判定通过条件:三次输出依次为 黑名单拦截、大额预警、默认放行,且每条规则命中后立即返回,不再继续执行后续规则。

关键点

  • 排序在 RuleEngine.__init__ 中完成,保证每次 run 都按优先级顺序遍历。
  • run 使用 return 在首个命中处退出,实现“首个命中规则”语义。
  • 默认放行规则优先级设为 0,作为兜底,确保无其他规则命中时仍有返回值。