2011-02-08 65 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