Python 역사상 가장 저주받은 '+' 연산자를 Pendulum이 만든 이유

“Pendulum 3.2.0의 + 연산자는 호출 스택을 검사해 호출 함수명이 astimezone이면 표준 datetime.__add__를, 아니면 DST 인식 자체 구현인 _add_timedelta_를 사용한다. 이 때문에 함수명을 astimezone으로 바꾸면 2013년 3월 30일 파리 기준 24시간 추가 결과가 13시(경과 시간)에서 12시(벽시계 시간)로 달라진다. 이 해킹은 표준 라이브러리와의 드롭인 호환성과 DST 정확 산술이라는 Pendulum의 두 약속이 충돌한 결과이며, 호출 스택 탐색으로 인해 표준 라이브러리보다 수백 배 느리다.”

AI 요약

Python의 인기 날짜/시간 라이브러리인 Pendulum은 + 연산자가 호출 스택을 검사해 호출한 함수 이름에 따라 다른 결과를 반환하는 독특한 방식을 사용한다. 이는 DST(일광절약시간) 인식 산술과 표준 라이브러리와의 드롭인 호환성이라는 두 가지 상충하는 약속을 동시에 지키기 위한 고육지책이었다. 호출 스택을 탐색하는 방식 때문에 표준 라이브러리보다 수백 배 느리지만, DST 전환 시 실제 경과 시간을 계산한다는 장점이 있다. 이 핵은 곧 제거될 예정이지만, 그 설계 배경은 여전히 중요하다.

핵심 포인트

  • Pendulum 3.2.0의 __add__ 메서드는 traceback.extract_stack(limit=2)[0].name으로 호출자 이름을 확인해 astimezone이면 표준 동작, 아니면 DST 인식 동작을 선택한다.
  • 함수 이름을 astimezone으로 바꾸면 + timedelta(hours=24)의 결과가 달라지는 부작용이 존재한다.
  • 호출 스택 탐색으로 인해 Pendulum의 + 연산자는 표준 라이브러리보다 수백 배 느리다.
  • DST 인식 산술과 드롭인 호환성이라는 두 약속 사이의 근본적 충돌이 이 해킹을 낳았다.

향후 전망

  • 이 해킹은 제거 방향으로 진행 중이나, DST 인식 산술과 호환성 간 트레이드오프 문제는 다른 라이브러리에도 시사점을 준다.
  • 개발자들은 날짜 연산 시 표준 라이브러리와 서드파티 라이브러리의 동작 차이를 명확히 인지해야 한다.
Share

이것도 읽어보세요

댓글

이 소식에 대한 의견을 자유롭게 남겨주세요.

댓글 (0)

불러오는 중...