0

Python オブジェクトの配列があり、特定の論理式に対して true と評価されるすべてのオブジェクトを取得したいと考えています。

オブジェクトがタスク追跡システムのタスクであるとしましょう。各タスクには、ステータス、担当者、期日があります。ここで、この数式で true と評価されるすべてのオブジェクトを取得したいと思います。

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

オブジェクト フィールド (assigneeおよびstatus) のようなものについては、単純に等価性をチェックする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 に答える