Python 함수에 동적인 디폴트 인자(e.g. datetime.datetime.now())를 지정할 때 주의할 점

Effective Python BETTER WAY 24

함수의 디폴트 인자에 정적이지 않은, 동적인 값을 사용하고 싶다면 일반적인 관례는 디폴트 값을 None으로 지정 후 실제 동작을 독스트링에 문서화 하는 것이다. 디폴트 인자의 값은 모듈이 로드될 때 단 한 번만 평가되기 때문이다.

예시로, 디폴트 값이 ‘현재 시간'(e.g. datetime.datetime.now())의 경우라면 자칫하면 인자의 값이 프로그램이 처음 실행된 시점의 now() 값으로 계속 사용될 것이다. 파라미터가 가변적인(mutable) 경우 디폴트 인자로 None을 사용해야하는지 판단해보자. 요걸 몰라서 장애를 냈던 나…^^;;

def log(message, when=None):
    """
    Args: 
        message: 출력할 메시지
        when: 메시지가 발생한 시각(datetime)
            디폴트 값은 현재 시간이다.
    """
    if when is None:
        when = datetime.now()
    print(f"{when}: {message}")

Leave a Reply

Your email address will not be published. Required fields are marked *