2013-06-03 80 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

相关问题