더북(TheBook)

BETTER WAY 20
동적 기본 인수를 지정하려면 None과 docstring을 사용하자

 

 

키워드 인수의 기본값으로 비정적(non-static) 타입을 사용해야 할 때도 있다. 예를 들어 이벤트 발생 시각까지 포함해 로깅 메시지를 출력한다고 하자. 기본적인 경우에는 함수를 호출한 시각을 메시지에 포함하려고 한다. 함수가 호출될 때마다 기본 인수를 평가한다고 가정하고 다음과 같이 처리하려 할 것이다.

def log(message, when=datetime.now()):

print(‘%s: %s’ % (when, message))

 

log(‘Hi there!’)

sleep(0.1)

log(‘Hi again!’)

 

>>>

2014-11-15 21:10:10.371432: Hi there!

2014-11-15 21:10:10.371432: Hi again!

 

datetime.now는 함수를 정의할 때 딱 한 번만 실행되므로 타임스탬프가 동일하게 출력된다. 기본 인수의 값은 모듈이 로드될 때 한 번만 평가되며 보통 프로그램이 시작할 때 일어난다. 이 코드를 담고 있는 모듈이 로드된 후에는 기본 인수인 datetime.now를 다시 평가하지 않는다.

파이썬에서 결과가 기대한 대로 나오게 하려면 기본값을 None으로 설정하고 docstring(문서화 문자열)으로 실제 동작을 문서화하는 게 관례다(Better way 49 “모든 함수, 클래스, 모듈에 docstring을 작성하자” 참고). 코드에서 인수 값으로 None이 나타나면 알맞은 기본값을 할당하면 된다.

def log(message, when=None):

“””Log a message with a timestamp.

 

Args:

message: Message to print.

when: datetime of when the message occurred.

Defaults to the present time.

“””

when = datetime.now() if when is None else when

print(‘%s: %s’ % (when, message))

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.