노트

EAFP와 LBYL

EAFP and LBYL

CS#python · 연결된 개념 4개

쉽게 말하면

LBYL은 주차장에 들어가기 전에 빈자리 표시판을 확인하는 방식, EAFP는 일단 들어가 보고 자리가 없으면 그때 나오는 방식이에요. 표시판을 본 뒤 들어가는 사이에 자리가 찰 수 있어서, 해 보는 쪽이 더 정확할 때가 있어요.

비유가 깨지는 곳 일단 해 보는 쪽이 늘 나은 건 아니에요. 실패가 흔하면 예외 비용이 커서 if가 낫고, except Exception:처럼 넓게 잡으면 엉뚱한 버그까지 삼켜요.

LBYL(Look Before You Leap, 뛰기 전에 살펴라)은 작업 전에 조건을 먼저 검사하는 스타일이고, EAFP(Easier to Ask Forgiveness than Permission, 허락보다 용서가 쉽다)는 일단 시도하고 실패하면 예외로 처리하는 스타일이다. 파이썬 공식 용어집은 EAFP를 파이썬의 흔한 스타일로 소개한다.

# LBYL
if "port" in config and config["port"].isdigit():
    port = int(config["port"])
else:
    port = 8080
 
# EAFP
try:
    port = int(config["port"])
except (KeyError, ValueError):
    port = 8080

EAFP가 나은 경우

  • 경쟁 상태(race condition)가 없다: "파일이 있으면 연다"를 LBYL로 쓰면 검사와 열기 사이에 파일이 지워질 수 있다. 바로 열고 FileNotFoundError를 잡는 편이 정확하다
  • 검사해야 할 조건이 많아 if가 길어질 때 정상 흐름이 더 잘 보인다
  • 덕 타이핑(duck typing)과 잘 맞는다. "리스트인가?"를 묻지 말고 리스트처럼 써 보고 안 되면 처리한다

LBYL이 나은 경우

  • 실패가 흔한 상황. 예외는 정상 분기보다 비싸서, 절반이 실패하는 검사라면 if가 낫다
  • 실패하면 되돌리기 어려운 부수 효과(side effect)가 시도 중간에 생기는 경우
  • dict.get(key, 기본값)처럼 언어가 이미 LBYL·EAFP를 감춘 도구를 주면 그걸 쓴다

주의

  • except Exception:처럼 넓게 잡으면 엉뚱한 버그까지 삼킨다. 예상한 예외 타입만 좁게 잡고, try 블록도 실패할 수 있는 한 줄만 감싼다(예외 삼키기)
  • 예외를 흐름 제어로 남용하지 않는다. 예외는 "예외적인" 상황을 위한 것이다

예외를 어디서 잡고 던질지의 일반 원칙은 예외 처리 원칙, 조건 검사를 앞에 몰아 빨리 빠져나가는 LBYL 쪽의 정리 기법은 보호 구문를 본다.

출처: Python 용어집: EAFP · LBYL

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 파이썬 기본 컬렉션

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

  • 얕은 복사와 깊은 복사

    얕은 복사(shallow copy)는 바깥 컨테이너만 새로 만들고 안에 든 객체는 원본과 같은 객체를 가리킨다. 깊은 복사(deep copy)는 안쪽 객체까지 재귀적으로 새로 만든다. 중첩된 리스트·딕셔너리를 복사한 뒤 원본이 같이 바뀌는 버그의 원인이 대부분 이 차이다.

  • 섣부른 최적화

    "섣부른 최적화는 모든 악의 근원이다." 도널드 크누스(Donald Knuth)가 1974년 글 「Structured Programming with go to Statements」에서 쓴 말이다. 원문의 맥락은 작은 효율은 대부분(약 97%)의 경우 잊으라는 것이고, 정말 중요한 3%는 놓치지 말라는 말이 이어진다.

  • 가변 기본 인자 함정

    파이썬 함수의 기본값은 함수를 정의할 때 한 번 평가되어 그 객체가 계속 재사용된다. 그래서 리스트·딕셔너리 같은 변경 가능한 객체를 기본값으로 쓰면, 호출할 때마다 같은 객체가 공유되어 값이 쌓인다.

  • 언어적 안티패턴

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

보기 옵션