2014-03-25 47 views
3
d = dict() 
d.pop('hello', None) # No exception thrown 
d.pop('hello', 0) # No exception thrown 
d.pop('hello')  # KeyError 

我曾經想過,在Python中,我們通常測試一個默認參數是否通過測試帶有某種默認值的參數來傳遞。dict.pop()如何檢測可選參數是否已通過?

我想不出dict.pop會使用的任何其他「自然」默認值。

dict.pop使用其他方法來測試可選參數?還是它使用了一些更深奧的默認值?

回答

10

那麼,dict在C中實現,所以Python的語義並不適用。否則,我會說在任何情況下看源頭。

但是,一個好的模式是使用一個標記作爲默認值。這絕不會與傳入的任何東西相匹配,所以你可以確定,如果你有這個價值,你只有一個參數。

sentinel = object() 

def get(value, default=sentinel): 
    if default is sentinel: 
     # etc 

這是一個合適的使用is,只要你想確保你檢查的精確定點對象,而不是隻是一些計算結果等於它。

2

可能是這樣的。

def pop(_dict, val, *args): 
    if val in _dict: 
     return _dict.pop(val) 
    elif args: 
     return args[0] 
    else: 
     raise KeyError() 

例如:

In [5]: pop({}, 'a') 

KeyError: 

In [6]: pop({}, 'a', 0) 
Out[6]: 0