PEP 802 – 빈 집합을 위한 디스플레이 문법
- Author:
- Adam Turner <adam at python.org>
- Discussions-To:
- Discourse thread
- Status:
- Draft
- Type:
- Standards Track
- Created:
- 08-Aug-2025
- Python-Version:
- 3.15
- Post-History:
- 08-Aug-2025
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain or CC0-1.0, whichever is more permissive 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
빈 집합을 생성하고 표현하기 위한 새로운 표기법 {/}를 제안합니다. 이는 대응하는 수학 기호 ‘∅’를 본뜬 것입니다.
이는 각각 (), [], {}를 사용하는 기존의 빈 튜플, 리스트, 딕셔너리 표기법을 보완합니다.
동기
현재 집합은 디스플레이 문법은 있지만 빈 컬렉션을 표현하는 표기법은 없는 유일한 내장 컬렉션 타입입니다. 파이썬 언어 레퍼런스는 이 점을 다음과 같이 언급합니다:
빈 집합은{}로 만들 수 없습니다. 이 리터럴은 빈 딕셔너리를 만듭니다.
이는 초보자에게 혼란을 줄 수 있으며, 특히 딕셔너리나 맵보다 집합이 더 흔히 쓰일 수 있는 과학이나 수학 분야에서 이 언어로 넘어온 사람들에게 더욱 그렇습니다.
빈 집합을 위한 문법 표기법은 (set()과 달리) 이름 조회가 필요하지 않다는 중요한 이점이 있습니다. {/}는 항상 일관된 의미를 가지므로, 초보자에게 핵심 개념을 가르치기가 더 쉬워집니다. 예를 들어, 사용자는 set을 지역 변수 이름으로 사용하지 않도록 주의해야 합니다. 그렇게 하면 새로운 집합을 만들 수 없게 되기 때문입니다. 초보자는 이름을 덮어쓴 경우 set 타입을 되찾는 방법을 모를 수 있으므로 이는 답답한 일이 될 수 있습니다. 그렇게 하는 기법(예: type({1}))은 바로 떠올리기 어렵습니다. 특히 언어를 배우는 중이라 type 함수에 아직 익숙하지 않을 수 있는 사람들에게는 더욱 그렇습니다.
마지막으로, 이는 언어에 내장된 일반적인 자료 구조에 대해 문화에 구애받지 않는 표기법을 제공하므로 영어를 사용하지 않는 사용자에게 도움이 될 수 있습니다.
근거
집합은 PEP 218을 통해 Python 2.2에 도입되었습니다. 이 PEP는 집합 표기법을 포함하지 않았지만, 빈 집합을 위한 {-} 아이디어를 논의했습니다:
이 PEP는 원래 집합 표기법으로{1,2,3}을, 빈 집합으로{-}를 제안했습니다. Python 2.3의sets.py를 사용해 본 경험에 따르면 이 표기법은 필요하지 않았습니다. 또한 딕셔너리를 한눈에 알아보기 어렵게 만들 위험도 어느 정도 있었습니다.
파이썬 3.0은 집합 리터럴(PEP 3100)을 도입했지만, 이번에도 빈 집합을 위한 표기법은 도입하지 않기로 했으며, 이는 실용적인 이유로 생략되었습니다(python-3000, April 2006, python-3000, May 2006).
그 이후로 이 주제는 여러 차례 논의되었으며, 다음과 같은 다양한 제안이 있었습니다:
{}가 빈 집합을 의미하도록 바꾸고 빈 딕셔너리에는{:}를 사용하는 방안 (python-ideas, January 2008, Discourse, March 2023)- 유니코드 문자(예:
∅또는ϕ) (python-ideas, April 2021) <>(python-ideas, November 2010, Discourse, December 2024)s{}(python-ideas, June 2009){*()}, 그리고 이를BUILD_SET옵코드로 컴파일하도록 최적화하는 방안 (Discourse, August 2025 (#37)){-}(python-ideas, August 2020)(/)(Discourse, March 2023 (#20)){,}(Discourse, August 2025){/}(python-ideas, January 2008)set()(즉, 아무것도 하지 않는 방안)
저자들은 이 선택지들 가운데 가장 낫다고 판단하는 {/}를 표기법으로 제안합니다. 이 표기법은 단순하고 간결하며, 공집합의 수학 표기인 ∅과 닮았다는 장점이 있습니다. 덕분에 거듭제곱을 뜻하는 **나 행렬 곱셈을 뜻하는 @ 같은 언어 내 여러 표기보다 설명하기 쉬운 기억법이 됩니다.
{/} 표기법은 recent Discourse poll에서도 가장 인기가 많았으며, 전체 응답자의 41%, 새로운 문법에 투표한 응답자의 60%가 이를 선택했습니다.
다른 제안들에 대한 간략한 요약은 Rejected Ideas에서 찾을 수 있습니다.
명세
집합 디스플레이의 문법은 다음과 같이 바뀝니다:
set_display ::= "{" ("/" | flexible_expression_list | comprehension) "}"
파서는 (/)와 [/]에 대해 특화된 오류 메시지를 내보내어, 이것이 잘못된 문법임을 알리고 각각 빈 튜플과 빈 리스트의 올바른 형태를 제안합니다.
{/}는 빈 집합의 기본 문법이 됩니다.
>>> type({/})
<class 'set'>
>>> {/} == set()
True
빈 집합의 표현 형식과 문자열 형식은 '{/}'로 바뀝니다.
>>> repr({/})
'{/}'
>>> repr(set())
'{/}'
>>> str({/})
'{/}'
>>> str(set())
'{/}'
set 객체의 동작에는 아무런 변화가 없습니다.
하위 호환성
빈 집합의 repr() 또는 str()에 의존하는 코드는 표현 형식이 바뀌기 때문에 더 이상 동작하지 않습니다.
그 밖에 하위 호환성을 깨뜨리는 변경은 없으며, 빈 집합을 만드는 현재의 모든 생성자는 계속 동작하고, set 타입의 동작도 그대로 유지됩니다.
따라서 set()을 사용하는 현재 코드는 계속 동작하며, 변경하지 않고 그대로 두어도 됩니다. 린터나 포매터 같은 자동화 도구의 개발자는 해당 도구의 사용자가 명시적으로 요청하지 않는 한, set()에서 {/}로의 일괄 변경을 제안하여 기존 프로젝트에 불필요한 ‘변경(churn)’을 부추기는 일을 피해야 합니다.
보안 영향
없습니다.
교육 방법
모든 사용자에게 {/}가 set()의 새로운 표기이며, 그 밖의 모든 면에서 동등하다고 가르칠 수 있습니다. 이를 강화하기 위해, 튜토리얼, 표준 라이브러리 모듈, Python 언어 레퍼런스를 포함한 문서에서 set() 대신 {/}를 사용하도록 갱신할 것입니다.
새로운 사용자에게는 문법을 통해 집합을 소개할 수 있으며, 문법이 있는 네 가지 내장 컬렉션 타입이 모두 빈 형태를 가진다는 점을 짚어 줄 수 있습니다: (), [], {/}, {}.
빈 집합은 빈 딕셔너리와 구별하기 위해 슬래시를 사용합니다. 이 문법을 사용하는 이유는 공집합을 나타내는 수학 기호(’∅’)와 닮았기 때문입니다. 이는 초보자, 특히 수학이나 과학 배경을 가진 사람들을 가르칠 때 유용한 기억법으로 활용할 수 있습니다.
참조 구현
이 PEP의 참조 구현은 Github의 CPython 저장소에 풀 리퀘스트로 올라와 있습니다: python/cpython#137565.
기각된 아이디어
{}가 빈 집합을 뜻하도록 바꾸고 빈 딕셔너리에는 {:}를 사용하기
이는 하위 호환성을 완전히 깨뜨리는 변경이 되며, 현재의 모든 빈 dict 객체가 집합이 됩니다.
유니코드 문자 사용하기 (예: ∅ 또는 ϕ)
유니코드 문자 ‘U+2205 ∅ EMPTY SET’은 현재 유효한 식별자가 아닙니다. 유니코드 문자는 표준 키보드에 없으므로, 이를 문법으로 도입하면 사용하기 어렵습니다.
‘U+03C6 ϕ GREEK SMALL LETTER PHI’나 ‘U+00D8 Ø LATIN CAPITAL LETTER O WITH STROKE’처럼 ∅와 비슷하게 생긴 다른 문자를 사용하면, 유니코드 문자를 사용할 때의 단점은 그대로이면서 혼란은 더 커집니다.
<> 문법 사용
이 문법은 비어 있지 않은 집합의 문법과 닮은 점이 없습니다. 이는 이 PEP의 제안보다 설명하기가 더 어렵습니다.
게다가 이 문법은 역사적으로 부등 연산자로 사용되었으며, 지금도 from __future__ import barry_as_FLUFL로 사용할 수 있습니다. barry_as_FLUFL future 임포트와 공집합을 나타내는 <>를 함께 사용하면 파서에 모호성이 생깁니다. <> <> <>는 무엇을 의미하겠습니까?
s{} 문법 사용
이 문법은 지역 변수로 쓰인 s와 혼동을 일으킬 수 있습니다. 현재 이런 종류의 접두사는 문자열 리터럴에만 사용됩니다. 이는 이 PEP의 제안보다 설명하기가 더 어렵습니다.
{*()} 문법 사용
이 방법은 빈 튜플을 집합 안에 언패킹하여 빈 집합을 만드는 방식에 의존합니다. 이 방식은 Python 3.5부터 지원된다는 이점이 있습니다(PEP 448).
이 표기법을 설명하려면 시퀀스 언패킹, 빈 튜플, 집합 리터럴 문법, 그리고 빈 시퀀스를 언패킹하면 언패킹할 값이 하나도 나오지 않는다는 개념을 이해해야 합니다.
이는 다루기 불편한 문법이며, 초보자에게 쉽게 가르칠 수 있는 문법이 아닙니다. 사용자가 나중에 이해하게 될 것이라거나 온라인에서 찾아볼 수 있다는 단서를 달고 복잡한 표기법을 도입하는 일은 피해야 합니다. 이는 학습자에게서 주도권을 빼앗습니다. 특히 임의의 코드를 실행할 수 있는 프로그래밍 언어를 사용할 때는 사용자가 자신이 작성하는 코드가 무엇을 하는지 이해하는 것이 중요합니다.
저자들은 {*()}를 빈 집합의 문법으로 장려하는 것은 실수라고 생각합니다. 이 문법은 가르치고 이해하고 설명하기 쉬운 문법을 설계하려는 의도적인 시도가 아니라 PEP 448의 부수 효과로 생겨난 것입니다.
{-} 문법 사용
이 문법은 원래 PEP 218에서 제안되었지만, 해당 PEP가 수락되기 전에 PEP에서 제거되었습니다. 저자들은 ∅과 닮았다는 이유로 {/}를 선호합니다.
(/) 문법 사용
이 표기법은 공집합 기호(예: U+2205 ∅ EMPTY SET)와 시각적으로 더 닮았다는 이유로 제안되었습니다. 그러나 이 표기법은 일반적인 집합 문법에서 완전히 벗어납니다. 저자들이 보기에는, 중괄호를 사용하는 제안된 표기법 중 어느 것이든 이 제안보다 낫습니다. 그것들이 현재(Python 3.0 이후)의 집합 표기법과 더 일관되기 때문입니다.
저자들이 {/}를 선호하는 이유는 (/)와 달리 수학 기호와도, 기존 집합 문법과도 시각적으로 닮았다는 장점을 모두 갖추었기 때문입니다.
{,} 문법 사용
이것은 저자들이 그다음으로 선호하는 방안입니다. 그러나 쉼표 하나로 빈 컬렉션을 나타낸다면, 왜 이것을 빈 튜플이나 리스트에는 사용할 수 없는지 혼란스러울 수 있습니다. 시간이 지나면 [,]와 (,)를 지원하자는 제안이 나올 수도 있습니다. 이는 ‘그것을 하는 명확한 방법이 하나– 가급적이면 오직 하나만 –있어야 한다’라는 일반 원칙과 충돌합니다. {/}처럼 눈에 띄게 다른 형태를 사용하면, 빈 집합의 문법이 모든 빈 컬렉션에 적용되는 일반 규칙이 아니라 특수한 경우라는 생각을 강화하는 데 도움이 됩니다.
'{/}'를 위한 새 토큰을 만들어 사용하기
이 구문을 위한 새 토큰을 만들자는 이전 제안들이 있었습니다. 이렇게 하면 '{/}'를 문자 사이에 공백 없이 문자 그대로 작성해야 합니다.
저희는 그 대신 괄호와 슬래시 사이에 공백을 허용하고 {, /, }를 세 개의 별개 토큰으로 취급하기로 했습니다. 이를 막아야 할 이유를 전혀 찾을 수 없기 때문입니다. 그러나 대다수의 사용에서는 공백을 포함하지 않을 것으로 예상합니다.
미해결 문제
없습니다.
감사의 글
- Chris Angelico, Dominykas Grigonis, Ben Hsing, James Webber, 그리고 최근 Discourse 토픽의 다른 기여자들.
- PEP 초안에 유익한 피드백을 주신 Hugo van Kemenade.
각주
Copyright
This document is placed in the public domain or under the CC0-1.0-Universal license, whichever is more permissive.