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,作为兜底,确保无其他规则命中时仍有返回值。