0

我有一个 Python 对象数组,我想获取所有对给定逻辑公式计算为真的对象。

假设对象是任务跟踪系统中的任务。每个任务都有状态、受让人和截止日期。现在,我想获取对于此公式计算为 true 的所有对象:

(assignee=cdecker OR due=tomorrow) AND status=open

对于对象字段(assigneestatus)之类的东西,检查相等性将是一件简单的事情,而due=tomorrow将是在对象上调用的函数。

是否有一个简单的解析器可以用来解析表达式,然后为我的起始集中的所有对象评估它(基本上将所有文字连接到函数调用)?

4

2 回答 2

1

尝试pyparsing。这是一个支持相等、布尔运算和嵌套括号的语法解析器:

from pyparsing import *

expr   = Forward()
factor = Forward()
term   = Forward()

iand   = Literal("AND").suppress()
ior    = Literal("OR").suppress()
ieq    = Literal("=").suppress()
lpar   = Literal("(").suppress()
rpar   = Literal(")").suppress()
ident  = Word(alphas)
atom   = ident | lpar + expr + rpar

factor << Group(atom + ZeroOrMore(ieq + atom))("equal")
term   << Group(factor + ZeroOrMore(iand + term))("and")
expr   << Group(term  + ZeroOrMore(ior + expr))("or")

您可以将其应用于您的公式以获得类似树的结构,您可以稍后对其进行评估,例如:

formula = "(assignee=cdecker OR due=tomorrow) AND status=open"
tree = expr.parseString(formula, parseAll=True)
print tree.asXML()
于 2012-05-31T09:13:23.980 回答
0

定义一个执行测试的函数,然后:

[obj for obj in list_of_obj if func(obj)]
于 2012-05-30T21:07:31.203 回答