2011-02-08 63 views
3

我经常看到带有缺省参数的python代码,当它们没有被指定时有特殊行为。指定存在/不存在问题的默认参数的习惯方式

如果我例如想要的行为是这样的:

def getwrap(dict, key, default = ??): 
    if ???: # default is specified 
     return dict.get(key, default) 
    else: 
     return dict[key] 

如果我要推出自己的,我想最终是这样的:

class Ham: 
    __secret = object() 
    def Cheese(self, key, default = __secret): 
     if default is self.__secret: 
      return self.dict.get(key, default) 
     else: 
      return self.dict[key] 

但我不想当肯定有标准时发明一些愚蠢的东西。在Python中这样做的习惯用法是什么?

+0

这并不罕见,至少在Plone中,通常称为_marker。 – 2011-02-08 18:09:23

回答

6

我通常喜欢

def getwrap(my_dict, my_key, default=None): 
    if default is None: 
     return my_dict[my_key] 
    else: 
     return my_dict.get(my_key, default) 

但当然,这是假设None永远不是有效的默认值。

+1

+1。如果“无”是一个有效的默认值,则会被误用。设计一些东西很简单,所以“无”真的非常特别。 – 2011-02-08 19:00:18

1

你可以根据*args and/or **kwargs来做到这一点。

下面是基于*args的替代实施方案的getwrap

def getwrap(my_dict, my_key, *args): 
    if args: 
     return my_dict.get(my_key, args[0]) 
    else: 
     return my_dict[my_key] 

这里,它是在行动:

>>> a = {'foo': 1} 
>>> getwrap(a, 'foo') 
1 
>>> getwrap(a, 'bar') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 5, in getwrap 
KeyError: 'bar' 
>>> getwrap(a, 'bar', 'Nobody expects the Spanish Inquisition!') 
'Nobody expects the Spanish Inquisition!' 
+0

+1,因为这是一种方法。但由于可读性的原因,我无法忍受。 – porgarmingduod 2011-02-08 18:31:17