我的数据库中有一个简单的规则/条件表,用于为我们的某个系统生成警报.我想创建规则引擎或特定于域的语言.

存储在此表中的简单规则是..(省略此处的关系)

if temp > 40 send email

请注意,会有更多这样的规则.脚本每天运行一次以评估这些规则并执行必要的操作.一开始,只有一条规则,所以我们有脚本只支持该规则.但是,我们现在需要使其更具可扩展性,以支持不同的条件/规则.我已经研究过规则引擎,但我希望以一种简单的pythonic方式实现这一点.目前,我只提出了eval / exec,我知道这不是最推荐的方法.那么,实现这个目标的最佳方法是什么?

(规则作为数据存储在数据库中,因此每个对象如“温度”,条件如“> / = ..等”,值类似“40,50..etc”和动作如“电子邮件,短信等等. “存储在数据库中,我检索它以形成条件…如果temp> 50发送电子邮件,那是我的想法然后使用exec或eval对它们进行实时代码..但不确定这是否是正确的方法)

解决方法:

好吧,如果你想做的是发送电子邮件,那么使用email module.

如果我是你,我会编写一个简单的Python脚本来处理一堆规则,可能只是在一个单独的文件中编写为简单的Python语句,然后发送电子邮件/短信/ …用于需要操作的那些规则执行.

您可以使用cron等服务每天运行一次(或其他任何操作)

例如,如果您的规则如下所示:

# Rule file: rules.py

def rule1():

if db.getAllUsers().contains("admin"):

return ('email', 'no admin user in db')

else:

return None, None

def rule2():

if temp > 100.0:

return ('sms', 'too hot in greenhouse')

else:

return (None, None)

...

rules = [rule1, rule2, ....]

那么你的处理脚本可能如下所示:

# Script file: engine.py

import rules

import email

...

def send_email(message, receiver):

# function that sends an email...

def send_sms(message, receiver):

# function that sends an sms...

actions = {'email':send_email, 'sms':send_sms, ...}

if __name__ == '__main__':

# Declare receiver here...

for rule in rules.rules:

# Does the rule return a do-able action?

# To be really paranoid we might wrap this in a try/finally

# in case the rules themselves have any side effects,

# or they don't all return 2-tuples.

act, message = rule()

if act in actions:

# perform the action

actions[rule()](message, receiver)

毫无疑问,还有其他方法可以做到这一点,例如创建用于编写规则的Pythonic DSL.

标签:python,dictionary,eval,exec

来源: https://codeday.me/bug/20190902/1791968.html

python实现规则引擎_python – 如何在不使用eval()或exec()的情况下创建规则引擎?...相关推荐

  1. python文本文件读取失败_Python 读取文本文件编码错误解决方案(未知文本文件编码情况下解决方案)...

    很多情况下我们是这样读取文本文件的: with open(r'F:\.Python Project\spidertest1\test\pdd凉席.txt', 'r') as f: text = f.r ...

  2. python设计一个节假日字典_python实现在无须过多援引的情况下创建字典的方法

    本文实例讲述了python实现在无须过多援引的情况下创建字典的方法.分享给大家供大家参考.具体实现方法如下: 1.使用itertools模块 import itertools the_key = [' ...

  3. python定位文件位置_python使用相对定位,绝对定位,选取同级别文件下的指定文件(csv,excel)...

    最近使用python读取同级下的data数据文件,开始找了很多方法.下面我总结成二种方法: 1.xxx.py想要打开.data.csv,使用相对路径,有如下方法: 思路: xxx.py想要打开的是mp ...

  4. python读取文件编码错误_Python 读取文本文件编码错误解决方案(未知文本文件编码情况下解决方案)...

    很多情况下我们是这样读取文本文件的: with open(r'F:\.Python Project\spidertest1\test\pdd凉席.txt', 'r') as f: text = f.r ...

  5. python keyerror5种方法_Python Scrapy-----KeyError: Spider not found 5种出错的情况

    KeyError: 'Spider not found:name一样,为何还是找不到spider 呢. 往下看看,总有一个是你要的答案. 第一种(最简单的错误): 运行的爬虫名字与爬虫文件中的name ...

  6. python高级数据分析师_python分析各大城市对数据分析师的招聘情况

    分析目的: 1.分析招聘对于学历的要求 2.分析招聘对于工作经验的要求 3.分析各城市对数据分析师的岗位需求 4.分析数据分析师的发展方向 5.分析数据分析师在全国的薪资情况

  7. python判断当前激活窗口_多种窗口都可能被激活的情况下判断其中某个是否激活...

    遇到的问题 今天测试 SAP 系统流程的时候突然出现了问题导致无法继续,问题是这样的:在 SAP 查询出结果后需要点击导出为电子表格,点击以后过几分钟会弹出这样的窗口: 然后我只需要检测 " ...

  8. python怎么生成不重复的字符_如何在不重复的情况下生成一组字符的所有组合?...

    我有以下清单:['a', 'b', 'c'] 我正在寻找一种方法来生成所有可能的字符串,这些字符串包含以下限制:一个字符不能出现多次(aab,aba,abca等无效) 可以排除字符(ab有效,即使c不 ...

  9. 为什么用python扒取出来的数据为空列表_如何解决python xpath爬取页面得到空列表(语法都对的情况下)...

    引言: 很多网页呈现给我们的静态页面,但是实际上是由服务器端的动态页面生成的.再加上网站设有反爬虫机制,所以抓取到的页面不一定和源码相同. 所以!!从源码里copy xpath,不一定能取到数据! 实 ...

最新文章

  1. JQuery解析JSON数据
  2. PHP之提取多维数组指定列的方法
  3. WebLogic使用总结(一)——WebLogic安装
  4. php 支付宝手机端_PHP 手机支付宝接口
  5. ubuntu卸载vsftpd出错
  6. leetcode 219. 存在重复元素 II(规定步长)
  7. 火狐web开发清楚缓存_如何使用Firefox的Web开发工具
  8. 多智能体强化学习_基于多智能体强化学习主宰星际争霸游戏
  9. 恒大健康上半年营收同比增132% 新能源汽车将成新增长点
  10. Linux学习笔记006----Linux命令ps使用详解
  11. jxl java mer_导出报表出错,有没有大神懂得
  12. uni-app:mescroll-uni 实现上拉加载,下拉刷新
  13. 【Unity3D】表格
  14. 深入浅出谈LPWAN物联网通信技术
  15. 一个屌丝程序猿的人生(五十)
  16. CHROME扩展笔记之webRequest·图片拦截
  17. word自动编号变成黑块儿的原因及解决方案
  18. 西门子plc s7-200写的先进先出范例 用fifo
  19. 洗衣店小程序v2.6.5+小程序前端全开源版安装教程
  20. 【活动】请注意:一大批Q币正在来袭

热门文章

  1. python解包wxapkg_微信小程序wxapkg解包器c++版(免装py环境 绿色90k)
  2. Tableau上面地图与条形图结合_Tableau | 20种常用图表(上文)
  3. CUDA 多GPU调用实现
  4. TensorFlow安装中遇到的问题
  5. GridView上同时定义了 DataSource 和 DataSourceId
  6. tf.gradients ---错误FetchargumentNonehasinvalidtype
  7. VMware 克隆的相关设置
  8. 【转载】深入理解Java内存模型——final
  9. Spark Streaming ReceiverTracker架构设计
  10. Android ListView中EditView再次焦点获取