Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

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

Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain or CC0-1.0, whichever is more permissive 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

초록

빈 집합을 구성하고 나타내기 위한 새로운 표기법 {/}를 제안합니다. 이는 이에 해당하는 수학 기호 ‘’를 본뜬 것입니다.

이는 각각 (), [], {}를 사용하는 빈 튜플, 리스트 및 딕셔너리에 대한 기존 표기법을 보완합니다.

동기

현재 집합은 표시 구문을 갖는 유일한 내장 컬렉션 타입이지만, 빈 컬렉션을 표현할 표기법은 없습니다. 이 점은 Python Language Reference에서 다음과 같이 기술하면서 지적합니다:

빈 집합은 {}로 구성할 수 없습니다. 이 리터럴은 빈 딕셔너리를 구성합니다.

이는 초보자에게 혼란을 줄 수 있으며, 특히 딕셔너리나 매핑보다 집합을 더 흔히 사용하는 과학 또는 수학적 배경에서 이 언어를 접한 사람들에게 그렇습니다.

빈 집합을 위한 구문 표기법은 set()과 달리 이름 조회가 필요하지 않다는 중요한 이점이 있습니다. {/}는 항상 일관된 의미를 가지므로 초보자에게 핵심 개념을 더 쉽게 가르칠 수 있습니다. 예를 들어 사용자는 set을 지역 변수 이름으로 사용하지 않도록 주의해야 합니다. 그렇게 하면 새 집합을 구성할 수 없기 때문입니다. 이름을 덮어쓴 경우 초보자는 set 타입을 어떻게 복구해야 하는지 모를 수 있으므로 이는 답답한 일이 될 수 있습니다. 이를 위한 방법(예: type({1}))은 즉시 명확하지 않으며, 특히 아직 type 함수에 익숙하지 않을 수 있는 언어 학습자에게 그렇습니다.

마지막으로 이는 영어를 사용하지 않는 사용자에게도 도움이 될 수 있습니다. 언어에 내장된 일반적인 데이터 구조에 대해 문화와 무관한 표기법을 제공하기 때문입니다.

근거

집합은 집합 표기법을 포함하지 않았지만 빈 집합에 {-}를 사용하는 아이디어를 논의한 PEP 218을 통해 Python 2.2에 도입되었습니다.

해당 PEP는 원래 {1,2,3}을 집합 표기법으로, {-}를 빈 집합으로 제안했습니다. Python 2.3의 sets.py를 사용한 경험을 통해 이러한 표기법이 필요하지 않다는 사실이 드러났습니다. 또한 딕셔너리를 한눈에 알아보기 어렵게 만들 위험도 어느 정도 있었습니다.

Python 3.0에서는 집합 리터럴(PEP 3100)을 도입했지만, 실용적인 이유로 제외된 빈 집합 표기법은 이번에도 도입하지 않기로 했습니다(python-3000, April 2006, python-3000, May 2006).

