2010-05-14 11 views
12

시간 초과 값을 매개 변수로 사용하는 Python 함수를 작성했습니다. 일반적으로 사용자는 항상 동일한 시간 제한 값을 사용하지만 때로는 약간 더 오래 기다릴 수도 있습니다. 타임 아웃 값은 클래스 인스턴스 변수로 저장됩니다. 클래스의 timeout 인스턴스 변수를 기본 매개 변수로 사용하려고합니다.파이썬 인스턴스 변수를 기본 매개 변수로 사용

난 그냥 궁금 해서요
def _writeAndWait (self, string, timeout = -1): 
    if (timeout == -1): 
     timeout = self._timeout 

, 기본 매개 변수로 인스턴스 변수를 사용하는 적절한 방법은 다음과 같이 현재,이 구현 무엇입니까? 아니면 "if"확인을 피할 수있는 더 좋은 방법이 있습니까?

답변

12

귀하의 질문에 짧은 대답은 '아니, 당신은 파이썬은 한 번만 서명을 검사 때문에 if 문을 제거, 그래서 기본 수 없습니다되는 기본 값으로 None을 사용하는 것입니다 모든 통화에서 공유됩니다. 예를 들어, 고려 :

def addit(x, L=[]): 
    L.append(x) 
    return L 

대 :

def addit(x,L=None): 
    if L is None: 
     L=[] 
    L.append(x) 
    return L 

이 두 함수, 그들은 동일한 모양이지만, 실제로는 완전히 다른 동작을; 첫 번째 경우에는 L의 기본값이 호출간에 공유되므로 addit(2) 뒤에 오는 addit(1)은 실제로 동일한 기본 객체를 가리키는 두 개의 객체를 반환하고 [1,2]의 값을 가지며 두 번째 객체는 [1,2]의 값을 반환합니다. 두 번째 경우 두 개의 개별 객체 인 [1][2]을 반환합니다.

내가 추천 한 것은의 기본값을 사용하는 것입니다. 이는 지정되지 않은 매개 변수의 표준 규칙이지만 기본값으로 사용하므로 if 체크를 계속 사용하기 때문입니다. 일부 기존 객체는 미묘하게 (일반적으로 잘못된) 동작을 갖습니다. 파이썬에서

14

일반적인 방법은

def _writeAndWait (self, string, timeout=None): 
    if timeout is None: 
     timeout = self._timeout 
1

> 2.5 당신 수있는 ternary condition operator 사용하여 안전 한 줄 :

def _writeAndWait (self, string, timeout=None): 
    timeout = self._timeout if timeout is None else timeout 
관련 문제