2011-02-08 6 views
3

기본 인수를 사용하고 지정되지 않은 경우 특수 동작을하는 파이썬 코드가 자주 표시됩니다.존재 여부와 상관없이 기본 인수를 지정하는 관용적 인 방법

내가 예를 들어이 같은 행동을 원하는 경우 : 내 자신의 롤한다면

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] 

하지만 내가 원하지 않는 확실히 표준이있을 때 어리석은 것을 발명하십시오. 파이썬에서 이것을하는 관용적 인 방법은 무엇입니까?

+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 할 수 있기 때문에 +1. 그러나 나는 가독성을 이유로 그것을 참을 수는 없습니다. – porgarmingduod

관련 문제