피드로 돌아가기
La importancia de no ser None
Dev.toDev.to
Backend

Python Truthy/Falsy 메커니즘으로 인한 논리 오류 및 is None 검증의 중요성

La importancia de no ser None

Baltasar García Perez-Schofield2026년 4월 27일7intermediate

Context

HTML 북마크 데이터를 트리 구조로 파싱하는 Python 도구 설계 중 루트 리스트 할당 과정에서 예기치 않은 중복 할당 발생. if not self._bms 구문을 통한 None 체크 로직이 의도와 다르게 동작하며 객체 존재 여부와 관계없이 조건문 내부로 진입하는 병목 현상 확인.

Technical Solution

  • __len__ 메서드 구현 시 Python의 Sequence 프로토콜이 활성화되어 객체의 Truthy/Falsy 판정 기준이 변경되는 특성 분석
  • bool() 평가 시 __len__이 0을 반환하면 객체가 존재함에도 False로 취급되는 Python 언어 스펙의 제약 사항 식별
  • collections.abc.Sized 클래스가 __subclasshook__을 통해 __len__ 존재 여부만으로 하위 클래스로 인식하는 동적 타이핑 메커니즘 파악
  • 암묵적 형변환을 유발하는 if x: 대신 if x is not None:을 사용하여 명시적 Identity 비교 방식으로 로직 수정
  • __getitem__ 기반의 레거시 Iteration 방식과 __iter__ 기반의 현대적 Iterable 프로토콜 차이점에 따른 사이드 이펙트 검토

1. 객체 존재 여부 확인 시 `if object:` 대신 반드시 `if object is not None:`을 사용하였는가?

2. `__len__` 메서드를 구현한 커스텀 클래스가 Boolean 문맥에서 어떻게 평가되는지 검증하였는가?

3. `collections.abc` 프로토콜(Sized, Iterable 등) 채택 시 발생 가능한 암묵적 타입 변환 가능성을 고려하였는가?

원문 읽기