Chinaunix首页 | 论坛 | 博客
  • 博客访问: 469043
  • 博文数量: 153
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1575
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-20 17:02
文章分类

全部博文(153)

文章存档

2017年(111)

2016年(42)

我的朋友

分类: Python/Ruby

2016-12-29 16:14:03

用Python实现简易可拓展的规则引擎

做这个规则引擎的初衷是用来实现一个可序列号为json,容易拓展的条件执行引擎,用在类似工作流的场景中,最终实现的效果希望是这样的:

![]

简单整理下需求

  1. 执行结果最终返回=true= or false
  2. 支持四则运算,逻辑运算以及自定义函数等
  3. 支持多级规则组合,级别理论上无限(Python递归调用深度限制)
  4. 序列化成json

实现

json没有条件判断和流程控制,且不可引用对象,是不好序列化规则的,除非用树来保存,但这样又过于臃肿不好阅读。

在苦苦思索的时候,突然灵光一闪~曾经我用过一个自动装机系统--,
它使用一种tag语法来匹配机器并打标签,他的语法是这样的:

 ["or",
     ["=", ["fact", "macaddress"], "de:ea:db:ee:f0:00"]
     ["=", ["fact", "macaddress"], "de:ea:db:ee:f0:01"]] 

这表示匹配目标机器的Mac地址等于=de:ea:db:ee:f0:00=或=de:ea:db:ee:f0:00=,这种表达既简洁,又足够灵活这种灵活体现在理论上可以无限嵌套,也可以随意自定义操作函数(这里的=、fact)
这灵感来自于古老的=Lisp=,完全可以实现我们的想法~并且简单、好用,还非常非常灵活!就它了!
因此我就使用这种基于=Json Array=的语法来实现我们的规则引擎。
最后实现的语法规则是这样的:

规则语法 基本语法: ["操作符", "参数1", "参数2", ...]


阅读全文请点击:
阅读(4419) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~