我的数据库中有一个简单的规则/条件表,用于为我们的某个系统生成警报.我想创建规则引擎或特定于域的语言.
存储在此表中的简单规则是..(省略此处的关系)
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