2011-02-08 3 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' действительно является исключительным. –

1

Вы можете сделать это на основе *args and/or **kwargs.

Вот альтернативный реализация getwrap на основе *args:

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

 Смежные вопросы

  • Нет связанных вопросов^_^