종종 키워드 인자으 값으로 정적으로 정해지지 않는 타입의 값을 써야할 때가 있음

예를 들어 로그 메세지와 시간을 함께 출력하고 싶다고 할 때, 기본적으로 함수 호출 시간은 포함하길 원함

from time import sleep
from datetime import datetime

def log(message, when=datetime.now()):
    print(f'{when}: {message}')

log('Hi there!') # 함수가 정의되는 시점에 모듈을 한 번만 호출
sleep(0.1)
log('Hello again!')

>>>
2023-01-23 20:40:16.907256: Hi there!
2023-01-23 20:40:16.907256: Hello again! # 같은 시간이 찍힘

→ 이런 경우 일반적으로 디폴트 값을 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.
    """
    if when is None:
        when = datetime.now()
    print(f'{when}: {message}')

log('Hi there!')
sleep(0.1)
log('Hello again!')

>>>
2023-01-23 20:42:18.772109: Hi there!
2023-01-23 20:42:18.874469: Hello again!

타입 에너테이션을 사용할 때는 None을 사용해 키워드 인자의 디폴트 값을 표현하는 방식을 적용할 수 있음

from typing import Optional

def log_typed(message: str, when: Optional[datetime]=None) -> None:
    """Log a message with a timestamp.

    Args:
        message: Message to print.
        when: datetime of when the message occurred.
            Defaults to the present time. (동적인 디폴트 값)
    """
    if when is None:
        when = datetime.now()
    print(f'{when}: {message}')