[Draft] PEP 802 - Display Syntax for the Empty Set
원문 링크: PEP 802 - Display Syntax for the Empty Set
상태: Draft 유형: Standards Track 작성일: 08-Aug-2025
PEP 802 – 빈 집합(Empty Set)을 위한 표기법 제안 번역 및 정리
개요 (Abstract)
PEP 802는 빈 집합(empty set)을 생성하고 표현하기 위한 새로운 표기법인 {/}
를 제안합니다. 이 표기법은 수학적 기호 ‘∅’에서 영감을 받았습니다. 이는 빈 튜플 ()
, 빈 리스트 []
, 빈 딕셔너리 {}
와 같이 기존에 존재하는 다른 빈 컬렉션 타입들의 표기법을 보완합니다.
동기 (Motivation)
현재 set
은 디스플레이 구문(display syntax)을 가지는 유일한 내장 컬렉션 타입이지만, 빈 컬렉션을 표현하는 표기법은 없습니다. Python 언어 참조(Python Language Reference)에서도 “빈 집합은 {}
로 생성할 수 없습니다. 이 리터럴은 빈 딕셔너리를 생성합니다.”라고 명시하고 있으며, 이는 초보자들에게 혼란을 줄 수 있습니다. 특히 과학 또는 수학적 배경을 가진 사용자들에게는 딕셔너리나 맵보다 집합이 더 흔하게 사용될 수 있기 때문에 더욱 그렇습니다.
빈 집합에 대한 구문 표기법은 set()
처럼 이름을 조회할 필요가 없다는 중요한 이점이 있습니다. {/}
는 항상 일관된 의미를 가지므로, 초보자에게 핵심 개념을 가르치기 쉽게 만듭니다. 예를 들어, set
을 지역 변수 이름으로 사용하면 새 집합을 생성할 수 없게 되는데, 초보자들은 set
타입을 복구하는 방법을 모를 수 있습니다. type({1})
과 같은 복구 기술은 언어를 배우는 사람들에게는 즉각적으로 명확하지 않을 수 있습니다.
마지막으로, 이 표기법은 영어를 사용하지 않는 사용자들에게도 도움이 될 수 있습니다. 언어에 내장된 일반적인 데이터 구조에 대한 문화적 제약이 없는 표기법을 제공하기 때문입니다.
근거 (Rationale)
집합은 PEP 218을 통해 Python 2.2에 도입되었으나, 당시에는 집합 표기법이 포함되지 않았습니다. 다만, 빈 집합을 위한 {-}
에 대한 아이디어가 논의된 적이 있습니다. Python 3.0에서는 집합 리터럴(PEP 3100)이 도입되었지만, 실용적인 이유로 빈 집합에 대한 표기법은 다시 제외되었습니다.
이후 이 주제는 여러 차례 논의되었으며, 다양한 제안들이 있었습니다. 저자들은 이 중에서 {/}
를 최선의 선택으로 제안합니다. 이는 간단하고 간결하며, 빈 집합을 나타내는 수학적 표기법 ‘∅’와 유사하다는 이점이 있습니다. 따라서 지수화를 위한 **
나 행렬 곱셈을 위한 @
와 같은 다른 언어 요소들보다 기억하기 쉽고 설명하기 용이합니다.
{/}
표기법은 최근 Discourse 설문조사에서도 가장 인기가 많았으며, 전체 응답자의 41%, 새로운 구문 투표자의 60%가 이를 선택했습니다. 다른 제안들에 대한 간략한 요약은 “거부된 아이디어(Rejected Ideas)” 섹션에서 찾아볼 수 있습니다.
명세 (Specification)
set
디스플레이를 위한 문법은 다음과 같이 변경될 예정입니다.
set_display ::= "{" ("/" | flexible_expression_list | comprehension) "}"
파서는 (/)
및 [/]
에 대해 특별한 오류 메시지를 발행하여, 이것이 유효하지 않은 구문임을 나타내고 각각 빈 튜플과 빈 리스트의 올바른 형식을 제안할 것입니다.
{/}
는 빈 집합의 기본 구문이 될 것입니다.
>>> type({/})
<class 'set'>
>>> {/} == set()
True
빈 집합의 표현(repr()
) 및 문자열(str()
) 형식은 이제 '{/}'
로 변경될 것입니다.
>>> repr({/})
'{/}'
>>> repr(set())
'{/}'
>>> str({/})
'{/}'
>>> str(set())
'{/}'
set
객체의 동작에는 변경 사항이 없을 것입니다.
하위 호환성 (Backwards Compatibility)
빈 집합의 repr()
또는 str()
결과에 의존하는 코드는 표현 방식이 변경되므로 더 이상 작동하지 않을 것입니다.
다른 하위 호환성 문제는 없을 것입니다. 빈 집합을 위한 모든 현재 생성자는 계속 작동할 것이며, set
타입의 동작은 변경되지 않습니다. 따라서 set()
을 사용하는 현재 코드는 계속 작동하며 변경할 필요가 없습니다. 린터(linter) 및 포맷터(formatter)와 같은 자동화 도구 개발자들은 사용자로부터 명시적으로 요청받지 않는 한, 기존 프로젝트에서 set()
을 {/}
로 일괄 변경하도록 권장하여 불필요한 ‘churn’ (잦은 변경)을 유도하지 않도록 해야 합니다.
보안 영향 (Security Implications)
없음.
교육 방법 (How to Teach This)
모든 사용자에게 {/}
가 set()
의 새로운 표현 방식이며, 다른 모든 면에서 동등하다고 가르칠 수 있습니다. 이를 강화하기 위해 튜토리얼, 표준 라이브러리 모듈 및 Python 언어 참조를 포함한 문서에서 set()
대신 {/}
를 사용하도록 업데이트할 것입니다.
새로운 사용자에게는 구문을 통해 set
을 소개하며, 구문을 가진 네 가지 내장 컬렉션 타입( ()
, []
, {/}
, {}
)이 모두 빈 형태를 가지고 있음을 언급할 수 있습니다.
빈 집합은 빈 딕셔너리와 구별하기 위해 슬래시(/
)를 사용합니다. 이 구문은 빈 집합을 나타내는 수학적 기호(‘∅’)와 유사하게 생겼기 때문에 사용됩니다. 이는 특히 수학이나 과학 배경을 가진 초보자들을 가르칠 때 유용한 기억술(mnemonic)로 활용될 수 있습니다.
참조 구현 (Reference Implementation)
이 PEP의 참조 구현은 GitHub CPython 저장소의 풀 리퀘스트(pull request) 형태로 존재합니다: python/cpython#137565
.
거부된 아이디어 (Rejected Ideas)
다음은 이 PEP에서 고려되었으나 거부된 다른 아이디어들입니다.
-
{}
를 빈 집합으로,{:
를 빈 딕셔너리로 변경: 이것은 완전히 하위 호환되지 않는 변경이며, 모든 현재 빈 딕셔너리 객체가 집합으로 변환될 것입니다. -
유니코드 문자 사용 (예:
∅
또는ϕ
): 유니코드 문자 ‘U+2205 ∅ EMPTY SET’는 현재 유효한 식별자가 아닙니다. 유니코드 문자를 구문으로 도입하는 것은 표준 키보드에 없기 때문에 사용하기 어려울 것입니다. ‘U+03C6 ϕ GREEK SMALL LETTER PHI’나 ‘U+00D8 Ø LATIN CAPITAL LETTER O WITH STROKE’와 같이 ‘∅’처럼 보이는 다른 문자를 사용하는 것은 동일한 단점을 가지면서 더 혼란스러울 수 있습니다. -
<>
구문 사용: 이것은 비어 있지 않은 집합의 구문과 유사성이 없습니다. 이 PEP의 제안보다 설명하기 어려울 것입니다. 또한, 이 구문은 불평등 연산자(!=
이전의not equal
)로 역사적으로 사용되었으며,from __future__ import barry_as_FLUFL
을 통해 여전히 접근할 수 있습니다.barry_as_FLUFL
퓨처 임포트와 빈 집합을 위한<>
를 함께 사용하면 파서(parser) 모호성이 발생할 수 있습니다 (<> <> <>
는 무엇을 의미할까요?). -
s{}
구문 사용: 이 구문은s
가 지역 변수로 사용될 경우 혼란을 야기할 수 있습니다. 현재 이러한 종류의 접두사 사용은 문자열 리터럴에만 해당됩니다. 이 PEP의 제안보다 설명하기 어려울 것입니다. -
{*()}
구문 사용: 이는 빈 튜플을 집합으로 언패킹(unpacking)하여 빈 집합을 생성하는 방식입니다. Python 3.5 (PEP 448)부터 지원된다는 이점이 있습니다. 그러나 이 표기법을 설명하려면 시퀀스 언패킹(sequence unpacking), 빈 튜플, 집합 리터럴 구문, 그리고 빈 시퀀스를 언패킹하여 값을 생성하지 않는다는 개념을 이해해야 합니다. 이는 다루기 힘든 구문이며, 초보자에게 쉽게 가르칠 수 있는 것이 아닙니다. 저자들은{*()}
를 빈 집합의 구문으로 권장하는 것은 잘못된 선택이라고 판단했습니다. -
{-}
구문 사용: 이 구문은 원래 PEP 218에서 제안되었으나, PEP가 승인되기 전에 삭제되었습니다. 저자들은 ‘∅’와의 유사성 때문에{/}
를 선호합니다. -
(/)
구문 사용: 이 표기법은 빈 집합 기호(‘∅’)와 더 나은 시각적 유사성을 가진다고 제안되었지만, 일반적인 집합 구문과는 완전히 다릅니다. 저자들에게는{}
를 사용하는 다른 제안들이 현재(Python 3.0 이후)의 집합 표기법과 더 일관성이 있으므로, 이 제안보다 낫다고 보았습니다. 저자들은 수학적 기호와 기존 집합 구문 모두에 대한 시각적 유사성의 이점을 결합하는{/}
를 선호합니다. -
{,}
구문 사용: 이것은 저자들이 다음으로 선호하는 옵션이었으나, 단일 쉼표가 빈 컬렉션을 나타내는 데 사용된다면 빈 튜플이나 리스트에 왜 사용될 수 없는지 혼란스러울 수 있습니다.{/}
와 같이 시각적으로 다른 형태를 가지는 것이 빈 집합 구문이 모든 빈 컬렉션에 대한 일반적인 규칙이 아니라 특별한 경우라는 생각을 강화하는 데 도움이 된다고 보았습니다. -
'{/}'
를 위한 새로운 토큰 생성 및 사용: 이 구문을 위한 새로운 토큰을 생성하자는 이전 제안들이 있었습니다. 이는 문자들 사이에 공백 없이'{/}'
를 문자 그대로 작성해야 할 것입니다. 저자들은 대신 괄호와 슬래시 사이에 공백을 허용하여{
,/
,}
를 세 개의 별개의 토큰으로 처리하기로 했습니다.
⚠️ 알림: 이 문서는 AI를 활용하여 번역되었으며, 기술적 정확성을 보장하지 않습니다. 정확한 내용은 반드시 원문을 확인하시기 바랍니다.
Comments