본문으로 바로가기
TaeyoungKim.dev

Python truthy와 falsy: 빈 값 검사에서 None과 빈 문자열을 구분하는 법

파이썬작성 약 3분 읽기TaeyoungKim
LinkedInX

Python의 if value:는 짧고 읽기 좋지만, 0도 빈 문자열도 None도 모두 거짓으로 본다. 이 값들이 같은 의미가 아니라면 한 조건으로 묶으면 안 된다.

python
bool(None)  # False
bool(0)     # False
bool("")    # False
bool([])    # False

빈 컨테이너를 검사할 때는 간결한 조건이 좋다

목록이 비었는지만 확인한다면 다음처럼 쓴다.

python
def normalize_items(items):
    if not items:
        return []
    return items


assert normalize_items([]) == []
assert normalize_items(["api"]) == ["api"]

len(items) == 0보다 의도가 자연스럽고, 리스트·문자열·딕셔너리에도 같은 패턴을 쓸 수 있다.

다만 items가 None이면 같은 분기로 들어간다. "아직 목록을 받지 못함"과 "빈 목록을 받음"이 다른 상태라면 if items is None:을 먼저 검사한다. 화면에 둘 다 빈 목록으로 보여 줘도 되는지, 오류로 다뤄야 하는지는 입력 계약에 달렸다.

값 0이 유효하다면 None을 명시적으로 검사한다

페이지 번호, 재고, 할인율처럼 0이 유효한 값이면 if not value는 버그가 된다.

python
def normalize_page(page):
    if page is None:
        return 0
    return page

assert normalize_page(None) == 0
assert normalize_page(0) == 0
assert normalize_page(2) == 2

입력이 빈 문자열인지 공백뿐인지도 서비스 규칙에 따라 다르다. 무조건 strip()으로 바꾸기 전에 원문 보존이 필요한 필드인지 정하고, 검증과 정규화를 한곳에 모으자.

디버깅할 때는 print(bool(value))만 보지 말고 type(value)와 repr(value)를 함께 본다. "0"은 문자열이므로 참이고 숫자 0은 거짓이다. 웹 입력은 문자열로 들어오는 경우가 있어 변환 전후의 조건 결과가 달라질 수 있다. 기본값을 채우는 위치를 입력 경계로 모으면 호출마다 다른 해석을 하는 문제를 줄일 수 있다.

입력 계약에서 누락·null·빈 값을 구분한다

입력 검증에서 if not value 하나로 모든 오류를 처리하면 유효한 0과 빈 컬렉션까지 거부할 수 있다. API 요청이라면 키가 아예 없음, 키는 있지만 null, 빈 문자열, 숫자 0을 각각 허용할지 먼저 정한다. 값이 정말 없는지만 확인하려면 is None, 비어 있는 컨테이너를 함께 처리하려면 if not value처럼 질문에 맞는 조건을 쓴다.

기본값을 적용한 뒤 원본 상태를 다시 알아야 한다면 변환된 값만 저장해서는 안 된다. 예를 들어 페이지 0과 페이지 미지정을 둘 다 0으로 바꾸더라도 로그·검증에서는 두 입력을 구분해야 오류와 정상 요청을 섞지 않을 수 있다.

핵심 요약

Python은 None, 0, 빈 문자열, 빈 컨테이너를 falsy로 본다. '비었는지'만 묻는 조건에는 if not value가 좋지만, 0과 None의 의미가 다르면 is None으로 구분해야 한다. 조건문을 쓰기 전에 어떤 값이 실제로 유효한지부터 정의하자.

작성자

TaeyoungKim

기초 개념을 구현과 검증, 실제 운영 판단까지 연결해 기록합니다.

#Python#truthy#falsy#조건문

함께 읽으면 좋은 글