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

Python 개선 제안 한국어 번역

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에서 언급하듯이, “타입 힌트는 … 계산 비용이 들지 않는 것이 아닙니다”. 그래서 처음에는 순환 import를 끊는 데 도움을 주기 위해 typing.TYPE_CHECKING 상수가 도입되었습니다.

명령줄 인터페이스, 애플리케이션, 핵심 라이브러리처럼 시작 시간이 중요한 상황에서는 프로그래머가 런타임 실행에 필요하지 않은 모든 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하는 것은 사용 중단(deprecated)됩니다. 타이핑의 런타임 영향을 최소화하기 위해, 이 폐지는 2029년 10월로 예정된 Python 3.13의 지원 종료 이전에는 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:을 사용하십시오.
  • 3.14 이전의 Python 버전을 지원하려면 from typing import TYPE_CHECKING을 사용하십시오.
  • TYPE_CHECKING = False나 if False:  # TYPE_CHECKING 같은 우회 방법은 계속 동작하지만 권장되지 않습니다.

참조 구현

기각된 아이디어

타입 검사 전용 코드 제거

컴파일 시점에 타입 검사 전용 코드를 제거하기 위해 __type_checking__이라는 실제 상수를 추가하는 방안이 검토되었습니다.

그러나 언어에 실제 상수를 추가하면 언어의 복잡성이 증가합니다. 타입 검사 전용 코드를 제거하여 얻는 이점은 그 복잡성을 정당화하기에 충분하지 않다고 판단되었습니다.

import typing 최적화

향후 최적화를 통해 시작 시간 때문에 typing 모듈 임포트를 피해야 할 필요가 없어질 수도 있습니다.

그러한 최적화가 이루어지더라도 임베디드 시스템이나 브라우저에서 Python을 실행하는 경우처럼 임포트를 최소화하는 것이 유익한 사용 사례는 여전히 존재할 것입니다.

따라서 typing 모듈 외부에서 타입 검사 전용 코드를 건너뛰기 위한 상수를 정의하는 것은 여전히 가치가 있습니다.