PEP 781 – TYPE_CHECKING을 내장 상수로 만들기
- Author:
- Inada Naoki <songofacandy at gmail.com>
- Discussions-To:
- Discourse thread
- Status:
- Draft
- Type:
- Standards Track
- Topic:
- Typing
- Created:
- 24-Mar-2025
- Python-Version:
- 3.15
- Post-History:
- 11-Jan-2025, 24-Mar-2025
Table of Contents
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain or CC0-1.0, whichever is more permissive 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
이 PEP는 타입 어노테이션을 사용하는 Python 코드 작성 환경을 개선하기 위해 새로운 내장 변수인 TYPE_CHECKING를 추가할 것을 제안합니다. 코드가 정적 타입 검사기에 의해 분석될 때는 True로, 정상적인 런타임 실행 중에는 False로 평가됩니다. 이 변수가 대체하는 typing.TYPE_CHECKING과 달리, import 문이 필요하지 않습니다.
동기
타입 어노테이션은 PEP 484에 의해 Python에 정의되었으며, 폭넓게 채택되었습니다. 모든 항목에 타입 어노테이션을 지정한 코드의 한 가지 문제는 관련 이름을 스코프에 포함하려면 훨씬 더 많은 import가 필요하다는 점이며, 신중하게 설계하지 않으면 import 순환이 발생할 가능성이 있습니다. 이는 PEP 563 및 이후의 PEP 649에서 인식되었으며, 이 PEP들은 타입 어노테이션의 지연 평가를 위한 서로 다른 두 가지 메커니즘을 도입합니다. PEP 563에서 언급하듯이, “타입 힌트는 … 계산 비용이 전혀 들지 않는 것이 아닙니다.” 따라서 typing.TYPE_CHECKING 상수가 도입되었습니다, 처음에는 순환 import를 끊는 데 도움을 주기 위해서였습니다.
명령줄 인터페이스, 애플리케이션 또는 핵심 라이브러리와 같이 시작 시간이 중요한 상황에서 프로그래머는 런타임 실행에 필요하지 않은 모든 import 문을 ‘TYPE_CHECKING 블록’ 안에 배치하거나, 특정 import를 함수 내부로 미루기도 합니다. 그러나 typing 모듈 자체를 import하는 데 최대 10ms가 걸릴 수 있으며, 이는 Python이 초기화되는 데 걸리는 시간보다 깁니다. typing 모듈을 import하는 데 걸리는 시간은 분명히 무시할 수 없습니다.
typing에서 TYPE_CHECKING을 import하지 않기 위해 개발자는 현재 TYPE_CHECKING = False와 같은 모듈 수준 변수를 정의하거나 if False: # TYPE_CHECKING과 같은 코드를 사용합니다. 표준 방법을 제공하면 많은 도구가 동일한 동작을 일관되게 구현할 수 있습니다. 또한 생태계의 서드파티 도구가 보장된 의미론을 갖는 단일 동작으로 표준화할 수 있습니다. 예를 들어 일부 정적 타입 검사기는 현재 로컬 상수를 허용하지 않고 typing.TYPE_CHECKING만 인식합니다.
사양
TYPE_CHECKING은 내장 상수이며 그 값은 False입니다. True, False, None 및 __debug__와 달리 TYPE_CHECKING은 실제 상수가 아니므로, 여기에 할당해도 SyntaxError가 발생하지 않습니다.
정적 타입 검사기는 typing.TYPE_CHECKING과 마찬가지로 TYPE_CHECKING을 True로 취급해야 합니다.
이 PEP가 승인되면 새로운 TYPE_CHECKING 상수를 사용하는 방식이 권장되는 접근법이 되며, typing.TYPE_CHECKING을 import하는 방식은 더 이상 사용되지 않게 됩니다. typing의 런타임 영향을 최소화하기 위해, 이 사용 중단은 Python 3.13의 지원 종료 예정일인 2029년 10월보다 이르지 않게 DeprecationWarning을 발생시킵니다.
대신 타입 검사기는 검사 대상 프로그램의 목표 버전이 Python 3.14 이상으로 지정된 경우 이러한 사용 중단된 사용법에 대해 경고할 수 있습니다.
하위 호환성
TYPE_CHECKING은 할당을 금지하지 않으므로, TYPE_CHECKING을 사용하는 기존 코드는 계속 작동합니다.
# This code will continue to work
TYPE_CHECKING = False
from typing import TYPE_CHECKING
사용자는 Python 3.13 또는 이전 버전의 사용을 중단한 후 TYPE_CHECKING에 대한 할당을 제거할 수 있습니다.
이것을 가르치는 방법
- 런타임에 타입 검사 코드를 건너뛰려면
if TYPE_CHECKING:를 사용하십시오. - Python 3.14 이전 버전을 지원하려면
from typing import TYPE_CHECKING을 사용하십시오. TYPE_CHECKING = False또는if False: # TYPE_CHECKING과 같은 우회 방법은 계속 작동하지만 권장되지 않습니다.
참조 구현
거부된 아이디어
타입 검사 전용 코드 제거
컴파일 시점에 타입 검사 전용 코드를 제거하기 위해 __type_checking__이라는 실제 상수를 추가하는 방안이 고려됩니다.
그러나 언어에 실제 상수를 추가하면 언어의 복잡성이 증가합니다. 타입 검사 전용 코드를 제거하여 얻는 이점은 이러한 복잡성을 정당화하기에 충분하지 않은 것으로 추정됩니다.
import typing 최적화
향후 최적화를 통해 시작 시간 때문에 typing 모듈을 임포트하지 않아도 될 수 있습니다.
이러한 최적화를 적용하더라도 임베디드 시스템이나 브라우저에서 Python을 실행하는 경우처럼 임포트를 최소화하는 것이 유용한 사용 사례는 여전히 존재합니다.
따라서 typing 모듈 외부에서 타입 검사 전용 코드를 건너뛰기 위한 상수를 정의하는 것은 여전히 가치가 있습니다.
Copyright
This document is placed in the public domain or under the CC0-1.0-Universal license, whichever is more permissive.