2010-07-16 28 views
4

我經常遇到這個問題:我正在創建一個函數,需要對一個值執行一系列操作,無論該值是單個值還是值列表。如何處理Python單個vals和vals列表的方式相同?

有一種優雅的方式來做到這一點:

def convert_val(val): 
    do a series of things to each value, whether list or single val 
    return answer or list of answers 

而不是我一直在做?:

def convert_val(val): 
    if isinstance(val, list): 
     ... do a series of things to each list item, 
     return a list of answers 
    else: 
     ... do the same series, just on a single value 
     return a single answer 

一種解決方案是創建一個sub_convert()會做一系列操作,然後只需調用一次或迭代,具體取決於傳入convert()的類型。

另一個將創建一個將接受參數(值,sub_convert())的convert()。

其他建議,會更緊湊,優雅,最好是在一個功能?

(我已經做了幾個搜索這裏,看看我的問題已經得到解決。我appologies如果有)。

感謝, JS

回答

4

如果函數有意義的一個值,以及一個列表,然後在邏輯上,某個列表項的函數結果將不依賴於列表中的其他項。

例如,ab應該結束了相同:

items = [1, 2] 
a = convert_val(items) 
b = map(convert_val, items) 

該實施例已暗示該溶液:在呼叫者知道在一個列表或一個單一的值是否通過當通過單值,該功能可以按原樣使用。當傳遞一個列表時,可以很容易地添加一個map調用,並且可以更清楚地說明調用者發生的情況。

因此,您所描述的功能不應該首先存在!

+0

地圖()調用也是一個好主意,我沒有考慮。謝謝! – 2010-07-16 18:34:41

6

您需要修復您的設計以使該功能的所有用途實際上正確無誤。

Ralph Waldo Emerson。 「愚蠢的一致性是小心靈的大地精,受到小政治家,哲學家和神學家的喜愛。」

我們不是在談論愚蠢的一致性。基於不一致的使用此功能,您可能會遇到設計問題。

選項1.不要撥打convert_val(x)其中x是非列表。做這個。 convert_val([x])。不要修復你的功能,修復所有使用你的功能的地方。一致性有助於減少錯誤。

選項2.將convert_val的設計更改爲使用多個位置參數。這不能很好地概括。

def convert_val(*args): 
    whatever it's supposed to do to the arguments. 

然後修復您提供列表的所有地方爲convert_val(*someList)。沒關係,可能更接近你的意圖。

注意。

您可以使用warnings模塊找到您的設計錯誤。

def convert_val(arg): 
    if isinstance(arg, collections.Sequence): 
     return convert_val_list(arg) 
    else: 
     warnings.warn("Fix this") 
     return convert_val_list([arg])[0] 

def convert_val_list(arg): 
    assert isinstance(arg, collections.Sequence) 
    the original processing 

一旦固定所有的設計問題,然後你可以做到這一點

convert_val = convert_val_list 

,並刪除原有的功能。

+0

這兩個很好的選擇,我沒有想到。謝謝。還要感謝警告模塊的提示。 – 2010-07-16 18:34:06

+1

當你知道你在傳遞什麼時,上面的代碼是正確的。在我的情況下,我使用Selenium獲取值,並根據我運行的瀏覽器給出了不同的結果,即一個給了我一個字符串,另一個給了我一個String的列表。 – dosaki 2016-12-01 16:29:56

0

我遲到了,我不確定這是否是OP想要的。

我更喜歡將實現細節隱藏在函數內部。來電者不應該關心裏面發生的事情。

def convert_val(val): 
    values = [] 
    values.extend(val) 
    for value in values: 
     # do things to each list item, 
    return a list of answers 

這將使convert_valvalvalues列表(如果不是列表)或進入values列表val所有值。

另外應該可以預測地得到一個列表(因爲你會使用相同的邏輯)。

中底:

assert convert_val([1]) == convert_val(1) 
相關問題