2016-10-28 52 views
1

處理可選列表參數的常規方法如下:可選列表參數「列表=列表或[]」在Python

def func(list_of_vals = None): 
    if list_of_vals is None: 
     list_of_vals = [] 
    ... 

我wounder如果下面的(短)的版本有什麼缺陷?爲什麼沒有人這樣做?它被認爲比較隱晦嗎?

list_of_vals = list_of_vals or [] 
+3

我這樣做,我覺得很棒。體面的python程序員會理解它。但是使用'l'作爲變量名,這很糟糕。 –

+0

@AlexHall,當然,這只是一個示例代碼來說明一個想法 –

+0

這是非常普遍的。它也是JS的標準。實際上,Typescript中的默認參數編譯成上面的代碼,但在JS中。任何人,即使是遠程熟練的語言都會知道你在做什麼。 – Carcigenicate

回答

3

使用None與if語句因爲這是通常的結合,它是熟悉Python開發者,也沒有怪異的邊緣情況。 我的建議只是堅持與公約

你在這裏使用or操作邏輯的提議從邊緣情況bool(list_of_vals) == Falselist_of_vals is not None傳統的解決方案偏離,所以我會使用建議

另一個可能的選擇是使用一個空的元組:

def a(vals=()): 
    ... 

因爲元組是不可變的,這有沒有一個可變的默認列表中的陷阱。有許多用例只需要迭代和索引輸入容器,並且vals可以愉快地保留爲元組。

如果你確實需要在函數體內部使用一個列表,例如你需要追加或彈出項目,那麼你將添加vals = list(vals)作爲函數的第一行。

+1

我覺得如果傳遞給函數('list')的典型值的類型不同於默認值類型('tuple'),那可能更具誤導性 –

+0

這是一個很好的想法。如果通過的列表預計會被函數修改(這對於一個可選參數來說會很奇怪),但它不會起作用,否則它甚至會表明不變性,這是一個加號。 – zvone

+0

@BenUsman一個好的Python函數應該儘可能少地關心參數的類型。 – zvone

1

有兩種情況,你想要的清單可以在函數外被改變,那麼第二個變種阻止調用a有:

some_list = [] 
a(some_list) 
print(some_list) 

如果你想阻止列表參數的交替,你應該在裏面做一個副本a

def a(l=()): 
    l = list(l)