长话短说,我正在构建一个规则引擎原型来过滤Web请求日志。
e.g。
Web请求日志就像数百万行的json数据,如:
{"ip": "2.3.4.5", "user": {"register_time": 1494899081.527145, "gender": "F"}}
如果操作员可以在我们的系统中指定一些规则,如
ip == '1.2.4.5' and (user.register_time - now < 3600 or user.gender == 'F')
如果日志中的某一行与规则匹配,则引擎会将该行带到下一系列操作。
请注意now
变量由我们的规则引擎提供。规则引擎能够提供多个系统变量和函数。
我使用的原型是在python中使用eval()
方法将规则转换为实际的python代码并逐行检查日志。 (是的,我知道eval()
很糟糕,但记住这是一个原型)
我的问题是,在上面的例子中,如果某一行与规则匹配,我想知道哪些条件符合要求。仅user.register_time - now < 3600
是True
,还是user.gender == 'F'
是True
? (或两者兼而有之?)
目前我正在使用ast.iter_fields
查找所有ast.Name
和ast.Attribute
并再次使用eval()
作为其值,但对于一行数据,我必须运行eval(几次感觉有点多余。
是否可以反省从最后一行代码计算值的方式,如上面的简单A and (B or C)
bool表达式。我们能够很好地找出评估的部分和价值吗?
PLus,对于or
表达式,我们可以告诉哪个部分被省略了,因为它被先前的条件短路了吗?
答案 0 :(得分:0)
由MacroPy解决。
from macropy.tracing import macros, trace
with trace:
sum = 0
for i in range(0, 5):
sum = sum + 5
# sum = 0
# for i in range(0, 5):
# sum = sum + 5
# range(0, 5) -> [0, 1, 2, 3, 4]
# sum = sum + 5
# sum + 5 -> 5
# sum = sum + 5
# sum + 5 -> 10
# sum = sum + 5
# sum + 5 -> 15
# sum = sum + 5
# sum + 5 -> 20
# sum = sum + 5
# sum + 5 -> 25