2011-02-25 79 views
2

是否可以在python中將字符串轉換爲運算符? 我想一個狀態傳遞給函數python將字符串轉換爲運算符

理想情況下,應該是這樣的:

def foo(self, attribute, operator_string, right_value): 
    left_value = getattr(self, attribute) 
    if left_value get_operator(operator_string) right_value: 
     return True 
    else: 
     return False 

bar.x = 10 
bar.foo('x', '>', 10) 
[out] False 
bar.foo('x', '>=', 10) 
[out] True 

我可以做一本字典,其中鍵是字符串和值的操作模塊的功能。 我會稍微改變foo的定義:

operator_dict = {'>', operator.lt, 
       '>=', operator.le} 
def foo(self, attribute, operator_string, right_value): 
    left_value = getattr(self, attribute) 
    operator_func = operator_dict[operator_string] 
    if operator_func(left_value, right_value): 
     return True 
    else: 
     return False 

這意味着我必須讓這本詞典,但是否真的有必要嗎?

+0

只要你有一個可管理的操作集,一個字典就好了。 –

回答

4

您可以使用eval動態構建一段Python代碼並執行它,但除此之外,沒有其他選擇。然而,基於字典的解決方案更加優雅和安全。

除此之外,難道是不好?爲什麼不縮短它有點...

return operator_dict[operator_string](left_value, right_value) 
+0

感謝讓我意識到eval。但是,是的,你是對的,創建這本詞典並不壞。 – Ben2209

2

問題指定我不明白的方式,爲什麼你不能operator.le傳遞給函數,而不是「> =」。

如果這個operator_string來自數據庫或文件或其他東西,或者你在代碼中傳遞它嗎?

bar.foo('x', operator.le , 10) 

你只是想找一個方便的速記?那麼你可能會做這樣的事情:

from operator import le 
bar.foo('x', le, 10) 

如果這裏真正的問題是,你有代碼或業務規則從數據庫或數據文件進來的話,說不定你真的需要看看在寫一個小解析器,將映射你的輸入到這些對象中,然後你可以看看使用像pyparsing,ply,codetalker等庫。

+0

我只是在一個方便的捷徑。所以你的解決方案聽起來不錯,謝謝你。 – Ben2209

+0

或者,您可以只從操作員導入eq,ne,gt,lt,le,ge'而不是爲所有人寫作業。 – kindall

+0

@ kindall:非常好的一點。 – stderr