2011-08-02 44 views

回答

3

你的問題有點含糊,但它聽起來像是要計算包含表達式的字符串(如x > 5 )。而不是這樣做,這是不必要的複雜,並可能是一個安全隱患,只需定義一個函數,無論是傳統的方式或使用lambda。

def gt5(x): 
    return x > 5 

gt5 = lambda x: x > 5 

這些都是等效;現在你可以繞過gt5,只要你喜歡,並在時機成熟時,你只需把它

y = 6 
if gt5(y): 
    ... 

由於Gerrat's回答表明,該operator模塊也可以是這樣的事情很有用。


既然我知道你正在處理用戶字符串,我肯定會建議創建一個將字符串映射到函數的字典。 (也許這就是你的標題中的含義?)將用戶字符串傳遞到getattr似乎在很多方面都很糟糕。如果你想添加一個不符合operator屬性的字符串,會發生什麼?如果用戶傳遞一個對應於私有屬性的字符串會發生什麼?最好創建一個將字符串映射到函數的自定義字典。字典允許你指定你想接受的字符串。

func_dict = { 
    'lt' : operator.lt, 
    'gt' : operator.gt, 
    'nand' : lambda x, y: not (x and y) 
} 

你仍然可以保存自己使用getattr + operator建立從要接受字符串列表的字典工作。喜歡的東西:

func_dict = dict((s, getattr(operator, s)) for s in ['lt', 'gt']) 

像這樣然後更新func_dict

custom_dict = { 
    'nand' : lambda x, y: not (x and y) 
} 

func_dict.update(custom_dict) 

從那裏,你可以很容易地調用函數在字典像這樣:

>>> func_dict['lt'](5, 7) 
True 
+0

這是一個很好的解決方案。在你的建議中,你是否還假設用戶在映射到處理端函數的接口中傳遞了一個字符串?即func_dict存在於處理端? –

+0

@ strimp099,好吧,我假設這是一個最終用戶界面,而不是API或類似的東西。所以,假設是,'func_dict'住在處理端;用戶輸入一個字符串,然後將該字符串傳遞給func_dict以查找要執行的函數。 (但是,只要用戶傳入字符串,或者晚得多,這種情況就會發生 - 不管你的情況是否合理)。如果這是庫模塊的接口或類似的東西,那麼可能不需要根本不使用字符串;你可以接受任何功能。 – senderle

+0

對,我用你的解決方案,這是完美的,謝謝。 –

4

你可以使用operator模塊,並通過其上的適當的方法:

import operator 

def check(op, a, b) 
    return op(a,b) 

op = operator.ne 
check(op, 2,3) 


>>> True 
+0

我結束了向函數傳遞字符串lt,le,eq,ge或者gt,然後調用完美工作的fcn = getattr(operator,'le')。感謝您的迴應。 –

+0

@ strimp099:那麼爲什麼你首先傳遞一個字符串呢?只需傳遞'operator.lt'等。 –

+0

在界面級別的用戶正在傳遞參數,所以我想讓它更清潔。如果有提高速度,我會考慮,現在我正在測試。好主意,謝謝。 –