2011-02-08 10 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'と呼ばれていますが、これはまれではありません。 –

答えて

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。 'None'が有効なデフォルト値であれば、それは誤用されています。 'None'は本当に例外的なものになるように設計するのは簡単です。 –

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

関連する問題