筛选与给定逻辑公式匹配的对象

2024-04-28 21:57:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python对象的数组,我想让所有对给定的逻辑公式求值为真的对象。你知道吗

假设这些对象是任务跟踪系统中的任务。每个任务都有一个状态、一个受让人和一个到期日。现在我想让所有计算公式的对象都为真:

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

对于对象字段(assigneestatus)之类的内容,检查相等性将是一个简单的问题,而due=tomorrow将是要在对象上调用的函数。你知道吗

有没有一个简单的解析器可以用来解析表达式,然后对启动集中的所有对象进行求值(基本上是将所有文本连接到函数调用)?你知道吗


Tags: orand对象状态系统status数组逻辑
2条回答

试试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()

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

[obj for obj in list_of_obj if func(obj)]

相关问题 更多 >