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 = 8080EAFP가 나은 경우
- 경쟁 상태(race condition)가 없다: "파일이 있으면 연다"를 LBYL로 쓰면 검사와 열기 사이에 파일이 지워질 수 있다. 바로 열고
FileNotFoundError를 잡는 편이 정확하다 - 검사해야 할 조건이 많아
if가 길어질 때 정상 흐름이 더 잘 보인다 - 덕 타이핑(duck typing)과 잘 맞는다. "리스트인가?"를 묻지 말고 리스트처럼 써 보고 안 되면 처리한다
LBYL이 나은 경우
- 실패가 흔한 상황. 예외는 정상 분기보다 비싸서, 절반이 실패하는 검사라면
if가 낫다 - 실패하면 되돌리기 어려운 부수 효과(side effect)가 시도 중간에 생기는 경우
dict.get(key, 기본값)처럼 언어가 이미 LBYL·EAFP를 감춘 도구를 주면 그걸 쓴다
주의
except Exception:처럼 넓게 잡으면 엉뚱한 버그까지 삼킨다. 예상한 예외 타입만 좁게 잡고,try블록도 실패할 수 있는 한 줄만 감싼다(예외 삼키기)- 예외를 흐름 제어로 남용하지 않는다. 예외는 "예외적인" 상황을 위한 것이다
예외를 어디서 잡고 던질지의 일반 원칙은 예외 처리 원칙, 조건 검사를 앞에 몰아 빨리 빠져나가는 LBYL 쪽의 정리 기법은 보호 구문를 본다.
출처: Python 용어집: EAFP · LBYL