본문으로 건너뛰기

[Final] PEP 308 - Conditional Expressions

원문 링크: PEP 308 - Conditional Expressions

상태: Final | 유형: Standards Track | 작성일: 07-Feb-2003

PEP 308 – 조건부 표현식 (Conditional Expressions) 번역 및 요약

개요

PEP 308은 Python에 조건부 표현식을 추가하는 제안입니다. 이 PEP는 "X if C else Y" 형태의 조건부 표현식이 Python 2.5에 추가될 것을 확정지었습니다. 주된 동기는 and 및 or 연산자를 사용하여 유사한 효과를 얻으려던 시도들이 오류 발생 가능성이 높았기 때문입니다.

도입 배경

이전에도 조건부 표현식 추가에 대한 커뮤니티의 요구가 있었으나, 최적의 구문에 대한 합의 부족으로 번번이 좌절되었습니다. 이 문제는 최종적으로 BDFL(자비로운 종신 독재자, Guido van Rossum)의 판단에 따라 해결되었습니다. BDFL은 표준 라이브러리 전체에 새로운 구문을 적용하여 실제 사용 사례를 검토함으로써 이 결정의 유효성을 확인했습니다.

제안 내용: X if C else Y

2005년 9월 29일, Guido van Rossum은 X if C else Y 형태의 조건부 표현식을 추가하기로 결정했습니다.

동작 방식:

  1. 먼저 C (조건)이 평가됩니다.
  2. C가 참(True)이면 X가 평가되고 전체 표현식의 결과가 됩니다.
  3. C가 거짓(False)이면 Y가 평가되고 전체 표현식의 결과가 됩니다.

문법 변경: Python의 문법에 다음과 같은 변경이 적용되었습니다:

test: or_test ['if' or_test 'else' test] | lambdef
or_test: and_test ('or' and_test)*
...

하위 호환성: 새로운 구문은 거의 사소한 문법적 하위 호환성 문제를 일으킬 수 있었습니다. 이전 Python 버전에서는 [f for f in lambda x: x, lambda x: x **2 if f(1) == 1] 와 같은 리스트 컴프리헨션(List Comprehension)이 유효했습니다. 하지만 Python 3.0에서는 람다(lambda) 시리즈를 괄호로 묶어야 합니다 (예: [f for f in (lambda x: x, lambda x: x** 2) if f(1) == 1]). 이는 lambda가 if-else 표현식보다 결합력이 약하기 때문입니다.

Python 2.5에서는 약간 다른 문법이 사용되어 하위 호환성을 더 유지했지만, 이 위치에서 사용되는 람다의 본문에 괄호 없는 조건 표현식을 포함하는 것을 금지함으로써 람다의 문법을 제약했습니다. 예를 들어, [f for f in 1, lambda x: x if x >= 0 else -1]는 유효하지 않습니다. 대신 [f for f in 1, (lambda x: x if x >= 0 else -1)] 또는 [f for f in 1, lambda x: (x if x >= 0 else -1)]와 같이 괄호를 사용해야 합니다.

대안 및 논의

과거에 다양한 조건부 표현식 구문이 제안되었고 논의되었습니다:

  • (if <condition>: <expression1> else: <expression2>) : 괄호가 필수이며, elif 확장이 가능합니다. 문장 구문과의 혼동 가능성, 콜론(colon)의 의미 과부하 등의 단점이 지적되었습니다.
  • <condition> and <expression1> else <expression2> : and/or 연산자를 기반으로 한 최소 침습적(minimally invasive) 변경으로 제안되었으나, else가 and의 기존 의미를 변경한다는 지적이 있었습니다.
  • <condition> then <expression1> else <expression2> : 간단한 시각적 분석, 괄호 불필요, 기존 키워드 의미 변경 없음 등의 장점이 있었으나, 새 키워드 도입 비용이 단점으로 지적되었습니다.
  • C-언어 스타일: <condition> ? <expression1> : <expression2> : Eric Raymond가 구현하기도 했으나, Python에서 콜론의 다양한 용도와 C-언어에 익숙하지 않은 사용자에게는 이해하기 어렵다는 이유로 BDFL이 거부했습니다.
  • 원래 PEP 제안: <expression1> if <condition> else <expression2> : 이 제안은 순서가 뒤바뀐 배열이 많은 토론 참여자들에게 불편하다는 의견이 많았습니다. 특히 <expression1>이 길 경우, 조건부를 놓치기 쉽다는 지적이 있었습니다.
  • 내장 함수 (예: cond(<condition>, <expression1>, <expression2>)) : 이 방식은 expression1과 expression2가 함수 호출 전에 모두 평가되어야 하므로 단락 평가(short-circuit evaluation)가 불가능하다는 단점이 있습니다. 키워드로 만들 경우에도 혼란을 줄 수 있습니다.

단락 평가 (Short-Circuit Behavior)

조건부 표현식에서 단락 평가는 매우 중요하게 고려되었습니다.

  • X if C else Y 구문은 C가 참이면 X만 평가하고, 거짓이면 Y만 평가하는 단락 평가를 지원합니다.
  • 이는 and 및 or 연산자가 두 번째 피연산자를 첫 번째 피연산자에 따라 평가하는 방식과 유사합니다.

단락 평가는 다음과 같은 경우에 유용합니다:

  • 표현식에 부수 효과(side-effects)가 있을 때
  • 하나 또는 두 표현식 모두 리소스 집약적일 때
  • 조건이 표현식의 유효성에 대한 가드(guard) 역할을 할 때

예시:

data = source.readlines() if isinstance(source, file) else source.split()

이 경우, readlines()는 파일 포인터를 이동시키고, 긴 소스에 대해 두 대안 모두 시간이 걸리며, split()은 문자열에만, readlines()는 파일 객체에만 유효합니다. 단락 평가는 불필요한 연산을 방지하고 잠재적인 오류를 막을 수 있습니다. BDFL은 if-then-else 구문이 언어에 추가되려면 단락 평가 동작이 필수적이라고 보았습니다.

투표 결과

조건부 표현식 도입에 대한 커뮤니티 투표가 진행되었으며, 다양한 대안에 대한 지지도가 나뉘었습니다. 최종적으로 "X if C else Y" 구문이 가장 많은 지지를 얻어 채택되었습니다.

결론

PEP 308을 통해 Python 언어에 X if C else Y 형태의 조건부 표현식이 성공적으로 추가되었습니다. 이는 and/or 연산자의 오용을 줄이고, 더 간결하고 읽기 쉬운 코드를 작성할 수 있게 하며, 중요한 단락 평가 기능을 제공합니다.

⚠️ 알림: 이 문서는 AI를 활용하여 번역되었으며, 기술적 정확성을 보장하지 않습니다. 정확한 내용은 반드시 원문을 확인하시기 바랍니다.

댓글

관련 포스트

Python 의 다른글