TIL - EAFP, LBYL

eslerkang·2021년 11월 30일
0

TIL - Today I Learned

목록 보기
9/19
post-thumbnail

사건의 발달

시작은 평온하게 장고 Validator를 만들고 있을 때였다. 여러가지 조건문을 도배해가며 JsonResponse를 반환해주다가 try-except문을 이럴거면 쓸 필요가 없지 않나 하는 생각이 들어 구글에 django if or try와 같은 검색 키워드를 가지고 검색을 했었다.
그러다가 스택 오버플로우에서 EAFP, LBYL에 관한 이야기를 보게 되었다. LGTM(Looks Good To Me)를 처음 알았을 떄와 같은 신기함을 느끼고 간단하게나마 정리하고자 하였다.

EAFP

EAFP는 'Easier to Ask Forgiveness than Permission'의 약자로 '용서를 구하는게 허락을 받는 것보다 쉽다'는 뜻이다.
왜인지 모르게 오토바이/플스를 사려는 한국의 유부남이 생각나는 표현이다(하지마..?).
그러나 이는 코딩 스타일의 하나로 파이썬이 권장하고 있는(PEP 463) 방식이다.
EAFP는 어떤 동작을 하기 전에 동작을 위한 모든 조건이 정상적이라는 가정 하에 동작을 수행하고, 에러가 발생하면 처리하는 방식으로,

try:
    min_value = data['min']
except KeyError:
    return "No Key 'min'"

과 같이 try-except 문으로 특징지어지며, 코드가 간결하고 직관적이게 된다.
이 스타일은 C, Java 같은 다른 언어에서 자주 사용되는 LBYL과는 대조된다.

LBYL

LBYL은 'Look Before You Leap'의 약자로 '돌다리도 두들겨 보고 건너라'라는 속담과 일맥상통하는 뜻을 가지고 있다. 즉 어떠한 행동을 하기 전에 모든 조건을 확인하고 실행하라는 스타일이다.
이 스타일은 여러 언어들에서 주로 사용되는 것으로 코드를 보면 익숙할 것인데,

if 'min' in data:
    min_value = data['min']
else:
    return "No Key 'min'"

과 같이 if-elif(else if)-else 문으로 특징지어지며 호출, 조회 등의 행동 전에 여러 조건들을 검사하고 진행한다.

EAFP vs LBYL

LBYL의 경우 모든 경우를 미리 핸들링 할 수 있다는 점에서 안전해 보일 수 있으나 그렇지 않기에 파이썬에서는 EAFP를 권장한다.
LBYL을 사용할 경우 위험할 수 있는 상황을 예를 들어보면,

if key in mapping:
    return mapping[key]

와 같은 코드가 있다고 생각해보자. 조건문이 키가 객체에 있는지 확인하고 브라켓 표기법으로 키의 값에 접근하고 있는데, 다중 쓰레드 환경, 비동기적 상황의 경우 조건문을 통과한 직후 키에 해당하는 값이 삭제될 수 있기 때문에 이 코드는 실패할 가능성이 있는 코드가 된다.
이러한 경우를 방지하기 위해 파이썬에서는 우선 행동하고 그 후 예외를 처리하는 EAFP를 권장하고 있다.

profile
Surfer surfing on the dynamic flow of the world

0개의 댓글