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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值