그 이후 이 주제는 다음을 포함한 다양한 제안과 함께 여러 차례 논의되었습니다.

  1. {}를 빈 집합을 의미하도록 변경하고 {:}를 빈 딕셔너리에 사용하는 방안 (python-ideas, January 2008, Discourse, March 2023)
  2. 유니코드 문자(예: 또는 ϕ) (python-ideas, April 2021)
  3. <> (python-ideas, November 2010, Discourse, December 2024)
  4. s{} (python-ideas, June 2009)
  5. {*()}를 사용하고, 이를 BUILD_SET 바이트코드로 컴파일하도록 최적화하는 방안 (Discourse, August 2025 (#37))
  6. {-} (python-ideas, August 2020)
  7. (/) (Discourse, March 2023 (#20))
  8. {,} (Discourse, August 2025)
  9. {/} (python-ideas, January 2008)
  10. 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(){/}로 일괄 변경하도록 제안하여 기존 프로젝트에서 불필요한 변경을 유도하지 않아야 합니다.

보안 관련 사항

없습니다.

교육 방법

모든 사용자에게 {/}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 미래 임포트와 <>를 빈 집합에 함께 사용하면 파서 모호성이 발생합니다. <> <> <>는 무엇을 의미합니까?

s{} 구문을 사용하십시오.

이 구문은 s를 지역 변수로 사용하는 것과 혼동을 일으킬 수 있습니다. 현재 이런 종류의 접두사의 유일한 용도는 문자열 리터럴입니다. 이는 이 PEP의 제안보다 설명하기 어렵습니다.

{*()} 구문을 사용하십시오.

이는 빈 튜플을 집합으로 언패킹하여 빈 집합을 생성하는 방식에 의존합니다. 이는 Python 3.5부터 지원된다는 장점이 있습니다 (PEP 448).

이 표기법을 설명하려면 시퀀스 언패킹, 빈 튜플, 집합 리터럴 구문, 그리고 빈 시퀀스를 언패킹하여 언패킹할 값이 전혀 생성되지 않는다는 개념을 이해해야 합니다.

이는 다루기 힘든 구문이며, 초보자에게 쉽게 가르칠 수 있는 구문이 아닙니다. 사용자가 나중에 이해하거나 온라인에서 찾아볼 것이라는 전제하에 복잡한 표기법을 도입하는 것은 피해야 합니다. 이는 학습자의 주도권을 빼앗습니다. 특히 임의의 코드를 실행할 수 있는 프로그래밍 언어를 사용할 때는 사용자가 작성하는 코드가 무엇을 수행하는지 이해하는 것이 중요합니다.

저자들의 견해로는 {*()}를 빈 집합의 구문으로 장려하는 것은 잘못된 조치입니다. 이는 쉽게 가르치고 이해하고 설명할 수 있는 구문을 설계하려는 의도적인 시도의 결과가 아니라 PEP 448의 부수 효과로 생겨났습니다.

{-} 구문을 사용하십시오.

이 구문은 원래 PEP 218에서 제안되었지만, PEP가 채택되기 전에 PEP에서 삭제되었습니다. 저자들은 와 유사하기 때문에 {/}를 선호합니다.

(/) 구문을 사용하십시오.

이 표기법은 빈 집합 기호(예: U+2205 ∅ EMPTY SET)와 시각적으로 더 유사하다는 이유로 제안되었습니다. 그러나 이는 일반적인 집합 구문에서 완전히 벗어난 것입니다. 저자들은 중괄호를 사용하는 제안된 표기법은 어느 것이든 이 제안보다 낫다고 봅니다. 현재의(Python 3.0 이후) 집합 표기법과 더 일관되기 때문입니다.

저자들은 수학 기호 및 기존 집합 구문과 시각적으로 유사하다는 이점을 결합하기 때문에 (/)와 달리 {/}를 선호합니다.

{,} 구문을 사용하십시오.

저자들이 다음으로 선호하는 선택지입니다. 그러나 빈 컬렉션을 나타내는 데 쉼표 하나를 사용한다면, 빈 튜플이나 리스트에도 이를 사용할 수 없는 이유가 혼란스러울 수 있습니다. 시간이 지나면 [,](,)에 대한 지원을 추가하자는 제안이 나올 수도 있습니다. 이는 ‘이를 수행할 명확한 방법은 하나여야 하며– 가능하면 오직 하나만이어야 합니다 –‘라는 일반 원칙과 충돌합니다. {/}에서처럼 눈에 띄게 다른 형식을 사용하면 빈 집합의 구문이 모든 빈 컬렉션에 적용되는 일반 규칙이 아니라 특수한 경우라는 생각을 강화하는 데 도움이 됩니다.

'{/}'에 사용할 새 토큰을 생성하고 사용합니다.

이 구문을 위한 previous proposals이 이전에도 있었습니다. 이를 위해서는 문자 사이에 공백 없이 '{/}'를 문자 그대로 작성해야 합니다.

그러나 이를 막을 이유를 찾을 수 없으므로 대괄호와 슬래시 사이의 공백을 허용하고, {, /, }를 서로 구분되는 세 개의 토큰으로 취급하기로 했습니다. 그러나 대부분의 사용 사례에는 공백이 포함되지 않을 것으로 예상합니다.

미해결 문제

없습니다.

감사의 말

  • Chris Angelico, Dominykas Grigonis, Ben Hsing, James Webber 및 최근 Discourse 주제에 기여한 기타 기여자에게 감사드립니다.
  • PEP 초안에 유용한 피드백을 주신 Hugo van Kemenade에게 감사드립니다.

각주