2012-05-30 44 views
0

我有一個Python對象數組,我想獲得對於給定的邏輯公式計算爲true的所有對象。過濾匹配給定邏輯公式的對象

假設對象是任務跟蹤系統中的任務。每個任務都有一個狀態,一個受讓人和一個到期日。現在,我想獲得計算結果爲true,這個公式中的所有對象:

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

類的東西的對象字段(assigneestatus),這將是檢查的平等一件簡單的事情,而due=tomorrow將是一個函數在對象上調用。

是否有一個簡單的解析器,我可以用它來解析表達式,然後對我的起始集中的所有對象進行評估(基本上將所有文字連接到函數調用)?

回答

1

嘗試pyparsing。下面是一個語法支持平等,布爾OPS和嵌套括號解析器:

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() 
+0

我已經研究過pyparsing,但樹對我來說是新的。從根中走過樹並評估平等性,我應該以整個表達式的真實還是錯誤爲結果?任何想法如何有效地做到這一點? – cdecker

+0

有沒有什麼辦法可以爲pyparsing添加文字回調? – cdecker

+1

@cdecker:是的,查找'setParseAction'。 – georg

0

定義一個函數,做你的測試,然後:

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

呃對,我應該提到:函數是用戶提供的,在開發過程中是不知道的。這就是爲什麼我要求解析器。 – cdecker

+0

什麼樣的表情?你可以減少它們到字符串並使用'getattr(obj,'string')'或者它們是邏輯類型與比較和數學? – dawg

+0

它們可以很簡單,但主要是它們涉及特殊處理,因此讓解析器在對象上調用函數時,評估會給我以後添加更多過濾器的自由。 – cdecker