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

Python 개선 제안 한국어 번역

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

Table of Contents

번역·라이선스 안내

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

초록

이 PEP는 타입에 ? 연산자를 추가하여 Optional[int] 대신 int?를 작성할 수 있도록 제안합니다.

PEP 철회

Optional[T]를 작성하기 위해 PEP 604에서 도입된 표기법 T|NoneT?의 좋은 대안이며 새로운 구문이 필요하지 않습니다.

T?T|None이라는 의미로 사용하는 것은 TypeScript와도 일관되지 않으며, TypeScript에서는 대략 NotRequired[T]를 의미합니다. 이러한 불일치는 TypeScript에서 Python으로 넘어오는 사람들을 혼란스럽게 할 가능성이 큽니다.

위 내용은 typing-sig 및 이 PEP의 후원자가 합의한 사항을 나타냅니다.

동기

타입은 Python 언어에서 가치 있고 강력한 요소가 되었습니다. 그러나 많은 타입 어노테이션은 장황하며 타입 어노테이션을 사용하는 데 상당한 장벽을 추가합니다. 타이핑 구문을 개선하면 Python 코드에 타입을 추가하는 일이 더 간단해지고 Python 사용자의 개발 경험이 향상됩니다.

이와 유사하게 Union types를 위한 축약 구문을 도입하는 PEP가 승인되어 구현되었습니다.

근거

Python의 타입은 상당히 장황할 수 있으며, 이는 타입 도입을 추진할 때 방해가 될 수 있습니다. 타입을 더 사용하기 편리하게 만들면, PEP 604의 Union 타입에서 했던 것처럼(예: int | str), 새 Python 코드와 기존 Python 코드에 타입을 추가하는 데 필요한 노력을 줄일 수 있습니다. Optional 어노테이션은 부분적으로 타입이 지정된 Python 코드베이스와 완전히 타입이 지정된 Python 코드베이스 모두에서 자주 사용됩니다. 5 well-typed open source projects, on average 7% of annotations를 소규모로 표본 조사한 결과, 어노테이션의 평균 7%에 하나 이상의 선택적 타입이 포함되어 있었습니다. 이는 구문을 업데이트하면 타입을 더 간결하게 만들고, 코드 길이를 줄이며, 가독성을 향상할 가능성이 있음을 보여줍니다.

선택적 타입의 구문을 단순화하는 방안은 타이핑 커뮤니티에서 이전에도 논의되었습니다. 이러한 논의에서 ?가 선호되는 연산자라는 합의가 이루어졌습니다. Python에는 단항 ?를 기본적으로 지원하지 않으므로 이를 런타임에 추가해야 합니다.

Python 문법에 ? 기호를 추가하는 방안은 이전에도 현재 보류된 상태인 PEP 505에서 제안되었습니다. 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, dictNone입니다. 이를 통해 typing에서 가져오지 않고도 Python 코드에 더 많은 어노테이션을 추가할 수 있습니다.

사양

새로운 선택적 구문은 함수, 변수, 속성 및 매개변수 어노테이션에 허용되어야 합니다.

# 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?]): ...

새로운 선택적 구문은 기존의 typing.Optional 구문과 동등해야 합니다.

typing.Optional[int] == int?

새로운 선택적 구문은 기존의 typing.Optional 구문과 동일한 정체성을 가져야 합니다.

typing.Optional[int] is int?

또한 None과의 Union과 동등해야 합니다.

# old syntax
int? == typing.Union[int, None]

# new syntax
int? == int | None

관련 PEP 604에 명시된 새로운 유니온 구문이 isinstanceissubclass에서 지원되므로, 새로운 선택적 구문도 isinstanceissubclass 모두에서 지원되어야 합니다,

isinstance(1, int?) # true
issubclass(Child, Super?) # true

다른 기능을 위해 ? 연산자를 오버로드할 수 있도록 새로운 듀더 메서드를 구현해야 합니다.

하위 호환성

?는 현재 Python 구문에서 사용되지 않으므로 이 PEP는 완전히 하위 호환됩니다.

참조 구현

참조 구현은 here에서 확인할 수 있습니다.

거부된 아이디어

논의된 대안은 다음과 같습니다.

  • ~ 연산자를 ?대신 사용하는 방안이 고려되었습니다.
  • 접두 연산자(?int)입니다.