获取python表达式中间执行状态?

时间:2017-05-16 01:43:34

标签: python boolean expression

长话短说,我正在构建一个规则引擎原型来过滤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 < 3600True,还是user.gender == 'F'True? (或两者兼而有之?)

目前我正在使用ast.iter_fields查找所有ast.Nameast.Attribute并再次使用eval()作为其值,但对于一行数据,我必须运行eval(几次感觉有点多余。

是否可以反省从最后一行代码计算值的方式,如上面的简单A and (B or C) bool表达式。我们能够很好地找出评估的部分和价值吗?

PLus,对于or表达式,我们可以告诉哪个部分被省略了,因为它被先前的条件短路了吗?

1 个答案:

答案 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