LBYL은 실행 전에 조건을 확인하고, EAFP는 먼저 시도한 뒤 예상한 실패를 잡아. Python은 성공 흐름이 또렷하고 검사와 실행 사이의 경쟁 조건을 줄이는 EAFP를 자주 택해. 그렇다고 모든 예외를 삼키라는 뜻은 아니야. 회복할 수 있는 좁은 예외만 처리해.
덕 타이핑은 정확한 클래스 이름보다 필요한 동작을 봐. 반복 가능한 값을 받는 함수가 리스트인지 확인하면 튜플·집합·제너레이터를 괜히 거부해. 직접 순회하거나 Protocol·Iterable 같은 계약으로 필요한 능력을 표현해.
isinstance가 나쁜 것도 아니야. 직렬화처럼 타입마다 형식이 정말 달라지거나 보안 경계를 검증해야 하면 맞는 도구야. 바깥 경계에서 값과 모양을 확인한 뒤에는 세워진 내부 계약을 믿어. 구현 클래스를 습관적으로 제한하지 말고 실제로 필요한 능력만 묻는 게 핵심이야.