2015-11-06 87 views
1

我正在處理一段代碼,需要驗證兩個用戶是否在幾個不同的標準下「匹配」。如果有幫助的話,可以把它看作是一個約會應用程序,我們試圖根據年齡,性取向,種族偏好等來匹配人。以下是一個有3個條件的例子,每個條件都是一個函數。什麼是驗證多種複雜條件的良好模式?

def is_match(row): 
    return True \ 
     and ethnicity(user_a, user_b) \ 
     and sexual_orientation(user_a, user_b) \ 
     and age(user_a, user_b) \ 

現在,讓我們說,我想增加對鄰近另一個條件,我只想把它添加到功能:

def is_match(row): 
    return True \ 
     and ethnicity(user_a, user_b) \ 
     and sexual_orientation(user_a, user_b) \ 
     and age(user_a, user_b) \ 
     and proximity(user_a, user_b) 

當然,這是一個小的應用是可行的,但我可以想象一下,其他同事可能想要檢查代碼並將自己的條件傳遞給它的點,而這看起來不夠抽象。我知道這裏必須有一個模式可以遵循。我應該像數組一樣傳遞每個函數嗎?你會如何推薦這樣做?我正在使用Python,但您可以使用任何您想要演示模式的語言。

+0

有你打得四處['任何()'和'所有()'](https://docs.python.org/2/library/functions.html#all)? – Kevin

+0

是的,我以前使用過這些。所以這個想法是傳遞一個函數列表和兩個用戶對象,並且只對它們執行任何()或全部()操作?是的,這可能是我現在擁有的改進。謝謝。 –

回答

1
def is_match(list_of_functions, user_a, user_b): 
    return all([cur_fun(user_a, user_b) for cur_fun in list_of_functions]) 

編輯:

以下的變體是更有效,因爲它短路瞬間就擊中一個非真實價值,而不是必然評估所有的功能:

def is_match(list_of_functions, user_a, user_b): 
    for cur_fun in list_of_functions 
     if not cur_fun(user_a, user_b): 
      return False 
    return True 
1

我認爲集合對於這樣的任務是很好的,因爲它比驗證更具有比較性。我給你舉例:

user_a = { 
    'ethnicity': 1, 
    'sexual_orientation': 'straight', 
    'age': 37, 
} 

user_b = { 
    'ethnicity': 2, 
    'sexual_orientation': 'straight', 
    'age': 34, 
} 

differences = set(user_a.items())^set(user_b.items()) # s.symmetric_difference(t) 
commons = set(user_a.items()) & set(user_b.items()) # s.intersection(t) 

print({'differences': differences, 'commons': commons}) 

輸出:

{'differences': {('ethnicity', 2), ('ethnicity', 1), ('age', 37), ('age', 34)}, 'commons': {('sexual_orientation', 'straight')}} 

所以你可以只加載兩個用戶的數據類型的字典和比較。