출처: 파이썬 코딩의 기술 (브렛 슬라킨, 길벗)
이벤트 발생 시각을 포함해 로깅 메시지를 출력하려고 다음 함수를 작성하고 실행했다.
1 |
|
1 |
|
이벤트 발생 시각을 포함해 로깅 메시지를 출력하려고 시도했지만 datetime.now
는 함수를 정의할 때 딱 한 번만 실행되므로 타임스탬프가 동일하게 출력됨. 모듈이 로드된 후에는 기본 인수인 datetime.now
는 다시 평가되지 않는다. 이를 목적대로 실행하기 위해서는 기본값을 None
으로 설정하고 docstring
으로 실제 동작을 문서화하는게 관례이다.
다시 함수를 작성하고 실행하면 의도했던대로 잘 동작한다.
1 |
|
1 |
|
핵심 정리
- 기본 인수는 모듈 로드 시점에 함수 정의 과정에서 딱 한 번만 평가됨. 그래서 동적 값에는 이상하게 동작하는 원인이 되기도 함
- 값이 동적인 키워드 인수에는 기본값으로
None
을 사용하고, docstring을 통해 실제 동작을 문서화
비슷한 예로, JSON 포맷의 데이터를 불러와 딕셔너리 형태로 생성하는 코드를 작성하면 다음과 같다.
1 |
|
1 |
|
1 |
|
이 함수 역시 의도했던대로 동작하게 하려면 None
을 이용한다.
1 |
|
1 |
|
1 |
|
None
을 이용하면 의도했던대로 잘 동작하는 것을 확인할 수 있다.