PEP 645 – 선택적 타입을 x?로 작성할 수 있도록 허용
- Author:
- Maggie Moss <maggiebmoss at gmail.com>
- Sponsor:
- Guido van Rossum <guido at python.org>
- Status:
- Withdrawn
- Type:
- Standards Track
- Created:
- 25-Aug-2020
- Resolution:
- Typing-SIG message
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain or CC0-1.0, whichever is more permissive 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
이 PEP는 Optional[int] 대신 int?로 작성할 수 있도록 타입에 ? 연산자를 추가할 것을 제안합니다.
PEP 철회
Optional[T]를 작성하기 위해 PEP 604에서 도입된 T|None 표기법은 T?의 훌륭한 대안이며 새로운 문법을 필요로 하지 않습니다.
또한 T?를 T|None이라는 의미로 사용하는 것은 이 표기가 대략 NotRequired[T]를 의미하는 TypeScript와도 일관되지 않습니다. 이러한 불일치는 TypeScript에서 Python으로 넘어오는 사람들에게 혼란을 줄 가능성이 높습니다.
위 내용은 typing-sig와 이 PEP 후원자의 합의를 나타냅니다.
동기
타입은 Python 언어에서 가치 있고 강력한 부분이 되었습니다. 그러나 많은 타입 어노테이션이 장황하여 타입 어노테이션을 사용하는 데 상당한 부담을 더합니다. 타이핑 문법을 개선하면 Python 코드에 타입을 추가하는 일이 더 간단해지고 Python 사용자의 개발 경험이 향상됩니다.
비슷한 맥락에서, Union 타입에 대한 축약 문법을 도입하는 PEP가 승인되어 구현되었습니다.
근거
Python의 타입은 상당히 장황할 수 있으며, 이는 타입 도입을 추진할 때 걸림돌이 될 수 있습니다. PEP 604에서 Union 타입에 대해 했던 것처럼(예: int | str) 타입을 더 사용하기 편리하게 만들면, 새로운 Python 코드와 기존 Python 코드에 타입을 추가하는 데 드는 노력이 줄어들 것입니다. Optional 어노테이션은 부분적으로 타입이 지정된 Python 코드 베이스와 완전히 타입이 지정된 Python 코드 베이스 모두에서 자주 사용됩니다. 소규모로 표본 조사한 타입이 잘 지정된 오픈 소스 프로젝트 5개에서 평균 7%의 어노테이션이 하나 이상의 선택적 타입을 포함했습니다. 이는 문법을 개선하면 타입을 더 간결하게 만들고, 코드 길이를 줄이며, 가독성을 향상할 잠재력이 있음을 보여 줍니다.
선택적 타입의 문법을 단순화하는 방안은 타이핑 커뮤니티 내에서 이전에 논의된 바 있습니다. 이러한 논의에서 합의된 바는 ?가 선호되는 연산자라는 것이었습니다. Python에는 단항 ?에 대한 네이티브 지원이 없으므로 이를 런타임에 추가해야 합니다.
Python 문법에 ? 기호를 추가하는 것은 이전에 PEP 505에서 제안된 바 있으며, 이 PEP는 현재 보류 상태입니다. PEP 505는 다음을 제안합니다.
- “None 병합” 이항 연산자
??- “None 인식 속성 접근” 연산자
?.(“maybe dot”)- “None 인식 인덱싱” 연산자
?[](“maybe subscript”)
향후 PEP 505가 승인되더라도, 이 PEP에서 제안하는 타이핑 전용 ?와 충돌하지 않을 것입니다. 또한, ?의 모든 사용이 개념적으로 연관되어 있으므로, Python을 배우는 데 혼란을 주거나 빠른 시각적 컴프리헨션(이해)에 방해가 되지 않을 것입니다.
후위 연산자를 사용하는 제안된 문법은 C#, TypeScript, Swift와 같은 다른 타입 언어에서 볼 수 있는 선택적 타입 문법을 본뜬 것입니다. 이들 언어가 널리 채택되고 인기가 높다는 것은 Python 개발자들이 이미 이 문법에 익숙할 가능성이 높다는 것을 의미합니다.
// Optional in Swift
var example: String?
// Optional in C#
string? example;
이 문법을 추가하면 내장 타입을 어노테이션으로 사용하는, 자주 쓰이는 패턴도 따르게 됩니다. 예를 들면 list, dict, None이 있습니다. 이를 통해 typing에서 임포트하지 않고도 Python 코드에 더 많은 어노테이션을 추가할 수 있습니다.
명세
새 optional 문법은 함수, 변수, 속성, 매개변수 어노테이션에서 허용되어야 합니다.
# instead of
# def foo(x: Optional[int], y: Optional[str], z: Optional[list[int]): ...
def foo(x: int?, y: str?, x: list[int]?): ...
# def bar(x: list[typing.Optional[int]]): ...
def bar(x: list[int?]): ...
새 optional 문법은 기존 typing.Optional 문법과 동등해야 합니다
typing.Optional[int] == int?
새 optional 문법은 기존 typing.Optional 문법과 같은 동일성(identity)을 가져야 합니다.
typing.Optional[int] is int?
또한 None과의 Union과도 동등해야 합니다.
# old syntax
int? == typing.Union[int, None]
# new syntax
int? == int | None
PEP 604에 명시된 새 Union 문법이 isinstance와 issubclass에서 지원되므로, 새 optional 문법도 isinstance와 issubclass 모두에서 지원되어야 합니다,
isinstance(1, int?) # true
issubclass(Child, Super?) # true
? 연산자를 다른 기능에 맞게 오버로드할 수 있도록 새로운 던더 메서드를 구현해야 합니다.
하위 호환성
?는 현재 Python 문법에서 사용되지 않으므로, 이 PEP는 완전한 하위 호환성을 갖습니다.
참조 구현
참조 구현은 여기에서 찾을 수 있습니다.
기각된 아이디어
논의된 대안은 다음과 같습니다
?대신~연산자를 사용하는 방안이 검토되었습니다.- 접두 연산자(
?int).
Copyright
This document is placed in the public domain or under the CC0-1.0-Universal license, whichever is more permissive.