노트

파이썬의 선 (PEP 20)

The Zen of Python

CS#python · 연결된 개념 6개

쉽게 말하면

파이썬의 선은 파이썬 집안의 가훈 같은 19줄 격언이에요. 숨기기보다 드러내고, 단순하게, 읽기 쉽게 쓰라는 기준이라 코드를 어떻게 짤지 망설일 때 방향을 잡아 줘요.

비유가 깨지는 곳 가훈처럼 추상적으로 들려도 실제 코드 선택으로 이어져요. 예를 들어 '명시적인 게 낫다'는 if not value: 대신 if value is None:처럼 무엇을 확인하는지 드러내라는 뜻이에요.

팀 피터스(Tim Peters)가 파이썬의 설계 철학을 짧은 격언 19줄로 정리한 문서로, PEP(Python Enhancement Proposal) 20으로 등록돼 있다. 인터프리터에서 import this를 실행하면 볼 수 있다. 파이썬 코드뿐 아니라 어떤 언어로 짜든 참고할 만한 원칙이다.

자주 인용되는 줄

  • Explicit is better than implicit. 숨은 동작보다 드러난 코드가 낫다. 마법 같은 자동 처리보다 읽으면 바로 보이는 코드를 고른다 → 최소 놀람의 원칙
  • Simple is better than complex. Complex is better than complicated. 단순할 수 있으면 단순하게, 복잡함이 피할 수 없다면 적어도 뒤엉키지 않게 한다 → KISS 원칙
  • Flat is better than nested. 깊은 중첩보다 평평한 구조가 읽기 쉽다 → 보호 구문
  • Readability counts. 코드는 쓰는 횟수보다 읽히는 횟수가 훨씬 많다 → 인지 부하
  • Errors should never pass silently. Unless explicitly silenced. 에러를 조용히 삼키지 말고, 무시할 때는 의도적으로 드러내서 무시한다 → 예외 삼키기
  • In the face of ambiguity, refuse the temptation to guess. 애매하면 추측하지 말고 명확히 하거나 에러를 낸다
  • There should be one—and preferably only one—obvious way to do it. 같은 일을 하는 방법이 여럿이면 읽는 사람이 모두 알아야 한다
  • If the implementation is hard to explain, it's a bad idea. 설명하기 어려운 구현은 다시 생각해 본다

예

# 암묵적: 빈 리스트, 0, None이 모두 같은 분기로 간다
if not value:
    ...
 
# 명시적: 무엇을 확인하는지 드러난다
if value is None:
    ...

파이썬다운 예외 처리 관용구는 EAFP와 LBYL에서 다룬다.

출처: PEP 20 – The Zen of Python

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 파이썬 기본 컬렉션

    파이썬의 기본 컬렉션은 리스트·튜플·딕셔너리·셋 네 가지다. 가장 중요한 구분은 변경 가능 여부(mutable·immutable)와 순서·중복을 어떻게 다루는가다.

  • 심플 디자인

    켄트 벡이 XP(Extreme Programming)에서 제시한 단순한 설계의 네 가지 규칙. 우선순위 순으로 ① 모든 테스트를 통과하고 ② 의도를 드러내고 ③ 중복이 없고 ④ 요소가 가장 적다. 마틴 파울러가 이렇게 정리한 형태가 널리 쓰인다.

  • 파이썬 클래스 기초

    파이썬 클래스는 데이터 속성(attribute)과 메서드를 묶은 타입이고, 클래스를 호출해 인스턴스(instance)를 만든다. 메서드의 첫 매개변수 self가 호출한 인스턴스 자신이며, 호출할 때는 파이썬이 자동으로 채워 넘긴다.

  • 언어적 안티패턴

    이름, 타입, 주석이 말하는 것과 코드가 실제로 하는 일이 어긋나는 것. 읽는 사람을 잘못된 추측으로 이끈다.

  • 파이썬 모듈과 패키지

    파이썬에서 .py 파일 하나가 모듈(module)이고, 모듈을 모은 디렉터리가 패키지(package)다. import는 다른 모듈의 변수·함수·클래스에 접근할 수 있게 해 주고, 모듈은 처음 import될 때 한 번만 실행된 뒤 캐시된다(sys.modules).

보기 옵션