2013-06-03 117 views
1

是否有更好的方法來檢測是否提供了可選參數?即使提供了None,我們也希望返回,而不是引發異常。檢測是否提供了可選參數(可能包含無)

預期結果:

>>> get_value('key-exists-not') # default not provided 
KeyError 
>>> get_value('key-exists-not', None) # should support arg 
None 
>>> get_value('key-exists-not', default=None) # as well as kwarg 
None 
>>> get_value('key-exists-not', default='') 
'' 

這是最好的/推薦的方式做到這一點?

def get_value(key, default='somerubbishthatwillneverbeused'): 
    try: 
     return _data[key] 
    except KeyError: 
     if default != 'somerubbishthatwillneverbeused': 
      return default 
     raise 
+1

這是真的,這是一個棘手的搜索,因爲它是一個有點不同於標準的「默認值」。 –

回答

6

使用標記值;它是你測試agains與is私人單:

_sentinel = object() 
def get_value(key, default=_sentinel): 
    if default is _sentinel: 
     # no other value provided 
4

兩個選項

def foobar (**kwargs): 
    if 'some_key' in kwargs: 
     # it was provided 

而其他

default = object() 
def foobar (some_key=default): 
    if some_key is default: 
     # some_key not specified 
+0

我更喜歡第二個選項,因爲它不會破壞函數簽名。 – kirelagin

+0

同意。看到那一個,當我通過cherrypy的來源看,這是一個很好的解決方案。 – Blubber

相關問題