파이썬 3.13의 새로운 기능에 대해 알아봅시다
*******************************************

편집자:
   Adam Turner and Thomas Wouters

해당하는 문서는 기존의 파이썬 3.12와 비교했을 때 파이썬 3.13의 새로운
기능들에 대해 설명합니다. 파이썬 3.13은 2024년 10월 7일에 배포되었습니
다. 배포와 관련된 전체 기록을 열람하시려면, 아래 변경 로그를 확인해주
세요.

더 보기: **PEP 719** -- 파이썬 3.13 릴리스 일정


요약 -- 릴리스 하이라이트
=========================

파이썬 3.13은 가장 최근의 파이썬 프로그래밍 언어에 대한 안정 배포 버전
입니다. 언어 전반과 그 구체적인 구현에 있어 업데이트가 있었으며, 표준
라이브러리에도 업데이트가 있었습니다. 가장 큰 업데이트는 대화형 인터프
리터, 제한 없는 스레드 모드(free-threaded mode) (**PEP 703**), 또한 지
정 시간 구동 (Just-In-Time) 컴파일러 (**PEP 744**)에 대한 것이었습니다
.

에러 메세지는 계속 개선되고 있습니다. 트레이스백(Traceback)들의 경우
기본적으로 색깔 표시됩니다. "locals()" 내장 함수의 경우 반환된 매핑을
변화시키기 위해 정의된 의미 구조를 활용하고, 또한 타입 매개변수들은 기
본 값의 설정을 지원합니다.

표준 라이브러리의 업데이트는, 오래되어 더 이상 지원되지 않는 API들과
모듈들의 업데이트(혹은 제거)를 포함합니다. 또한, 보다 사용자 친화적이
거나 보다 정확한 라이브러리가 되기 위한 통상적인 업데이트들을 포함합니
다. 몇몇의 오래된 레거시 표준 라이브러리 모듈들은, 파이썬 3.11 버전에
서의 사용 지원 중단(deprecate)된 이후에, 현 버전에서 제거되었습니다.

해당하는 업데이트 문서는 새로운 기능 전체에 대해서 설명을 제공해주는
것을 목적으로 삼지 않습니다. 다만, 보다 편리하게 한눈에 볼 수 있을 개
괄 설명을 제공하려는 것입니다. 보다 자세한 정보를 원하신다면, 공식 문
서를 참고해주세요; 예를 들어, 라이브러리 색인 혹은 언어 색인 등을 참고
하실 수 있습니다. 보다 구체적인 구현 원리 혹은 디자인 원칙에 대해 이해
하시고 싶으신 분들께서는, 해당하는 새로운 기능과 관련된 PEP 문서를 열
람해주시기를 부탁드립니다. 다만, PEP 문서들의 경우 통상적으로 해당하는
기능이 구현되고 난 이후에는 추가적으로 업데이트되지 않아 최신화되지 않
은 부분이 있을 수 있음을 양해 부탁드립니다. 과거 버전의 파이썬을 사용
하는 시스템을 파이썬 3.13으로 업그레이드(혹은 이식)하기 위한 안내의 경
우 Porting to Python 3.13을 참고 부탁드립니다.

======================================================================

인터프리터의 개선:

* 대화형 인터프리터와 개선된 에러 메세지에 있어 커다란 개선이 있었습니
  다.

* **PEP 667**: 기존의 "locals()" 내장 함수의 경우 새롭게 정의된 의미
  구조를 지원하며, 이러한 지원은 반환되는 매핑 구조의 변환이 필요한 경
  우에 대한 것입니다. 파이썬 디버거들 혹은 유사한 디버깅 도구들의 경우
  , 이러한 지원을 통해 지역 변수에 대한 보다 안정적인 업데이트 반영을
  보다 최적화된 범위에 대해 수행할 수 있으며, 동시적인 코드 작동 중에
  서도 마찬가지로 이러한 최적화가 가능해졌습니다.

* **PEP 703**: 파이썬 3.13은 전역 인터프리터 잠금(*global interpreter
  lock*)의 해제를 실험적으로 지원합니다. 보다 자세한 내용의 경우 제한
  없는 스레드 모드(free-threaded mode)을 참고 부탁드립니다.

* **PEP 744**: 기본적인 지정 시간 구동 (Just-In-Time) 컴파일러가 추가
  되었습니다. 현재는 기본적으로 사용하지 않으며(향후 활성화될 수 있습
  니다) 성능 개선 효과는 크지 않습니다. 향후의 릴리스들을 통해 더욱 개
  선될 예정입니다.

* 대화형 인터프리터에서 색상 지원을 추가하고, 트레이스백 및 doctest출
  력에도 적용되었습니다. 이 기능은 "PYTHON_COLORS"와 "NO_COLOR"환경 변
  수를 통해 비활성화할 수 있습니다.

파이썬 데이터 모델의 개선 사항들

* "__static_attributes__"는 클래스 본문 내 함수에서 "self.X" 형태로 액
  세스되는 속성의 이름을 저장합니다.

* "__firstlineno__"는 클래스 정의의 첫 번째 줄 번호를 기록합니다.

표준 라이브러리의 중요한 개선 사항들:

* 새로운 "PythonFinalizationError" 예외를 추가했으며, *종료 시기* 동안
  작업이 차단(block)될 때 이 예외가 발생합니다.

* "argparse" 모듈은 명령줄 옵션, 위치 인자와 하위 명령에 대한 사용 지
  원 중단(deprecating) 표시를 지원합니다.

* 새로운 함수 "base64.z85encode()"와 "base64.z85decode()"는 Z85 data의
  인코딩과 디코딩을 지원합니다.

* "copy" 모듈에 "copy.replace()" 함수가 추가되었으며, 여러 내장 타입들
  과 "__replace__()" 메서드를 정의하는 모든 클래스를 지원합니다.

* 새로운 "dbm.sqlite3" 모듈이 기본 "dbm" 백엔드가 되었습니다.

* "os" 모듈에 리눅스의 타이머 알림 파일 디스크립터로 작업할 수 있는 새
  로운 함수 세트가 추가되었습니다.

* "random" 모듈에 명령줄 인터페이스가 추가되었습니다.

보안 개선 사항들:

* "ssl.create_default_context()"가 기본 플래그로
  "ssl.VERIFY_X509_PARTIAL_CHAIN"과 "ssl.VERIFY_X509_STRICT"를 설정합
  니다.

C API 개선 사항들:

* "Py_mod_gil"슬롯은 확장 모듈이 *GIL*을 비활성화한 상태에서 실행을 지
  원한다는 것을 나타내기 위해 사용됩니다.

* 시스템 시계에 액세스를 제공하는 PyTime C API가 추가되었습니다.

* "PyMutex"는 1바이트만 차지하는 새로운 경량 뮤텍스(Mutex)입니다.

* C API에 **PEP 669** 모니터링 이벤트를 생성하는 함수 세트가 새로 추가
  되었습니다.

새로운 타이핑 기능들:

* **PEP 696**: 타입 매개변수("typing.TypeVar", "typing.ParamSpec",
  "typing.TypeVarTuple")에 기본값을 지정할 수 있도록 하는 기능을 새롭
  게 지원합니다.

* **PEP 702**: 새로운 "warnings.deprecated()" 데코레이터는 타입 시스템
  과 런타임에서 사용 지원 중단(deprecate) 예정 표시를 지원합니다.

* **PEP 705**: "typing.ReadOnly"는 "typing.TypedDict"의 항목을 타입 검
  사기에서 읽기 전용으로 표시하는 데 사용할 수 있습니다.

* **PEP 742**: "typing.TypeIs"는 "typing.TypeGuard"의 대안으로 더 직관
  적인 타입 축소(type narrowing) 동작을 제공합니다.

플랫폼 지원:

* **PEP 730**: 애플의 iOS가 공식적으로 지원되는 플랫폼으로 **3단계
  (Tier 3)** 수준에서 지원됩니다.

* **PEP 738**: Android는 공식적으로 지원되는 플랫폼으로 **3단계 (Tier
  3)** 수준에서 지원됩니다.

* "wasm32-wasi"는 **2단계 (Tier 2)** 수준에서 지원됩니다.

* "wasm32-emscripten"은 더 이상 공식적으로 지원되는 플랫폼이 아닙니다.

중요한 제거 사항들:

* PEP 594: 표준 라이브러리에서 ‘죽은 배터리(dead batteries)’로 분류된
  레거시 모듈 19개가 제거되었습니다: "aifc", "audioop", "cgi",
  "cgitb", "chunk", "crypt", "imghdr", "mailcap", "msilib", "nis",
  "nntplib", "ossaudiodev", "pipes", "sndhdr", "spwd", "sunau",
  "telnetlib", "uu", "xdrlib".

* (파이썬 3.11에서 사용 지원 중단되었던) **2to3** 도구와 "lib2to3" 모
  듈이 제거되었습니다.

* (파이썬 3.6에서 사용 지원 중단되었던) "tkinter.tix" 모듈이 제거되었
  습니다.

* "locale.resetlocale()" 함수가 제거되었습니다.

* "typing.io" 및 "typing.re" 네임스페이스들이 제거되었습니다.

* 연쇄 "classmethod" 설명자(descriptors)가 제거되었습니다.

릴리스 일정 변경 사항들:

**PEP 602** ("Annual Release Cycle for Python")는 새로운 릴리스의 완전
지원(‘버그 수정’) 기간을 2년으로 연장하도록 업데이트되었습니다. 이는
다음을 의미합니다:

* Python 3.9부터 3.12 버전까지는 완전 지원 기간이 1년 반이며, 이후 3년
  반 동안은 보안 수정만 제공됩니다.

* Python 3.13 및 이후 버전은 완전 지원 기간이 2년이며, 그 후 3년간은
  보안 수정만 제공합니다.


새로운 기능들
=============


개선된 대화형 인터프리터
------------------------

파이썬 3.13은 기본적으로 PyPy project의 코드를 기반으로 한 새로운 대화
형 (*interactive*) 셸을 사용합니다. 사용자가 대화형 터미널에서 *REPL*
을 시작하면 다음과 같은 새 기능이 지원됩니다:

* 여러개의 줄을 편집할 때에도 기록을 보존할 수 있습니다.

* "help", "exit", "quit" 같은 REPL 전용 명령을 직접 지원합니다. 또한,
  함수로 호출할 필요 없이 사용할 수 있습니다.

* 프롬프트와 트레이스백에서 기본적으로 색상이 활성화됩니다.

* "F1"으로 대화형 도움말을 탐색할 수 있으며, 별도로 명령 기록이 제공됩
  니다.

* "F2"로 명령 기록을 탐색할 때, 출력을 건너뛸 뿐 아니라 *>>>*와 *...*
  프롬프트도 건너뜁니다.

* "F3"의 "붙여넣기 모드"는 큰 코드 블록을 붙여넣기 쉽게 해 줍니다("F3"
  를 다시 누르면 일반 프롬프트로 다시 돌아갑니다).

새 대화형 셸을 비활성화하려면 "PYTHON_BASIC_REPL" 환경 변수를 설정하면
됩니다. 대화형 모드에 대한 자세한 내용은 대화형 모드을 참조 부탁드립니
다.

(PyPy 프로젝트의 코드를 기반으로, Pablo Galindo Salgado, Łukasz Langa,
Lysandros Nikolaou가 gh-111201을 통해 기능을 구현하였습니다. Dino
Viehland와 Anthony Shaw가 Windows 지원에 기여하였습니다.)


개선된 에러 메세지
------------------

* 인터프리터는 터미널에서 트레이스백을 표시할 때 기본적으로 색상을 사
  용합니다. 이러한 색상 적용을 변경하기 위해 "PYTHON_COLORS" 환경 변수
  및 "NO_COLOR" 및 "FORCE_COLOR" 환경 변수를 활용할 수 있으며, 이러한
  활용을 통해 색상 적용을 제어할 수 있습니다. (Pablo Galindo Salgado가
  gh-112730를 통해 기능을 구현하였습니다.)

* 표준 라이브러리 모듈과 동일한 이름의 스크립트를 작성하는 실수는 (여
  러 사용자에 의해) 흔히 발생합니다. 표준 라이브러리 모듈과 동일한 이
  름의 스크립트로 인해 오류가 발생하는 경우에 보다 자세한 에러 메세지
  제공함을 통해 보다 도움이 될 수 있도록 하였습니다:

     $ python random.py
     Traceback (most recent call last):
       File "/home/me/random.py", line 1, in <module>
         import random
       File "/home/me/random.py", line 3, in <module>
         print(random.randint(5))
               ^^^^^^^^^^^^^^
     AttributeError: module 'random' has no attribute 'randint' (consider renaming '/home/me/random.py' since it has the same name as the standard library module named 'random' and prevents importing that standard library module)

  또한, 스크립트가 임포트(import)하려는 제삼자(third-party) 모듈과 이
  름이 같아서 오류가 발생하는 경우에도 보다 자세한 에러 메세지 제공함
  을 통해 보다 도움이 될 수 있도록 하였습니다:

     $ python numpy.py
     Traceback (most recent call last):
       File "/home/me/numpy.py", line 1, in <module>
         import numpy as np
       File "/home/me/numpy.py", line 3, in <module>
         np.array([1, 2, 3])
         ^^^^^^^^
     AttributeError: module 'numpy' has no attribute 'array' (consider renaming '/home/me/numpy.py' if it has the same name as a library you intended to import)

  (Shantanu Jain이 gh-95754을 통해 기능을 구현하였습니다.)

* 함수에 잘못된 키워드 인자가 전달되는 경우, 올바른 키워드 인자가 에러
  메세지 안에서 제안되도록 하였습니다.

     >>> "Better error messages!".split(max_split=1)
     Traceback (most recent call last):
       File "<python-input-0>", line 1, in <module>
         "Better error messages!".split(max_split=1)
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
     TypeError: split() got an unexpected keyword argument 'max_split'. Did you mean 'maxsplit'?

  (Pablo Galindo Salgado와 Shantanu Jain이 gh-107944를 통해 기능을 구
  현하였습니다.)


제한 없는 스레드를 사용하는 파이썬(CPython)
-------------------------------------------

CPython은 *전역 인터프리터 잠금 (GIL)*을 비활성화한 제한 없는 스레드
모드(free-threaded mode)에서 실행을 실험적으로 지원합니다. 이는 실험적
기능이므로 기본 설정으로 활성화되어 있지는 않습니다. 제한 없는 스레드
모드를 실행시키기 위해서는  "python3.13t" 또는 "python3.13t.exe"라는
별도의 실행 파일이 필요합니다. *free-threaded*로 표시된 미리 빌드된 바
이너리는 공식 Windows 및 macOS 설치 프로그램의 일부로 설치할 수 있으며
, 또는 "--disable-gil" 옵션을 사용하여 소스 코드로부터 CPython을 빌드
할 수 있습니다.

제한 없는 스레드 실행은 사용 가능한 CPU 코어에서 스레드를 병렬로 실행
하여 가용 처리 능력을 온전히 활용할 수 있게 합니다. 모든 소프트웨어가
자동적으로 이를 통해 이점을 갖게 되는 것은 아니지만, 스레딩을 염두에
두고 설계된 프로그램은 다중 코어 하드웨어에서 보다 더 빠르게 실행됩니
다. **제한 없는 스레드 모드는 실험적**이며 개선 작업이 진행 중이므로,
버그가 있을 수 있으며, 단일 스레드를 통한 실행의 성능이 저하될 수 있습
니다. 제한 없는 스레드를 사용하는 파이썬(CPython) 빌드는 실행 시 환경
변수 "PYTHON_GIL" 또는 명령줄 옵션 "-X gil=1"을 사용해 GIL을 활성화하
여 선택적으로 실행할 수 있습니다.

사용 중인 인터프리터가 제한 없는 스레드의 사용을 지원하는지 확인하려면
"python -VV" 및 "sys.version"에서 "experimental free-threading build"
를 통해 확인할 수 있습니다. 새 "sys._is_gil_enabled()" 함수를 사용하면
실행 중인 프로세스에서 GIL이 실제로 비활성화되어 있는지 확인할 수 있습
니다.

C-API 확장 모듈은 제한 없는 스레드(free-threaded)를 사용하는 빌드용으
로 따로 빌드해야 합니다. 전역 인터프리터 잠금(Global Interpreter Lock;
*GIL*) 비활성 실행을 지원하는 확장 모듈은 "Py_mod_gil" 슬롯을 사용해야
합니다. 개별 단계 초기화(single-phase init)를 사용하는 확장 모듈은 GIL
비활성 실행 지원 여부를 표시하기 위해 "PyUnstable_Module_SetGIL()"을
사용해야 합니다. 이러한 메커니즘을 사용하지 않는 C 확장을 임포트하면
GIL이 자동으로 활성화됩니다. "PYTHON_GIL" 환경 변수나 "-X gil=0" 옵션
으로 GIL을 명시적으로 비활성화한 경우는 예외입니다. 제한 없는 스레드를
사용하는 빌드에서 C 확장이 포함된 패키지를 설치하려면 pip 24.1 이상이
필요합니다.

이러한 개선 작업은 많은 개인과 조직, 그리고 제한 없는 스레드(free-
threading) 사용 지원을 테스트하고 활성화하는 데 기여한 파이썬 및 다양
한 제삼자(third-parth) 프로젝트 커뮤니티들 덕분이었습니다. 주목할 만한
기여자로는 Sam Gross, Ken Jin, Donghee Na, Itamar Oren, Matt Page,
Brett Simmers, Dino Viehland, Carl Meyer, Nathan Goldbaum, Ralf
Gommers, Lysandros Nikolaou 등이 있으며, 이외에도 많은 분들이 있습니다
. 이 기여자들 중 많은 분들이 Meta에 재직하고 있으며, Meta는 이 프로젝
트를 지원하기 위해 상당한 엔지니어링 자원을 제공하였습니다.

더 보기:

  이러한 개선 작업의 배경과 근거에 대한 보다 구체적인 정보를 위해서는
  **PEP 703** "Making the Global Interpreter Lock Optional in CPython"
  를 열람 부탁드립니다.

  제한 없는 스레드 사용을 지원하기 위한 확장 모듈 이식: 커뮤니티에 의
  해 지원되는 제한 없는 스레드 사용 지원에 대한 이식 가이드로, 확장 모
  듈 작성자를 위한 가이드입니다.


실험적인 지정 시간 구동 (Just-In-Time; JIT) 컴파일러
----------------------------------------------------

"--enable-experimental-jit" 옵션을 사용하여 CPython을 구성하고 빌드하
면 일부 파이썬 프로그램의 속도를 높일 수 있는 JIT 컴파일러가 추가됩니
다. 윈도우에서 JIT를 활성화하려면 "PCbuild/build.bat --experimental-
jit"을 사용하고, 2단계 (Tier 2) 인터프리터를 활성화하려면 "--
experimental-jit-interpreter"를 사용하세요. 빌드 요구 사항과 추가 지원
정보는 "Tools/jit/README.md"를 확인 부탁드립니다.

"--enable-experimental-jit" 옵션은 다음과 같은 특정 값들을 받을 수 있
습니다. 특정 값을 지정하지 않으면 기본값은 "yes"입니다.

* "no": 2단계 (Tier 2) 인터프리터 및 JIT 파이프라인을 모두 비활성화합
  니다.

* "yes": JIT (Just-In-Time; 지정 시간 구동) 컴파일러를 활성화합니다.
  런타임에 JIT를 비활성화하려면 환경 변수 "PYTHON_JIT=0"을 설정할 수
  있습니다.

* "yes-off": JIT를 빌드하되 기본값으로 비활성화합니다. 런타임에 JIT를
  활성화하려면 환경 변수 "PYTHON_JIT=1"을 설정할 수 있습니다.

* "interpreter": 2단계 (Tier 2) 인터프리터를 활성화하지만 JIT는 비활성
  화합니다. 이 인터프리터는 환경 변수 "PYTHON_JIT=0"을 설정하여 비활성
  화할 수 있습니다.

내부 아키텍처는 대략적으로 다음과 같습니다:

* 시작 지점은 최적화된 *1단계(Tier 1) 바이트 코드*입니다. 관련된 보다
  구체적인 정보를 위해서는 3.11 버전의 새로운 기능를 열람 부탁드립니다
  .

* *1단계(Tier 1) 바이트 코드*가 빈번하게 실행되는 경우, 완전히 내부용
  인 새로운 중간 표현(IR)인 *2단계 IR(Tier 2 IR)*로 변환됩니다. 변환된
  이러한 중간 표현은 마이크로 연산(uops)으로 명명되기도 합니다.

* 2단계 IR도 1단계와 같은 스택 기반 가상 머신을 사용하지만, 명령어 형
  식의 경우 기계어로 변환하기에 보다 더 적합합니다.

* 2단계 IR에는 여러개의 최적화 패스가 있으며, 이는 인터프리터에 의해
  처리되어 실행되거나 기계어로 변환되기 전에 적용됩니다.

* 2단계(Tier 2) 인터프리터가 있지만, 주로 앞서 서술한 최적화 파이프라
  인의 초기 단계를 디버깅하기 위해 만들어진 것입니다. 2단계 인터프리터
  는 파이썬에서 "--enable-experimental-jit=interpreter" 옵션을 설정함
  을 통해 활성화할 수 있습니다.

* 지정 시간 구동 (JIT; Just-In-Time) 컴파일러가 활성화되면, 최적화된 2
  단계(Tier 2) IR이 기계어로 변환되어 실행됩니다.

* 기계어 변환 과정에서는 *복사-후-패치 (copy-and-patch)*라는 기법을 사
  용합니다. 런타임 의존성은 없지만, 빌드의 경우 LLVM에 대한 새로운 의
  존성이 추가되었습니다.

더 보기: **PEP 744**

(JIT은 Brandt Bucher에 의해, Haoran Xu와 Fredrik Kjolstad의 논문에 영
감을 받아 개발되었습니다. 2단계 IR의 경우 Mark Shannon과 Guido van
Rossum에 의해 개발되었습니다. 2단계 IR의 최적화의 경우 Ken Jin에 의해
개발되었습니다.)


"locals()"의 변형에 대한 의미 구조 정의
---------------------------------------

지금까지 "locals()"의 반환값을 변경했을 때에 예상되는 결과는 개별적인
파이썬 구현에 맡겨져 있었습니다. Python 3.13부터는 **PEP 667**이 대부
분의 코드 실행 스코프에 대해 CPython의 기존 동작을 표준화하고, *최적화
된 스코프*(함수, 제너레이터, 코루틴, 컴프리헨션, 제너레이터 표현식)에
서는 현재 할당되어 있는 지역 변수들에 대한 서로 독립적인 스냅샷으로 명
시적으로 반환하도록 변경합니다. 이는 지역적으로 참조된 비지역 변수들이
종료 시점에서 확인되는 경우을 포함합니다.

앞서 서술한 것과 같이 최적화된 스코프에서 "locals()"의 의미 구조가 바
뀌면서, 명시적인 네임 스페이스를 제공하지 않는 경우, 암시적으로
"locals()"을 대상으로 실행되는 코드 실행 함수들(예: "exec()",
"eval()")의 기본 동작도 영향을 받았습니다. 이전 버전에서는 코드 실행
함수를 호출한 뒤 "locals()"을 호출하여 변경 사항에 액세스할 수 있는지
가 구체적인 개별 구현에 따라 달라졌었습니다. 구체적으로, CPython에서
대부분의 경우 이러한 방식은 무리 없이 잘 동작하였지만, 종종 같은 스코
프의 공유 스냅샷이 다른 코드(디버거나 코드 실행 추적 도구 등)에 의해
재설정될 수 있기 때문에 최적화된 스코프에서 실패하는 경우도 있었습니다
. Python 3.13에서는 해당 코드를 항상 최적화된 스코프의 지역 변수에 대
한 독립적인 스냅샷에 대해서만 실행하므로, 그 변경 사항은 이후의
"locals()" 호출에서 절대로 보이지 않습니다. 이러한 경우들에서 변경 내
용을 확인하기 위해서는 관련 함수에 명시적인 네임 스페이스를 전달해야
합니다. 또는 디스크에서 파이썬 파일을 실행할 때처럼 실행 결과의 네임
스페이스를 반환하는 상위 수준의 코드 실행 API(예를 들어,
"runpy.run_path()")로 코드를 변경하는 것이 보다 바람직할 수 있습니다.

디버거와 유사 도구들이 (앞서 서술한 변화의 영향을 받는 스코프에서) 지
역 변수를 안정적으로 업데이트할 수 있도록, "FrameType.f_locals"는 해당
스코프의 지역 변수와 그 스코프에서 참조되는 비지역 변수에 대한 이어쓰
기(write-through) 프록시를 반환합니다. 런타임 의미가 불분명하고 일관성
없이 업데이트되던 (공유된) "dict" 인스턴스를 반환하지 않습니다.

관련된 C API 변경 사항과 사용 지원 중단 등에 대한 보다 구체적인 정보를
위해서는 **PEP 667**을 열람 부탁드립니다. 또한 관련된 (코드) 이식에 대
한 가이드의 경우 Python API 및 C API을 열람 부탁드립니다.

(Mark Shannon과 Tian Gao가 PEP을 작성하였고 gh-74929를 통해 기능을 구
현하였습니다. Guido van Rossum과 Alyssa Coghlan이 설명서를 최신화하였
습니다.)


모바일 플랫폼들에 대한 지원
---------------------------

**PEP 730**: iOS가 **PEP 11**에서 지원하는 플랫폼으로, "arm64-apple-
ios" (2013년 이후 출시된 iPhone 및 iPad 기기)와 "arm64-apple-ios-
simulator" (Apple 실리콘 하드웨어에서 실행되는 Xcode iOS 시뮬레이터)는
3단계 (Tier 3)로 지정되었습니다. "x86_64-apple-ios-simulator" (구형
"x86_64" 하드웨어에서 실행되는 Xcode iOS 시뮬레이터)는 3단계 지원 플랫
폼은 아니지만, 최선의 노력(best-effort)으로 지원됩니다. (Russell
Keith-Magee PEP을 작성하였고 gh-114099를 통해 기능을 구현하였습니다.)

**PEP 738**: Android가 **PEP 11**에서 지원하는 플랫폼으로, "aarch64
-linux-android"와 "x86_64-linux-android"은 3단계 (Tier 3)로 지정되었습
니다. 32비트 "arm-linux-androideabi"와 "i686-linux-android"는 3단계 지
원 플랫폼은 아니지만, 최선의 노력(best-effort)으로 지원됩니다.
(Malcolm Smith가 PEP을 작성하였고 gh-116622을 통해 기능을 구현하였습니
다.)

더 보기: **PEP 730**, **PEP 738**


기타 언어 변경
==============

* 컴파일러는 이제 독스트링의 각 줄에서 공통된 선행 공백을 제거합니다.
  이 변경으로 *바이트 코드 캐시* (예를 들어, *.pyc* 파일)의 크기가 줄
  어듭니다. 예를 들어 SQLAlchemy 2.0의 "sqlalchemy.orm.session" 모듈에
  서는 파일 크기가 약 5% 감소합니다. 이 변경 사항은 독스트링을 사용하
  는 도구들에 영향을 줍니다. 예를 들어, "doctest"와 같은 도구가 영향을
  받습니다.

     > 선행 공백을 포함하는 독스트링입니다.

     > 여러개의 문단을 포함하고 있는 경우입니다.

  Inada Naoki가 gh-81283을 통해 기능을 구현하였습니다.

* 클래스 스코프 안에 있는 어노테이션 스코프는 이제 람다와 컴프리헨션을
  포함할 수 있습니다. 클래스 스코프 안에 있는 컴프리헨션은 부모 스코프
  에 인라인되지 않습니다.

     class C[T]:
         type Alias = lambda: T

  (Jelle Zijlstra가 gh-109118 및 gh-118160을 통해 기능을 구현하였습니
  다.)

* 퓨처 문은 이제 "__future__" 모듈의 상대 임포트로는 더 이상 활성화되
  지 않습니다. 이에, *from .__future__ import ...* 형식의 구문은 이제,
  특별한 기능이 없는 일반적인 상대 임포트로만 처리됩니다. (Jeremiah
  Gabriel Pascual이 gh-118216을 통해 기능을 구현하였습니다.)

* "else" 블록에서 사용되는 전역 변수의 경우, 이제 "except" 블록 안에서
  도 해당 이름을 "global" 문으로 선언할 수 있습니다. 이전버전들에서는
  오류로 볼 수 있는 "SyntaxError"가 발생했습니다. (Irit Katriel이
  gh-111123를 통해 기능을 구현하였습니다.)

* 동결된 모듈을 임포트 과정에서 무시할지 여부를 제어하는 새로운 환경
  변수 "PYTHON_FROZEN_MODULES"가 추가되었습니다. 이 변수는 "-X
  frozen_modules" 명령줄 옵션과 동일한 방식으로 작동합니다. (Yilei
  Yang이 gh-111374를 통해 기능을 구현하였습니다.)

* 새 환경 변수 "PYTHON_PERF_JIT_SUPPORT"와 명령줄 옵션 "-X perf_jit"를
  통해, 프레임 포인터 없이도 동작하는 perf 프로파일러 지원이 추가되었
  습니다. (Pablo Galindo가 gh-118518를 통해 기능을 구현하였습니다.)

* 새 환경 변수 "PYTHON_HISTORY"를 사용하여 ".python_history" 파일의 위
  치를 변경할 수 있습니다. (Levi Sabah, Zackery Spytz, 그리고 Hugo van
  Kemenade가 gh-73965를 통해 기능을 구현하였습니다.)

* 클래스에 새로운 "__static_attributes__" 속성이 추가되었습니다. 해당
  하는 어트리뷰트는 컴파일러가 클래스 본문 안의 어떤 함수에서든
  *self.<name>* 형식으로 대입되는 어트리뷰트 이름들을 튜플로 채워넣습
  니다. (Irit Katriel이 gh-115775을 통해 기능을 구현하였습니다.)

* 컴파일러는 이제 클래스 정의의 첫 번째 줄 번호를 담은
  "__firstlineno__" 어트리뷰트를 클래스에 생성합니다. (Serhiy
  Storchaka가 gh-118465를 통해 기능을 구현하였습니다.)

* "exec()"와 "eval()" 내장 함수는 이제 *globals* 와 *locals* 인자를 키
  워드 인자로도 받을 수 있습니다. (Raphael Gaschignard가 gh-105879를
  통해 기능을 구현하였습니다.)

* 내장 함수 "compile()"이 이제는 "ast.PyCF_OPTIMIZED_AST"라는 새로운
  플래그를 받아들입니다. 이 플래그는 "ast.PyCF_ONLY_AST" 와 비슷하지만
  , 반환되는 AST가 *optimize* 인자의 값에 따라 최적화된다는 점이 다릅
  니다. (Irit Katriel가 gh-108113를 통해 기능을 구현하였습니다.)

* "property" 객체에 "__name__" 어트리뷰트를 추가했습니다. (Eugene
  Toder가 gh-101860를 통해 기능을 구현하였습니다.)

* 새로운 "PythonFinalizationError" 예외가 추가되었습니다. 해당하는 예
  외는 "RuntimeError"로부터 파생되었으며, *종료 시기* 동안 어떤 특정한
  작업이 차단될 때에 이를 알리기 위해 사용됩니다. 다음의 호출 가능한
  객체(callable)는 이제 "PythonFinalizationError"를 발생시킵니다. 이전
  에는 "RuntimeError"를 발생시켰었습니다.

  * "_thread.start_new_thread()"

  * "os.fork()"

  * "os.forkpty()"

  * "subprocess.Popen"

  (Victor Stinner가 gh-114570를 통해 기능을 구현하였습니다.)

* 이제 "str.replace()" 메서드의 *count* 인자를 키워드 인자로 전달할 수
  있습니다. (Hugo van Kemenade가 gh-106487를 통해 기능을 구현하였습니
  다.)

* 이제 많은 함수에서 파일 디스크립터 인자(file descriptor argument)로
  논리(boolean) 값이 전달되면 경고를 발생시킵니다. 해당하는 업데이트를
  통해 몇몇 오류를 보다 더 이른 시점에 발견할 수 있습니다. (Serhiy
  Storchaka가 gh-82626를 통해 기능을 구현하였습니다.)

* "bz2", "lzma", "tarfile", "zipfile" 모듈의 압축되거나 아카이브된 파
  일 종류의 객체에 "name" 과 "mode" 어트리뷰트를 추가했습니다. (Serhiy
  Storchaka가 gh-115961를 통해 기능을 구현하였습니다.)


새로운 모듈들
=============

* "dbm.sqlite3": "dbm`용 SQLite 백엔드입니다. (Raymond Hettinger와
  Erlend E. Aasland가 :gh:`100414"를 통해 기능을 구현하였습니다.)


개선된 모듈들
=============


argparse
--------

* "add_argument()" 및 "add_parser()" 메서드에 *deprecated* 매개 변수가
  추가되어, 명령줄 옵션과 위치 인자, 하위 명령에 대해 사용 지원 중단을
  표시할 수 있습니다. (Serhiy Storchaka가 gh-83648를 통해 기능을 구현
  하였습니다.)


array
-----

* 유니코드 문자를 위한 *'w'* 타입 코드(*Py_UCS4*)가 추가되었습니다. 사
  용 지원 중단된 *'u'* 타입 코드 대신 이 타입 코드를 사용해야 합니다.
  (Inada Naoki가 gh-80480를 통해 기능을 구현하였습니다.)

* "clear()" 메서드를 구현해 "array.array" 클래스를 "MutableSequence"
  타입으로 등록했습니다. (Mike Zimin가 gh-114894를 통해 기능을 구현하
  였습니다.)


ast
---

* "ast" 모듈의 노드 타입 생성자는 이제 받아들이는 인자에 대해 더 엄격
  해졌으며, 인자를 생략했을 때의 동작도 더 직관적으로 바뀌었습니다.

  AST 노드 인스턴스를 생성할 때 선택적 필드를 인자로 넘기지 않으면, 그
  필드는 이제 *None`으로 설정됩니다. 또한, 마찬가지로, 리스트 필드를
  생략하면 해당 필드는 이제 빈 리스트로 설정되며,
  :class:*!expr_context` 필드를 생략하면 기본값은 "Load()"가 됩니다. (
  이전에는 모든 경우 새로 생성한 AST 노드 인스턴스에 해당 어트리뷰트가
  없었습니다.)

  그 밖의 모든 경우에 필수 인자를 생략하면 노드 생성자가
  "DeprecationWarning"을 발생시킵니다. 파이썬 3.15에서는 예외를 발생시
  킵니다. 마찬가지로 AST 노드의 필드로 매핑되지 않는 키워드 인자를 생
  성자에 전달하는 것은 이제 사용 지원 중단되었으며, 파이썬 3.15에서는
  예외를 발생시킵니다.

  해당하는 변경 사항은, 클래스가 "AST._field_types" 매핑을 정의해 새로
  운 동작을 사용하도록 선택(opt-in)하지 않는 한, "ast.AST"의 사용자 정
  의 하위 클래스에는 적용되지 않습니다.

  (Jelle Zijlstra가 gh-105858, gh-117486, 그리고 gh-118851를 통해 기능
  을 구현하였습니다.)

* "ast.parse()"는 이제 *optimize*를 선택적 인자로 받아들여, 이를
  "compile()" 함수에 전달합니다. 이를 통해 최적화된 AST를 얻을 수 있습
  니다. (Irit Katriel이 gh-108113을 통해 기능을 구현하였습니다.)


asyncio
-------

* "asyncio.as_completed()"은 이제 *비동기 이터레이터* 이면서 동시에 *
  어웨이터블* 을 담는 일반 *이터레이터*인 객체를 반환합니다. 비동기 이
  터레이션에서 일드되는 어웨이터블에는 전달한 원래 태스크나 퓨처 객체
  가 그대로 포함되므로, 완료되는 태스크와 결과를 서로 연결하기가 더 쉬
  워집니다. (Justin Arthur이 gh-77714을 통해 기능을 구현하였습니다.)

* "asyncio.loop.create_unix_server()"는 이제 서버가 닫히면 Unix 소켓을
  자동으로 제거합니다. (Pierre Ossman가 gh-111246를 통해 기능을 구현하
  였습니다.)

* "DatagramTransport.sendto()"는 빈 바이트열 객체로 호출되면 길이가 0
  인 데이터그램을 전송합니다. 트랜스포트의 흐름 제어는 이제 버퍼 크기
  를 계산할 때 데이터그램 헤더까지 고려합니다. (Jamie Phan이 gh-115199
  을 통해 기능을 구현하였습니다.)

* 큐의 종료를 관리하기 위해 "Queue.shutdown" 메서드와 "QueueShutDown"
  예외가 추가되었습니다. (Laurie Opperman과 Yves Duprat이 gh-104228를
  통해 기능을 구현하였습니다.)

* asyncio 서버를 보다 강제적으로 종료할 수 있도록
  "Server.close_clients()" 와 "Server.abort_clients()" 메서드가 추가되
  었습니다. (Pierre Ossman이 gh-113538을 통해 기능을 구현하였습니다.)

* "StreamReader.readuntil()" 에서 여러 구분자로 이루어진 튜플을 인자로
  받을 수 있으며, 그중 하나를 만나면 읽기를 중단합니다. (Bruce Merry이
  gh-81322을 통해 기능을 구현하였습니다.)

* 외부 취소와 내부 취소가 충돌하는 경우 "TaskGroup" 의 동작을 개선했습
  니다. 예를 들어, 두 개의 태스크 그룹이 중첩된 상태에서 둘 다 자식 태
  스크에서 동시에 예외가 발생하면, 내부 태스크 그룹이 내부 취소를 삼켜
  버려 바깥쪽 태스크 그룹이 멈춰 버릴 수 있었습니다.

  태스크 그룹이 외부에서 취소되었으면서 동시에 "ExceptionGroup"을 발생
  시켜야 하는 경우, 이제 부모 태스크의 "cancel()" 메서드를 호출합니다.
  이렇게 하면 다음 "await" 에서 "CancelledError"가 발생하도록 보장하여
  , 취소가 사라지지 않게 됩니다.

  이번 변경의 또 다른 이점은 태스크 그룹이 이제 ("cancelling()") 로 노
  출되는 취소 횟수를 그대로 유지한다는 점입니다.

  일부 코너 케이스를 처리하기 위해, 취소 횟수가 0에 도달하면 문서화되
  지 않은 *_must_cancel* 플래그를 재설정하도록 "uncancel()"이 동작할
  수 있게 되었습니다.

  (Arthur Tacca에 의해 보고된 이슈에 의해 영감을 받아 gh-116720를 통해
  기능이 구현되었습니다.)

* "TaskGroup.create_task()"가 비활성 상태인 "TaskGroup"에서 호출되면,
  주어진 코루틴은 닫힙니다. 이렇게 하면 해당 코루틴이 한 번도 기다려지
  지(awaited) 않았다는 내용의 "RuntimeWarning"이 발생하지 않습니다.

* *create_task`라는 이름의 함수와 메서드에는 태스크 생성자로 전달되는
  새로운 `**kwargs* 인자가 추가되었습니다. 이 변경은 3.13.3에 실수로
  인해 포함되었고, 사용자 정의 태스크 팩토리에 대한 API 계약을 깨뜨렸
  습니다. 여러 제삼자 태스크 팩토리들이 이에 대한 우회 방법을 구현했습
  니다. 3.13.4 및 이후 릴리스에서는 이전 팩토리 계약이 다시 지켜집니다
  (3.14까지). 기존 우회 방법이 계속 동작하도록, 추가 ***kwargs* 인자는
  여전히 "Task"와 사용자 정의 태스크 팩토리에 추가 키워드 인자를 전달
  할 수 있게 합니다.

  이는 다음 함수와 메서드에 영향을 줍니다: "asyncio.create_task()",
  "asyncio.loop.create_task()", "asyncio.TaskGroup.create_task()".
  (Thomas Grainger가 gh-128307를 통해 기능을 구현하였습니다.)


base64
------

* "z85encode()"와 "z85decode()"함수를 추가하여 "bytes"를 Z85 data로 인
  코딩하고, Z85로 인코딩된 데이터를 "bytes`로 디코딩할 수 있습니다.
  (Matan Perelman이 :gh:`75299"를 통해 기능을 구현하였습니다.)


compileall
----------

* 작업자 스레드와 프로세스의 기본 개수는 이제 "os.cpu_count()" 대신
  "os.process_cpu_count`를 사용해 결정됩니다. (Victor Stinner가
  :gh:`109649()"를 통해 기능을 구현하였습니다.)


concurrent.futures
------------------

* 작업자 스레드와 프로세스의 기본 개수는 이제 "os.cpu_count()" 대신
  "os.process_cpu_count`를 사용해 결정됩니다. (Victor Stinner가
  :gh:`109649()"를 통해 기능을 구현하였습니다.)


configparser
------------

* "ConfigParser"는 이제 이름 없는 섹션을 지원하여 최상위 수준의 키-값
  쌍을 허용합니다. 해당하는 허용은 새로운 *allow_unnamed_section* 매개
  변수를 통해 활성화될 수 있습니다. (Pedro Sousa Lacerda가 gh-66449를
  통해 기능을 구현하였습니다.)


copy
----

* 새로운 "replace()" 함수와 "치환 프로토콜"은 객체의 수정된 사본을 더
  쉽게 만들 수 있게 해 줍니다. 이는 특히 변형 가능하지 않은 객체들
  (immutable objects)를 다룰 때 유용합니다. 다음 타입들은 "replace()"
  함수를 지원하며 치환 프로토콜을 구현합니다:

  * "collections.namedtuple()"

  * "dataclasses.dataclass"

  * "datetime.datetime", "datetime.date", "datetime.time"

  * "inspect.Signature", "inspect.Parameter"

  * "types.SimpleNamespace"

  * code objects

  사용자 정의 클래스는 "copy.replace()"를 지원하도록 "__replace__()"
  메서드를 정의할 수 있습니다. (Serhiy Storchaka가 gh-108751를 통해 기
  능을 구현하였습니다.)


ctypes
------

* 중요한 내부 리팩터링의 결과로, 내부 메타클래스의 초기화는 이제
  *__new__* 가 아니라 *__init__* 에서 수행됩니다. 해당하는 내부 메타클
  래스를 상속하여 사용자 정의 초기화를 제공하는 프로젝트에 영향을 줍니
  다. 일반적으로 다음과 같습니다:

  * *__new__* 에서 *super().__new__()* 을 호출한 뒤 수행되던 사용자 정
    의 로직은 *__init__* 으로 옮겨야 합니다.

  * 클래스를 생성하려면 메타클래스를 직접 호출해야 합니다. 메타클래스
    의 *__new__* 메서드만 호출하면 안 됩니다.

  관련된 논의와 관련된 변경 사항들에 대해서는 gh-124520를 참고 부탁드
  립니다.

* "ctypes.Structure"객체에는 메모리로부터/메모리로 패킹되는 구조체의
  정렬을 명시적으로 지정할 수 있는 새 "_align_"어트리뷰트가 추가되었습
  니다. (Matt Sanderson가 gh-112433를 통해 기능을 구현하였습니다.)


dbm
---

* SQLite 백엔드를 구현하는 새로운 "dbm.sqlite3" 모듈을 추가하고, 이를
  기본 "dbm" 백엔드로 지정합니다. (Raymond Hettinger와 Erlend E.
  Aasland가 gh-100414를 통해 기능을 구현하였습니다.)

* GDBM 및 NDBM 데이터베이스 객체에 새로 추가된 "clear()" 메서드를 통해
  데이터베이스에서 모든 항목을 제거할 수 있습니다. (Donghee Na가
  gh-107122를 통해 기능을 구현하였습니다.)


dis
---

* "dis" 모듈 함수의 출력이 오프셋이 아니라 점프 대상과 예외 처리기를
  나타내는 논리적 라벨들을 표시하도록 변경되었습니다. 오프셋을 함께 표
  시하려면 새 "-O" 명령 줄 옵션이나 *show_offsets* 인수를 사용하면 됩
  니다. (Irit Katriel이 gh-112137를 통해 기능을 구현하였습니다.)

* "get_instructions()"는 캐시 항목을 별도의 명령어로 더 이상 나타내지
  않습니다. 대신, 새 *cache_info* 필드에 포함된 "Instruction"의 일부로
  반환합니다. " (Irit Katriel가 :gh:`112962()"를 통해 기능을 구현하였
  습니다.)


doctest
-------

* "doctest"의 출력에는 이제 기본적으로 색상이 적용됩니다. 이 기능은 새
  "PYTHON_COLORS" 환경 변수와 표준 "NO_COLOR" 및 "FORCE_COLOR" 환경 변
  수를 통해 제어할 수 있습니다. 보다 자세한 내용의 경우 Controlling
  color를 참고 부탁드립니다. (Hugo van Kemenade가 gh-117225를 통해 기
  능을 구현하였습니다.)

* "DocTestRunner.run()" 메서드는 이제 건너뛴 테스트의 개수를 집계합니
  다. "DocTestRunner.skips"와 "TestResults.skipped" 어트리뷰트를 추가
  했습니다. (Victor Stinner가 gh-108794를 통해 기능을 구현하였습니다.)


email
-----

* 줄 바꿈 문자를 포함하는 헤더는 이제 출력될 때 인용(quoted)됩니다.
  "generator" 모듈은 이제 잘못 접히거나 구분된 헤더가 여러 헤더로 파싱
  되거나 인접한 데이터와 합쳐질 수 있는 경우, 해당하는 헤더를 직렬화하
  지 (혹은 쓰지) 않습니다. 해당하는 안전 장치를 비활성화하려면
  "verify_generated_headers"을 설정할 수 있습니다. (Bas Bloemsaat와
  Petr Viktorin가 gh-121650를 통해 기능을 구현하였습니다.)

* "getaddresses()"와 "parseaddr()" 함수는 이제 잘못된 이메일 주소를 만
  났을 때, 이전처럼 부정확한 값을 반환하는 대신 더 많은 경우에 *('',
  '')* 쌍을 반환합니다. 이 두 함수에는 *strict* 라는 새로운 선택적 매
  개 변수가 추가되었습니다(기본값은 *True`입니다). (잘못된 형태의 입력
  을 허용하는) 이전의 작동 방식을 사용하려면 `strict=False`를 지정하면
  됩니다. *strict* 매개 변수를 사용할 수 있는지 확인하기 위해
  `getattr(email.utils, 'supports_strict_parsing', False)`를 사용할 수
  있습니다. (Thomas Dwyer와 Victor Stinner가 :gh:`102988*를 통해 **CVE
  2023-27043**를 고치기 위해 기능을 구현하였습니다.)


enum
----

* "EnumDict"가 공개되어 "EnumType"을 서브클래싱할 때 더 잘 지원하도록
  했습니다.


fractions
---------

* "Fraction" 객체는 이제 채움, 정렬, 부호 처리, 최소 너비 및 그룹화에
  대해 표준 포맷 명세 미니 언어 규칙을 지원합니다. (Mark Dickinson이
  gh-111320를 통해 기능을 구현하였습니다.)


glob
----

* 셸 스타일 와일드카드를 사용하는 경로 지정 문자열을 정규식으로 변환하
  는 함수인 " (Barney Gale가 :gh:`72904()"를 통해 기능을 구현하였습니
  다.)


importlib
---------

* "importlib.resources" 모듈의 다음 함수들은 이제 여러 개의 위치 인자
  를 사용해 리소스 디렉터리(혹은 트리)에 액세스할 수 있습니다. 텍스트
  를 읽는 함수에서는 *encoding* 과 *errors* 인자가 이제 키워드 전용 인
  자입니다:

  * "is_resource()"

  * "open_binary()"

  * "open_text()"

  * "path()"

  * "read_binary()"

  * "read_text()"

  해당하는 함수들은 더 이상 사용 지원이 중단된 것으로 간주되지 않으며,
  제거할 계획도 없습니다. (Petr Viktorin가 gh-116608를 통해 기능을 구
  현하였습니다.)

* "contents()" 는 완전한 기능을 갖춘 "Traversable" API 사용이 권장되며
  , 여전히 사용 지원 중단된 상태입니다. 하지만, 이를 제거할 계획은 현
  재 없습니다. (Petr Viktorin가 gh-116608를 통해 기능을 구현하였습니다
  .)


io
--

* "IOBase" 파이널라이저는 이제 "close()" 메서드에서 발생하는 모든 예외
  를 "sys.unraisablehook"을 통해 기록합니다. 이전에는 해당하는 에러가
  기본적으로 조용한 방식으로 무시되었고, 파이썬 개발 모드혹은 디버그
  빌드를 사용할 때에만 기록되었습니다. (Victor Stinner가 gh-62948를 통
  해 기능을 구현하였습니다.)


ipaddress
---------

* "IPv4Address.ipv6_mapped" 프로퍼티가 추가되었습니다. 이 프로퍼티는
  IPv4 에 매핑된 IPv6 주소를 반환합니다. (Charles Machalow가 gh-109466
  를 통해 기능을 구현하였습니다.)

* "IPv4Address", "IPv6Address", "IPv4Network", 그리고 "IPv6Network"에
  의 "is_global" 그리고 "is_private" 방식의 동작이 수정 개선되었습니다
  . (Jakub Stasiak가 gh-113171를 통해 기능을 구현하였습니다.)


itertools
---------

* "batched()"에는 최종 배치가 지정된 배치 크기보다 짧으면 "ValueError"
  를 발생시키는 새로운 *strict* 매개 변수가 추가되었습니다. (Raymond
  Hettinger가 gh-113202를 통해 기능을 구현하였습니다.)


marshal
-------

* *allow_code* 매개변수가 모듈 함수들에 추가되었습니다.
  *allow_code=False*를 전달하면 파이썬 버전 간에 호환되지 않는 코드 객
  체는 직렬화(serialization)하거나 역-직렬화(de-serialization)할 수 없
  습니다. (Serhiy Storchaka가 gh-113626를 통해 기능을 구현하였습니다.)


math
----

* 새로운 함수 "fma()"는 합성된 곱셈-덧셈(fused multiply-add) 연산을 수
  행합니다. 이는 *x * y + z*를 한 번만 반올림하여 계산하므로, 중간 단
  계에서 정밀도가 손실되지 않습니다. 이 함수는 C99에서 제공하는
  *fma()* 함수를 감싸며(wrap), 특수한 경우에는 IEEE 754
  "fusedMultiplyAdd" 연산의 규격을 따릅니다. (Mark Dickinson와 Victor
  Stinner가 gh-73468를 통해 기능을 구현하였습니다.)


mimetypes
---------

* 파일 시스템 경로에서 MIME 형식을 추측하는 "guess_file_type()" 함수가
  추가되었습니다. 파일 경로와 함께 "guess_type()"을 사용하는 것은 이제
  *소프트 사용 지원 중단된(soft deprecated)* 상태입니다. (Serhiy
  Storchaka가 gh-66543를 통해 기능을 구현하였습니다.)


mmap
----

* "mmap" 클래스는 파일 시스템 오류나 액세스 위반으로 인해 매핑된 메모
  리에 액세스할 수 없을 때 윈도우에서 충돌이 발생하지 않도록 보호됩니
  다. (Jannis Weigend가 gh-118209를 통해 기능을 구현하였습니다.)

* "mmap" 클래스에는 이제 읽기 위치를 이동할 수 있는 파일류 객체가 필요
  한 경우에 사용할 수 있는 새로운 "seekable()" 메서드가 추가되었습니다
  . "seek()" 메서드는 이제 새로운 절대 위치를 반환합니다. (Donghee Na
  와 Sylvie Liberman가 gh-111835를 통해 기능을 구현하였습니다.)

* 유닉스에서만 사용할 수 있는 새로운 *trackfd* 매개변수는 "mmap"에서
  파일 디스크립터(file descriptor) 복제를 제어합니다. *trackfd*가
  *False`이면 *fileno*로 지정된 파일 기술자는 복제되지 않습니다.
  (Zackery Spytz와 Petr Viktorin가 :gh:`78502*를 통해 기능을 구현하였
  습니다.)


multiprocessing
---------------

* 작업자 스레드와 프로세스의 기본 개수는 이제 "os.cpu_count()" 대신
  "os.process_cpu_count`를 사용해 결정됩니다. (Victor Stinner가
  :gh:`109649()"를 통해 기능을 구현하였습니다.)


os
--

* 현재 프로세스의 호출 스레드에서 사용할 수 있는 논리 CPU 코어 수를 얻
  기 위한 "process_cpu_count()" 함수를 추가했습니다. (Victor Stinner
  가 gh-109649를 통해 기능을 구현하였습니다.)

* "cpu_count()"와 "process_cpu_count()"는 새 환경 변수
  "PYTHON_CPU_COUNT" 또는 새 명령줄 옵션 "-X cpu_count"을 통해 재정의
  할 수 있습니다. 해당하는 옵션은 애플리케이션 코드나 컨테이너 자체를
  수정하지 않고 컨테이너 시스템의 CPU 자원을 제한하고자 하는 사용자에
  게 유용합니다. (Donghee Na가 gh-109595를 통해 기능을 구현하였습니다
  .)

* 리눅스의 *타이머 파일 디스크립터(file descriptor)*에 대한 저수준 인
  터페이스를 추가했으며, "timerfd_create()", "timerfd_settime()",
  "timerfd_settime_ns()", "timerfd_gettime()", "timerfd_gettime_ns()",
  "TFD_NONBLOCK", "TFD_CLOEXEC", "TFD_TIMER_ABSTIME",
  "TFD_TIMER_CANCEL_ON_SET"를 제공합니다. (Masaru Tsuchiyama가
  gh-108277를 통해 기능을 구현하였습니다.)

* "lchmod()"과 "chmod()"의 *follow_symlinks* 인자는 이제 윈도우에서도
  사용할 수 있습니다. 윈도우에서는 "lchmod()" 함수에서
  *follow_symlinks*의 기본값이 *False*입니다. (Serhiy Storchaka가
  gh-59616를 통해 기능을 구현하였습니다.)

* 이제 윈도우에서도 "fchmod()"와 "chmod()"의 파일 디스크립터(file
  descriptor) 지원을 사용할 수 있습니다. (Serhiy Storchaka가 gh-113191
  를 통해 기능을 구현하였습니다.)

* 윈도우에서 "mkdir()" 및 "makedirs()"는 이제 새 디렉터리에 액세스 제
  어를 적용하기 위해 *mode* 값 *0o700*을 전달하는 것을 지원합니다. 이
  는 "tempfile.mkdtemp()"와 관련되며, **CVE 2024-4030**의 완화된 해결
  안입니다. 다른 *mode* 값은 지금과 같이 무시됩니다. (Steve Dower가
  gh-118486를 통해 기능을 구현하였습니다.)

* 이제 "posix_spawn`에서 *env* 인자로 `None()"을 전달할 수 있으며, 이
  경우 새로 생성된 프로세스는 현재 프로세스의 환경을 사용합니다.
  (Jakub Kulik가 gh-113119를 통해 기능을 구현하였습니다.)

* "posix_spawn_file_actions_addclosefrom_np()"를 지원하는 플랫폼에서는
  이제 "posix_spawn()"의 *file_actions* 매개 변수에서
  "POSIX_SPAWN_CLOSEFROM"속성을 사용할 수 있습니다. (Jakub Kulik가
  gh-113117를 통해 기능을 구현하였습니다.)


os.path
-------

* 현재의 시스템에서 경로가 예약된 것인지 확인하기 위한 "isreserved()"
  함수를 추가했습니다. 해당하는 함수는 윈도우에서만 사용할 수 있습니다
  . (Barney Gale가 gh-88569를 통해 기능을 구현하였습니다.)

* 윈도우에서 "isabs()"는 이제 정확히 슬래시("\\" 또는 "/") 하나로 시작
  하는 경로를 절대 경로로 간주하지 않습니다. (Barney Gale와 Jon Foster
  가 gh-44626를 통해 기능을 구현하였습니다.)

* "realpath()"는 이제 파일에 접근할 수 없는 경우에도 MS-DOS 스타일 파
  일 이름을 해석할 수 있습니다. (Moonsik Park이 gh-82367를 통해 기능을
  구현하였습니다.)


pathlib
-------

* 지원되지 않는 경로 연산에 대해 "NotImplementedError" 대신 발생하는
  "UnsupportedOperation" 예외가 추가되었습니다. (Barney Gale이
  gh-89812를 통해 기능을 구현하였습니다.)

* 'file' URI("file:///")에서 "Path" 객체를 생성하는 새로운 생성자
  "Path.from_uri()"가 추가되었습니다. (Barney Gale이 gh-107465를 통해
  기능을 구현하였습니다.)

* 셸 스타일의 와일드카드를 통해 경로를 일치시키기 위한
  "PurePath.full_match()"가 추가되었으며, 재귀적 와일드카드인 "**"도
  지원합니다. (Barney Gale이 gh-73435를 통해 기능을 구현하였습니다.)

* 저수준 경로 파싱과 결합에 사용되는 "os.path" 구현을 저장하기 위한
  "PurePath.parser" 클래스 어트리뷰트가 추가되었습니다. "posixpath" 또
  는 "ntpath" 둘 중 하나입니다.

* "Path.glob()"과 "rglob()"에 키워드 전용 인자 *recurse_symlinks*를 추
  가했습니다. (Barney Gale이 gh-77609를 통해 기능을 구현하였습니다.)

* "Path.glob()"과 "rglob()"는 패턴이 ""**""로 끝날 때 이제 파일과 디렉
  터리를 모두 반환합니다. 이전에는 디렉터리만 반환되었습니다. (Barney
  Gale이 gh-70303를 통해 기능을 구현하였습니다.)

* "Path.is_file", "Path.is_dir", "Path.owner()", 그리고 "Path.group()"
  에 *follow_symlinks* 키워드 전용 인자를 추가하였습니다. (Barney Gale
  과 Kamil Turek이 각각 gh-105793과 gh-107962를 통해 기능을 구현하였습
  니다.)


pdb
---

* 이제 내장 함수 "breakpoint()"와 "set_trace()"는 다음에 실행될 코드
  줄에서가 아니라 바로 디버거에 진입합니다. 이를 통해, "breakpoint()"
  가 컨텍스트의 끝에 위치할 때 디버거가 컨텍스트 바깥에서 중단되던 문
  제가 발생하지 않도록 합니다. (Tian Gao가 gh-118579를 통해 기능을 구
  현하였습니다.)

* 이제 "sys.flags.safe_path"가 설정되어 있어도 "sys.path[0]"는 디버깅
  중인 스크립트의 디렉터리로 대체되지 않습니다. (Tian Gao와 Christian
  Walther가 gh-111762를 통해 기능을 구현하였습니다.)

* "zipapp"이 이제 디버깅 가능 대상으로서 지원됩니다. (Tian Gao가
  gh-118501를 통해 기능을 구현하였습니다.)

* Pdb에 새로운 "exceptions [exc_number]" 명령을 추가하여, "pm()"의 사
  후 디버깅 중에 연쇄(chained)된 예외들 사이를 이동할 수 있도록 하였습
  니다. (Matthias Bussonnier가 gh-106676를 통해 기능을 구현하였습니다
  .)

* 앞부분이 pdb 명령인 표현식과 문장들이 이제 올바르게 인식되어 실행됩
  니다. (Tian Gao가 gh-108464를 통해 기능을 구현하였습니다.)


queue
-----

* "Queue.shutdown"과 "ShutDown"을 추가하여 큐의 종료를 관리할 수 있도
  록 하였습니다. (Laurie Opperman과 Yves Duprat가 gh-104750를 통해 기
  능을 구현하였습니다.)


random
------

* 새로운 명령줄 인터페이스를 추가하였습니다. (Hugo van Kemenade가
  gh-118131를 통해 기능을 구현하였습니다.)


re
--

* 보다 더 명확한 전달을 위해 "re.error"를 "PatternError"로 이름을 바꾸
  었습니다. "re.error"는 이전 버전과의 호환성을 위해 계속 유지됩니다.


shutil
------

* "chown()"에서 *dir_fd* 그리고 *follow_symlinks* 키워드 인자를 지원합
  니다. (Berker Peksag와 Tahia K가 gh-62308를 통해 기능을 구현하였습니
  다.)


site
----

* ".pth" 파일은 먼저 UTF-8로 디코딩되고, UTF-8 디코딩에 실패하면 *로케
  일 인코딩*을 사용해 디코딩합니다. (Inada Naoki가 gh-117802를 통해 기
  능을 구현하였습니다.)


sqlite3
-------

* "Connection" 객체를 "close()" 메서드로 명시적으로 닫지 않으면 이제
  "ResourceWarning" 경고가 발생합니다. (Erlend E. Aasland가 gh-105539
  를 통해 기능을 구현하였습니다.)

* 데이터베이스 객체를 덤프할 때 필터링할 수 있도록
  "Connection.iterdump()"에 *filter* 키워드 전용 매개변수를 추가했습니
  다. (Mariusz Felisiak가 gh-91602를 통해 기능을 구현하였습니다.)


ssl
---

* "create_default_context()" API는 이제 기본 플래그로
  "VERIFY_X509_PARTIAL_CHAIN"과 "VERIFY_X509_STRICT"를 포함합니다.

  참고:

    "VERIFY_X509_STRICT" 를 사용하면, 하부 OpenSSL 구현에서는 원래 허
    용했을 수도 있는 **RFC 5280** 이전 형식의 인증서나 잘못된 인증서를
    거부할 수 있습니다. 이 동작을 비활성화하는 것은 권장되지 않지만,
    필요한 경우에는 다음과 같이 비활성화할 수 있습니다:

       import ssl

       ctx = ssl.create_default_context()
       ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT

  (William Woodruff가 gh-112389를 통해 기능을 구현하였습니다.)


statistics
----------

* 커널 밀도 추정을 위해 "kde()" 함수를 추가했습니다. 해당 함수를 통해
  고정된 개수의 이산 표본들로부터 연속 확률 밀도 함수를 추정할 수 있습
  니다. (Raymond Hettinger가 gh-115863를 통해 기능을 구현하였습니다.)

* "kde()"가 생성한 추정 확률 밀도 함수에서의 표본 샘플링을 위한
  "kde_random()" 함수가 추가되었습니다. (Raymond Hettinger가 gh-115863
  를 통해 기능을 구현하였습니다.)


subprocess
----------

* "subprocess" 모듈은 이제 더 많은 종류의 상황 및 경우에서
  "posix_spawn()" 함수를 사용합니다.

  *close_fds*가 *True`(기본값)일 때, C 라이브러리가
  :c:func:*!posix_spawn_file_actions_addclosefrom_np`을 제공하는 경우,
  "posix_spawn()"이 사용됩니다. 최신 버전의 리눅스, FreeBSD, 솔라리스
  가 이에 포함됩니다. 리눅스에서는 이 동작이 기존 리눅스의 "vfork()"
  기반 코드와 비슷한 성능을 보일 것입니다.

  비공개(private) 제어 설정인 "subprocess._USE_POSIX_SPAWN"을 *False*
  로 설정하면 "subprocess" 모듈이 "posix_spawn()"을 절대로 사용하지 않
  도록 강제할 수 있습니다. 구체적인 현실 상황에서의 활용에 있어 실제로
  이 값을 이렇게 설정해야 했던 경우가 있다면, 그러한 이유와 사용 중인
  플랫폼 정보를 추적기에 보고해 주시면 모든 사용자를 위해 API 선택 로
  직을 개선하는 데 도움이 됩니다.


sys
---

* 문자열이 인턴(intern)되었는지 테스트할 수 있는 "_is_interned()" 함수
  가 추가되었습니다. 일부 파이썬 구현에서는 해당하는 함수가 구현되어
  있지 않을 수 있음에 유의해주십사 부탁드립니다. (Serhiy Storchaka가
  gh-78573를 통해 기능을 구현하였습니다.)


tempfile
--------

* 윈도우에서는 "tempfile.mkdtemp()"에서 사용하는 기본 모드 *0o700*이
  "os.mkdir()"의 변경으로 인해 새 디렉터리에 대한 접근을 제한하도록 변
  경되었습니다. **CVE 2024-4030**의 해결을 위해 제안되었습니다. (Steve
  Dower가 gh-118486를 통해 기능을 구현하였습니다.)


time
----

* 윈도우에서는 "monotonic()"이 이제 해상도 15.6 밀리초인
  "GetTickCount64()" 시계 대신 해상도 1 마이크로초인
  "QueryPerformanceCounter()" 시계를 사용합니다. (Victor Stinner가
  gh-88494를 통해 기능을 구현하였습니다.)

* 윈도우에서 "time()"은 이제 해상도가 15.6밀리초인
  "GetSystemTimeAsFileTime()" 시계 대신, 해상도가 1마이크로초인
  "GetSystemTimePreciseAsFileTime()" 시계를 사용합니다. (Victor
  Stinner가 gh-63207를 통해 기능을 구현하였습니다.)


tkinter
-------

* "tkinter" 위젯에 "tk_busy_hold()", "tk_busy_configure()",
  "tk_busy_cget()", "tk_busy_forget()", "tk_busy_current()",
  "tk_busy_status()" 메서드를 추가되었습니다.

* "tkinter" 위젯 메서드 "wm_attributes()"는 이제 창 어트리뷰트를 가져
  올 때 접두사 하이픈 없이 속성 이름만 전달할 수 있습니다. 예를 들어,
  "w.wm_attributes('alpha')"가 가능합니다. 또한,
  "w.wm_attributes(alpha=0.5)"와 같이, 설정할 어트리뷰트와 값을 키워드
  인자로 지정할 수 있습니다. (Serhiy Storchaka가 gh-43457를 통해 기능
  을 구현하였습니다.)

* 새로운 선택적 키워드 전용 매개변수 *return_python_dict*를 사용하면
  "wm_attributes()"가 어트리뷰트를 "dict"로 반환하도록 할 수 있습니다.
  (Serhiy Storchaka가 gh-43457를 통해 기능을 구현하였습니다.)

* 새로운 선택적 키워드 전용 매개변수 *return_ints*를 사용하면
  "Text.count()"가 단순한 "int" 값을 반환할 수 있습니다. 그 밖의 경우
  에는 1-튜플 또는 *None*으로 반환합니다. (Serhiy Storchaka가 gh-97928
  를 통해 기능을 구현하였습니다.)

* "tkinter.ttk.Style"의 "element_create()" 메서드에서 *vsapi* 엘리먼트
  타입을 지원합니다. (Serhiy Storchaka가 gh-68166를 통해 기능을 구현하
  였습니다.)

* Tkinter 위젯에 "after_info()" 메서드를 추가했습니다. (Cheryl Sabella
  가 gh-77020를 통해 기능을 구현하였습니다.)

* 한 이미지의 영역을 다른 이미지로 복사할 수 있도록 "PhotoImage" 클래
  스에 새 메서드 "copy_replace()"를 추가했습니다. 이때 픽셀 확대
  (zooming), 서브샘플링(subsampling) 또는 둘 다를 함께 적용할 수 있습
  니다. (Serhiy Storchaka가 gh-118225를 통해 기능을 구현하였습니다.)

* "PhotoImage" 클래스의 "copy()", "zoom()", "subsample()" 메서드에
  *from_coords* 매개 변수가 추가되었습니다. "PhotoImage" 클래스의
  "copy()" 메서드에 *zoom*과 *subsample* 매개 변수가 추가되었습니다.
  (Serhiy Storchaka가 gh-118225를 통해 기능을 구현하였습니다.)

* 파일에서 이미지를 읽기 위한 "read()" 메서드와 이미지 데이터를 가져오
  기 위한 "data()" 메서드가 "PhotoImage" 클래스에 추가되었습니다.
  "write()" 메서드에 *background* 및 *grayscale* 매개변수가 추가되었습
  니다. (Serhiy Storchaka가 gh-118271를 통해 기능을 구현하였습니다.)


traceback
---------

* "TracebackException"에 "exc_type_str"어트리뷰트가 추가되었습니다. 이
  어트리뷰트에는 *exc_type*의 문자열 표현이 저장됩니다. 타입 객체 자체
  를 담고 있는 "exc_type"어트리뷰트의 사용 지원이 중단(deprecate)되었
  습니다. "exc_type"을 저장할지 여부를 나타내기 위해 기본값이 "True"인
  매개 변수 *save_exc_type*이 추가되었습니다. (Irit Katriel이
  gh-112332을 통해 기능을 구현하였습니다.)

* "BaseExceptionGroup" 인스턴스의 중첩된 예외를 재귀적으로 서식을 지정
  할 수 있도록 "TracebackException.format_exception_only()" 메서드에
  새 키워드 전용(keyword-only) 매개 변수 *show_group* 이 추가되었습니
  다. (Irit Katriel가 gh-105292를 통해 기능을 구현하였습니다.)


types
-----

* "SimpleNamespace"는 이제 네임스페이스의 속성을 초기화하기 위해 단일
  위치 인자를 받을 수 있습니다. 해당하는 매개 변수는 매핑 (mapping)이
  거나 키/값 쌍의 이터러블이어야 합니다. (Serhiy Storchaka가 gh-108191
  를 통해 기능을 구현하였습니다.)


typing
------

* **PEP 705**: 정적 타입 검사기(type checker)에서 "TypedDict" 항목을
  읽기 전용으로 표시하기 위한 특수 타이핑 구조물인 "ReadOnly"를 추가했
  습니다.

* **PEP 742**: 타입 축소(type narrowing) 방법을 타입 검사기에 알려 주
  는 타이핑 구조물인 "TypeIs"를 추가했습니다.

* "typing" 모듈에서 일부 매개변수의 기본값을 나타내는 데 사용되는 센티
  넬 객체 "NoDefault" 가 추가되었습니다. (Jelle Zijlstra가 gh-116126을
  통해 기능을 구현하였습니다.)

* "typing.Protocol"을 정의하는 멤버들의 집합을 반환하는
  "get_protocol_members()" 함수가 추가되었습니다. (Jelle Zijlstra가
  gh-104873를 통해 기능을 구현하였습니다.)

* 클래스가 "Protocol" 인지 확인할 수 있도록 "is_protocol()" 함수를 추
  가했습니다. (Jelle Zijlstra가 gh-104873를 통해 기능을 구현하였습니다
  .)

* 이제 "ClassVar" 를 "Final" 안에 중첩해 사용할 수 있고, 그 반대의 중
  첩 역시 가능합니다. (Mehdi Drissi가 gh-89547를 통해 기능을 구현하였
  습니다.)


unicodedata
-----------

* 유니코드 데이터베이스가 버전 15.1.0 으로 갱신되었습니다. (James
  Gerity가 gh-109559를 통해 기능을 구현하였습니다.)


venv
----

* 가상 환경 디렉터리 안에서 소스 제어 관리(SCM)용 무시(ignore) 파일들
  을 생성하는 기능이 추가되었습니다. Git이 기본적으로 지원됩니다.
  "EnvBuilder", "create()" 와 같은 API를 통해 옵트인(opt-in) 방식으로
  제공되며, 이를 확장해 다른 SCM도 지원할 수 있습니다. 또한 CLI에서는
  "--without-scm-ignore-files" 옵션을 사용하여 이 동작을 옵트아웃(opt-
  out)할 수 있습니다. (Brett Cannon이 gh-108125를 통해 기능을 구현하였
  습니다.)


warnings
--------

* **PEP 702**: 새 "warnings.deprecated()" 데코레이터는 사용 지원 중단
  (deprecate) 정보를 *정적 타입 검사기*에 전달하고, 사용이 중단된 클래
  스와 함수의 사용 시 경고를 발생시키는 방법을 제공합니다. 이와 같이
  데코레이터가 함수나 클래스와 함께 사용되는 경우에는 또한 런타임 때에
  "DeprecationWarning"이 발생합니다. (Jelle Zijlstra가 gh-104003를 통
  해 기능을 구현하였습니다.)


xml
---

* 다섯 개의 새 메서드를 추가하여 Expat >=2.6.0의 구문 재분석 연기
  (reparse deferral) (**CVE 2023-52425**)를 제어할 수 있도록 합니다:

  * "xml.etree.ElementTree.XMLParser.flush()"

  * "xml.etree.ElementTree.XMLPullParser.flush()"

  * "xml.parsers.expat.xmlparser.GetReparseDeferralEnabled()"

  * "xml.parsers.expat.xmlparser.SetReparseDeferralEnabled()"

  * "xml.sax.expatreader.ExpatParser.flush()"

  (Sebastian Pipping이 gh-115623을 통해 기능을 구현하였습니다.)

* 명시적인 클린업를 위해 "iterparse()"가 반환하는 이터레이터에
  "close()" 메서드가 추가되었습니다. (Serhiy Storchaka가 gh-69893을 통
  해 기능을 구현하였습니다.)


zipimport
---------

* ZIP64 형식 파일에 대한 지원이 추가되었습니다.  거대한 데이터를 그 누
  가 사랑하지 않을 수 있나요?  (Tim Hatch가 gh-94146를 통해 기능을 구
  현하였습니다.)


최적화 관련 사항들
==================

* 몇몇 표준 라이브러리 모듈의 임포트 시간이 크게 개선되었습니다. 예를
  들어, "typing" 모듈의 임포트 시간은 "re" 및 "contextlib"에 대한 의존
  성을 제거함을 통해 약 3분의 1만큼 단축되었습니다. 임포트 시간이 단축
  된 다른 모듈들은 "email.utils", "enum", "functools",
  "importlib.metadata", "threading" 등 입니다. (Alex Waygood, Shantanu
  Jain, Adam Turner, Daniel Hollas 등이 gh-109653을 통해 기능을 구현하
  였습니다.)

* "textwrap.indent()"는 이제 대규모 입력에 대해 예전보다 약 30% 더 빠
  르게 동작합니다. (Inada Naoki가 gh-107369를 통해 기능을 구현하였습니
  다.)

* "subprocess" 모듈은 이제 많은 최신 플랫폼에서, *close_fds*가 기본값
  인 "True"인 경우를 포함하는 방식으로, 더 많은 상황에서
  "posix_spawn()" 함수를 사용합니다. 해당하는 방식은 FreeBSD와 솔라리
  스에서 프로세스를 시작할 때 눈에 띄는 성능 향상을 제공할 것으로 보입
  니다. 보다 자세한 내용의 경우 위의 subprocess를 참고 부탁드립니다.
  (Jakub Kulik이 gh-113117를 통해 기능을 구현하였습니다.)


제거된 모듈들과 API들
=====================


PEP 594: 표준 라이브러리에서 "죽은 배터리들(dead batteries)" 제거하기
---------------------------------------------------------------------

**PEP 594**는 파이썬의 역사와 관련된 이유로 남아 있거나, 구식으로 간주
되고 있거나, 보안에 문제가 있어 일명 '죽은 배터리(dead batteries)'로
불리는 모듈 19개를 표준 라이브러리에서 제거할 것을 제안했습니다. 다음
의 해당하는 모듈들은 파이썬 3.11에서 사용 지원이 중단(deprecate)되었으
며, 이제는 완전히 제거되었습니다:

* "aifc"

  * standard-aifc: PyPI에 재배포된 *aifc* 라이브러리를 사용해주시기를
    부탁드립니다.

* "audioop"

  * audioop-lts: PyPI의 *audioop-lts* 라이브러리를 사용해주시기를 부탁
    드립니다.

* "chunk"

  * standard-chunk: PyPI에 재배포된 *chunk* 라이브러리를 사용해주시기
    를 부탁드립니다.

* "cgi" and "cgitb"

  * "cgi.FieldStorage"는 통상 *GET* 및 *HEAD* 요청에서는
    "urllib.parse.parse_qsl`로 대체할 수 있고, `POST()" 및 *PUT* 요청
    에서는 "email.message" 모듈이나 multipart 라이브러리를 사용하면 대
    체할 수 있습니다.

  * 입력이 *multipart/form-data*인 경우를 제외하면, 원하는 쿼리 문자열
    에 대해 "urllib.parse.parse_qs()"를 직접 호출하는 방식으로
    "cgi.parse()"를 대체할 수 있습니다. 다만 입력이 *multipart/form-
    data*인 경우에는 아래에 설명된 대로 "cgi.parse_multipart()"를 사용
    하는 방식으로 대체해야 합니다.

  * "cgi.parse_header()" 함수는 동일한 MIME RFC들을 구현하는 "email"
    패키지의 기능으로 대체할 수 있습니다. 예를 들어,
    "email.message.EmailMessage"를 사용하는 경우는 다음과 같습니다:

       from email.message import EmailMessage

       msg = EmailMessage()
       msg['content-type'] = 'application/json; charset="utf8"'
       main, params = msg.get_content_type(), msg['content-type'].params

  * "cgi.parse_multipart()"는 동일한 MIME RFC들을 구현하는 "email" 패
    키지의 기능으로 대체되거나 multipart 라이브러리로 대체될 수 있습니
    다. 예를 들어, "email.message.EmailMessage" 및
    "email.message.Message" 클래스를 활용함을 통해 대체할 수 있습니다.

  * "standard-cgi: & standard-cgitb: PyPI에 재배포된 "cgi" & "cgitb"
    라이브러리를 사용해주시기를 부탁드립니다.

* "crypt" 및 비공개(private) "_crypt" 확장 모듈. "hashlib" 모듈은 단순
  히 값을 해싱해야 할 때 사용할 수 있는 가능한 하나의 대안입니다. 또한
  , PyPI에는 다양한 제삼자 라이브러리가 준비되어 있습니다.

  * bcrypt: 소프트웨어와 서버에서 사용할 수 있는 보다 현대적인 암호 해
    싱 라이브러리입니다.

  * argon2-cffi: 안전한 Argon2 암호 해싱 알고리즘입니다.

  * legacycrypt: POSIX *crypt* 라이브러리 호출과 관련 기능을 위한
    "ctypes" 래퍼(wrapper)입니다.

  * crypt_r: "crypt" 모듈의 포크(fork)로, *crypt_r(3)* 라이브러리 호출
    과 관련 기능을 감싸는 래퍼(wrapper)입니다.

  * standard-crypt 및 deprecated-crypt-alternative: PyPI에서 배포되는
    *crypt* 라이브러리 재배포판과 *_crypt* 라이브러리 재구현을 사용하
    십시오.

* "imghdr": 대체 라이브러리로 filetype, puremagic, 그리고 python-magic
  를 사용해야 합니다. 예를 들어, "puremagic.what()" 함수를 사용하여
  "imghdr"가 지원하던 모든 파일 형식에 대해 "imghdr.what()" 함수를 대
  체할 수 있습니다.

  * standard-imghdr: PyPI에서 배포되는 *imghdr* 라이브러리 재배포판을
    사용해주시기를 부탁드립니다.

* "mailcap": 대신 "mimetypes" 모듈을 사용해주시기를 부탁드립니다.

  * standard-mailcap: PyPI에서 배포되는 *mailcap* 라이브러리 재배포판
    을 사용해주시기를 부탁드립니다.

* "msilib"

* "nis"

* "nntplib": 대신 PyPI의 pynntp 라이브러리를 사용하십시오.

  * standard-nntplib: PyPI에서 배포되는 *nntplib* 라이브러리 재배포판
    을 사용하십시오.

* "ossaudiodev": 오디오 재생에 있어 해당 라이브러리 대신 PyPI의 pygame
  라이브러리를 사용해주시기를 부탁드립니다.

* "pipes": 대신 "subprocess" 모듈을 사용해주시기를 부탁드립니다. 문서
  화되지 않은 "pipes.quote" 함수를 대신하여 "shlex.quote()"를 사용해주
  시기를 부탁드립니다.

  * standard-pipes: PyPI에서 재배포되는 *pipes* 라이브러리를 사용해주
    시기를 부탁드립니다.

* "sndhdr": filetype, puremagic 혹은 python-magic 라이브러리를 대신 사
  용해주시기를 부탁드립니다.

  * standard-sndhdr: PyPI에서 재배포되는 *sndhdr* 라이브러리를 사용해
    주시기를 부탁드립니다.

* "spwd": PyPI에서 제공되는 python-pam 라이브러리를 대신 사용해주시기
  를 부탁드립니다.

* "sunau"

  * standard-sunau: PyPI에서 재배포되는 *sunau* 라이브러리를 사용해주
    시기를 부탁드립니다.

* "telnetlib": PyPI에서 제공되는 telnetlib3 또는 Exscript 라이브러리를
  대신 사용해주시기를 부탁드립니다.

  * standard-telnetlib: PyPI에서 재배포되는 *telnetlib* 라이브러리를
    사용해주시기를 부탁드립니다.

* "uu": 보다 현대적인 대안으로, "base64" 모듈을 대신 사용해주시기를 부
  탁드립니다.

  * standard-uu: PyPI에서 재배포되는 "uu" 라이브러리를 사용해주시기를
    부탁드립니다.

* "xdrlib"

  * standard-xdrlib: PyPI에서 재배포되는 "xdrlib" 라이브러리를 사용해
    주시기를 부탁드립니다.

(Victor Stinner와 Zachary Ware가 gh-104773와 gh-104780를 통해 기능을
구현하였습니다.)


2to3
----

* 파이썬 3.11에서 사용 지원 중단되었던 **2to3**과 "lib2to3" 모듈이 제
  거되었습니다.


builtins
--------

* 연쇄(chained) "classmethod" 설명자(descriptors)에 대한 지원이 중단되
  었습니다(gh-63272를 통해 도입된 기능입니다). 이제 "property"와 같은
  다른 디스크립터를 감싸기(wrap) 위해 사용할 수 없습니다. 이 기능의 핵
  심 설계에 결함이 있었고, 여러 문제를 발생시켰었습니다. "classmethod"
  를 전달(pass-through)하기 위해서는, Python 3.10에서 추가된
  "__wrapped__" 어트리뷰트를 사용하는 것이 보다 바람직합니다. (Raymond
  Hettinger가 gh-89519를 통해 기능을 구현하였습니다.)

* 일시 중지된 프레임에서 "frame.clear()"를 호출하면 (실행 중인 프레임
  에서와 마찬가지로) "RuntimeError"가 발생합니다. (Irit Katriel이
  gh-79932를 통해 기능을 구현하였습니다.)


configparser
------------

* 문서화되지 않은 "LegacyInterpolation" 클래스를 제거했습니다. 이 클래
  스는 문서 문자열(docstring)에서는 파이썬 3.2부터 사용 지원 중단
  (deprecated)으로 표시되어 있었습니다. 런타임에서는 파이썬 3.11부터
  사용 지원 중단(deprecated)으로 표시되어 있었습니다. (Hugo van
  Kemenade가 gh-104886를 통해 기능을 구현하였습니다.)


importlib.metadata
------------------

* EntryPoint 객체에 대해 더는 사용 지원되지 않는(deprecated) 서브스크
  립트("__getitem__()") 방식의 액세스를 제거했습니다. (Jason R. Coombs
  가 gh-113175를 통해 기능을 구현하였습니다.)


locale
------

* 파이썬 3.11에서 사용 지원 중단(deprecated)되었던
  "locale.resetlocale()" 함수를 제거했습니다. 대신
  "locale.setlocale(locale.LC_ALL, \"\")"을 사용해주시기를 부탁드립니
  다.


opcode
------

* "opcode.ENABLE_SPECIALIZATION"를 "_opcode.ENABLE_SPECIALIZATION"로
  옮겼습니다. 이 필드는 3.12에서 추가되었지만 문서화된 적이 없으며, 외
  부에서 사용하도록 의도되었던 것이 아니었습니다. (Irit Katriel이
  gh-105481를 통해 기능을 구현하였습니다.)

* "opcode.is_pseudo()", "opcode.MIN_PSEUDO_OPCODE",
  "opcode.MAX_PSEUDO_OPCODE"를 제거했습니다. 해당하는 어트리뷰트는 파
  이썬 3.12에서 추가되었지만 문서화되지 않았었고, "dis"를 통해 노출되
  지도 않았으며, 외부에서 사용하도록  의도되었던 것이 아니었습니다.
  (Irit Katriel이 gh-105481를 통해 기능을 구현하였습니다.)


optparse
--------

* 해당하는 모듈은 이제 *소프트 사용 지원 중단(soft deprecated)* 상태로
  간주되지 않습니다. 제삼자(third-party) 명령행 인자 처리 라이브러리를
  사용하지 않는 새로운 프로젝트에서는 여전히 "argparse"가 우선적으로
  권장됩니다. *argparse*의 동작 방식에는 보다 저수준인 *optparse* 모듈
  이 *인자 처리 라이브러리를 작성*할 때나 C언어의 "getopt()" 함수의 동
  작에서 유래한 다양한 유닉스 명령행 처리 규약을 *argparse*보다 더 엄
  격하게 따르는 명령행 어플리케이션을 구현할 때 더 나은 기반을 제공할
  수 있는 측면들도 고려되어야 합니다. (Alyssa Coghlan와 Serhiy
  Storchaka가 gh-126180를 통해 기능을 구현하였습니다.)


pathlib
-------

* "Path" 객체를 컨텍스트 관리자로 사용할 수 있는 기능이 제거되었습니다
  . 해당하는 기능은 과거에 사용 지원이 중단(deprecated)되어 있었으며,
  파이썬 3.9부터는 아무런 효과도 없었습니다. (Barney Gale이 gh-83863를
  통해 기능을 구현하였습니다.)


re
--

* "re.template()"를 ("re.TEMPLATE" 및 "re.T" 플래그와 함께) 제거하였습
  니다. 해당하는 함수는 문서화되어 있지 않았으며, 사용 지원 중단
  (deprecated)되어 있었으며, 정상적으로 작동하지 않았었습니다. (Serhiy
  Storchaka와 Nikita Sobolev가 gh-105687를 통해 기능을 구현하였습니다
  .)


tkinter.tix
-----------

* 파이썬 3.6에서 사용 지원이 중단(deprecated)되었던 "tkinter.tix" 모듈
  이 제거되었습니다. 해당하는 모듈이 감싸고(wrapped) 있던 Tix 제삼자
  라이브러리는 더 이상 유지 보수되지 않습니다. (Zachary Ware가
  gh-75552를 통해 기능을 구현하였습니다.)


turtle
------

* (문서에서는 파이썬 3.1부터, 런타임에서는 파이썬 3.11부터) 사용 지원
  이 중단(deprecated)되었던 "RawTurtle.settiltangle()" 메서드가 제거되
  었습니다. (Hugo van Kemenade가 gh-104876를 통해 기능을 구현하였습니
  다.)


typing
------

* 파이썬 3.8부터 사용 지원이 중단(deprecated)되었던 "typing.io" 및
  "typing.re" 네임스페이스가 제거되었습니다. 해당하는 네임스페이스에
  있던 항목들은 이제 "typing" 모듈에서 직접 임포트할 수 있습니다.
  (Sebastian Rittau가 gh-92871를 통해 기능을 구현하였습니다.)

* 키워드 인자를 사용해서 "TypedDict" 타입들을 생성하는 방식은 파이썬
  3.11에서 사용 지원이 중단(deprecated)되었으며, 이제 제거되었습니다.
  (Tomas Roun이 gh-104786를 통해 기능을 구현하였습니다.)


unittest
--------

* 다음의 "unittest" 함수들은 파이썬 3.11에서 사용 지원이 중단
  (deprecated)되었으며 제거되었습니다:

  * "unittest.findTestCases()"

  * "unittest.makeSuite()"

  * "unittest.getTestCaseNames()"

  대신 "TestLoader" 메서드를 사용해주시기를 부탁드립니다.

  * "loadTestsFromModule()"

  * "loadTestsFromTestCase()"

  * "getTestCaseNames()"

  (Hugo van Kemenade가 gh-104835를 통해 기능을 구현하였습니다.)

* 테스트되지 않았으며 문서화되지 않았던 "TestProgram.usageExit()" 메서
  드가 제거되었습니다. 해당하는 메서드는 파이썬 3.11에서 사용 지원 중
  단(deprecated)되었었습니다.


urllib
------

* 파이썬 3.6에서 사용 지원 중단(deprecated)되었던
  "urllib.request.urlopen()" 함수의 *cafile*, *capath*, *cadefault* 매
  개 변수가 제거되었습니다. 대신 "SSLContext" 인스턴스와 함께
  *context* 매개 변수를 사용해주시기를 부탁드립니다.
  "ssl.SSLContext.load_cert_chain()" 함수를 사용함을 통해 특정 인증서
  를 로드하거나, "ssl.create_default_context()"가 운영 체제의 신뢰할
  수 있는 인증 기관(CA) 인증서를 선택하도록 할 수 있습니다. (Victor
  Stinner가 gh-105382를 통해 기능을 구현하였습니다.)


webbrowser
----------

* 테스트되지 않았고 문서화되지 않았던 "MacOSX" 클래스가 제거되었습니다
  . 해당하는 클래스는 파이썬 3.11에서 사용 지원 중단(deprecated)되었었
  습니다. 대신 파이썬 3.2에서 도입된 "MacOSXOSAScript" 클래스를 사용해
  주시기를 부탁드립니다. (Hugo van Kemenade가 gh-104804를 통해 기능을
  구현하였습니다.)

* 사용 지원이 중단(deprecated)된 "MacOSXOSAScript._name" 어트리뷰트가
  제거되었습니다. 대신 "MacOSXOSAScript.name" 어트리뷰트를 사용해주시
  기를 부탁드립니다. (Nikita Sobolev가 gh-105546를 통해 기능을 구현하
  였습니다.)


New Deprecations
================

* 사용자 정의 함수:

  * 새 코드 객체의 타입이 함수의 타입과 일치하지 않는 경우, 함수의
    "__code__" 어트리뷰트에 값을 대입하는 기능은 사용 지원이 중단
    (deprecated)되었습니다. 구분되는 타입은 다음과 같습니다: 일반 함수
    , 제너레이터, 비동기 제너레이터, 그리고 코루틴. (Irit Katriel이
    gh-81137을 통해 기능을 구현하였습니다.)

* "array":

  * 런타임에서 *'u'* 형식 코드("wchar_t")에 대한 사용 지원이 중단
    (deprecated)되었습니다. 해당하는 형식 코드는 파이썬 3.3 문서에서
    사용 지원이 중단되었으며, 파이썬 3.16에서 제거될 예정입니다. 대신
    유니코드 문자에는 *'w'* 형식 코드("Py_UCS4")를 사용해주시기를 부탁
    드립니다. (Hugo van Kemenade가 gh-80480를 통해 기능을 구현하였습니
    다.)

* "ctypes":

  * 파이썬 3.15에서 제거될 예정인, 문서화되지 않은 "SetPointerType()"
    함수에 대한 사용 지원을 중단(deprecate)합니다. (Victor Stinner가
    gh-105733를 통해 기능을 구현하였습니다.)

  * *type * length* 곱셈 사용을 권장하기 위해 "ARRAY()" 함수를 *소프트
    사용 지원 중단* 상태로 표시합니다. (Victor Stinner가 gh-105733를
    통해 기능을 구현하였습니다.)

* "decimal":

  * Deprecate the non-standard and undocumented "Decimal" format
    specifier "'N'", which is only supported in the "decimal" module's
    C implementation. Scheduled to be removed in Python 3.18.
    (Contributed by Serhiy Storchaka in gh-89902.)

* "dis":

  * "HAVE_ARGUMENT" 구분자에 대한 사용 지원을 중단(deprecate)합니다.
    대신 "hasarg"을 통해 포함 여부(membership)를 검사해주시기를 부탁드
    립니다. (Irit Katriel이 gh-109319를 통해 기능을 구현하였습니다.)

* "gettext":

  * "gettext" 모듈에서 복수형을 고려하는 함수와 메서드에 정수가 아닌
    수를 인수로 사용하는 경우에 대한 사용 지원을 중단(deprecate)합니다
    . (Serhiy Storchaka가 gh-88434를 통해 기능을 구현하였습니다.)

* "glob":

  * 문서화되지 않은 "glob0()" 및 "glob1()" 함수에 대한 사용 지원을 중
    단(deprecate)합니다. "glob()"을 사용하고, 루트 디렉터리를 지정하는
    *경로류 객체*를 *root_dir* 매개 변수로 대신 전달하세요. (Barney
    Gale이 gh-117337를 통해 기능을 구현하였습니다.)

* "http.server":

  * "CGIHTTPRequestHandler" 클래스는 사용 지원 중단(deprecate)되었으며
    , Python 3.15에서 제거될 예정입니다. 프로세스 기반 CGI HTTP 서버는
    오래전부터 사실상 사용되지 않고 있었습니다. 관련된 코드들은 오래되
    었을 뿐 아니라 더 이상 유지 보수되고 있지 않으며, 실제로 거의 사용
    되고 있지 않은 것으로 보입니다. 보안과 기능 모두에 있어 문제가 있
    으며 버그 발생 가능성이 매우 높습니다. (Gregory P. Smith가
    gh-109096를 통해 기능을 구현하였습니다.)

  * **python -m http.server** 명령 줄 인터페이스의 "--cgi" 플래그는 사
    용 지원 중단(deprecate)되었으며, Python 3.15에서 제거될 예정입니다
    . (Gregory P. Smith가 gh-109096를 통해 기능을 구현하였습니다.)

* "mimetypes":

  * 파일 경로 인수를 받는 "guess_type()" 호출은 *소프트 사용 지원 중단
    * 처리되었습니다. 대신 " (Serhiy Storchaka가 :gh:`66543()"를 통해
    기능을 구현하였습니다.)

* "re":

  * 모듈 수준의 "split()", "sub()", "subn()" 함수들에 선택적 인자인
    *maxsplit*, *count*, *flags*를 위치 인자로 전달하는 방식이 사용 지
    원 중단(deprecate)되었습니다. 관련 매개 변수들은 향후 Python 버전
    에서 키워드 전용 매개 변수로 변경될 예정입니다. (Serhiy Storchaka
    가 gh-56166를 통해 기능을 구현하였습니다.)

* "pathlib":

  * "PurePath.is_reserved()"는 사용 지원 중단(deprecated)되었으며, 파
    이썬 3.15에서 제거될 것입니다. 윈도우에서 예약된 경로를 감지하려면
    "os.path.isreserved()"를 사용해주시기를 부탁드립니다. (Barney Gale
    이 gh-88569를 통해 기능을 구현하였습니다.)

* "platform":

  * "java_ver()"는 사용 지원 중단(deprecated)되었으며, 파이썬 3.15에서
    제거될 것입니다. 해당하는 함수는 Jython 지원에만 유용할 수 있는 것
    으로 보이며, API가 혼란스럽고, 대부분의 경우 테스트되지 않았습니다
    . (Nikita Sobolev가 gh-116349를 통해 기능을 구현하였습니다.)

* "pydoc":

  * 문서화되지 않은 "ispackage()" 함수는 이제 사용 지원 중단
    (deprecated)되었습니다.

* "sqlite3":

  * "connect()" 함수와 "Connection" 생성자에 두 개 이상의 위치 인자를
    전달하는 방식이 이제 사용 지원 중단(deprecated)되었습니다. 이외의
    매개변수들은 파이썬 3.15부터 키워드 전용 매개변수로 사용 가능합니
    다. (Erlend E. Aasland가 gh-107948를 통해 기능을 구현하였습니다.)

  * "Connection.create_function()"과 "Connection.create_aggregate()"에
    이름, 인자의 개수, 호출 가능한 객체(callable)을 키워드 인자로 전달
    하는 방식이 이제 사용 지원 중단(deprecated)되었습니다. 해당하는 매
    개변수들은 파이썬 3.15부터 위치 전용 매개변수로 사용 가능합니다.
    (Erlend E. Aasland가 gh-108278를 통해 기능을 구현하였습니다.)

  * "Connection" 의 "set_authorizer()", "set_progress_handler()",
    "set_trace_callback()" 메서드에서 콜백 호출 가능한 객체(callback
    callable)들을 키워드 인자로 전달하는 동작이 사용 지원 중단
    (deprecated)되었습니다. 콜백 호출 가능한 객체(callback callable)의
    경우 파이썬 3.15부터는 위치 전용 인자로만 전달할 수 있습니다.
    (Erlend E. Aasland가 gh-108278를 통해 기능을 구현하였습니다.)

* "sys":

  * "_enablelegacywindowsfsencoding()" 함수를 사용 지원 중단
    (deprecate)하였습니다. 파이썬 3.16에서 제거될 예정입니다. 대신
    "PYTHONLEGACYWINDOWSFSENCODING" 환경 변수를 사용해주시기를 부탁드
    립니다. (Inada Naoki가 gh-73427을 통해 기능을 구현하였습니다.)

* "tarfile":

  * 문서화되지 않았으며 사용되지 않고 있는 "TarFile.tarfile" 속성을 사
    용 지원 중단(deprecate)하고 파이썬 3.16에서 제거할 예정입니다.
    (gh-115256를 통해 기능이 구현되었습니다.)

* "traceback":

  * "TracebackException.exc_type" 속성을 사용 지원 중단(deprecate)합니
    다. 대신 "TracebackException.exc_type_str"을 사용해주시기를 부탁드
    립니다. (Irit Katriel이 gh-112332를 통해 기능을 구현하였습니다.)

* "typing":

  * 문서화되지 않은, "NamedTuple" 클래스를 만들 때에 사용되는 키워드
    인자에 대한 구문 문법(syntax)을 사용 지원 중단(deprecate)합니다.
    예를 들어, "Point = NamedTuple(\"Point"\, x=int, y=int)" 같은 구문
    은 파이썬 3.15에서 제거될 예정입니다. 대신 관련된 클래스에 대한 혹
    은 관련된 함수형 구문 문법(syntax)을 사용해주시기를 부탁드립니다.
    (Alex Waygood가 gh-105566를 통해 기능을 구현하였습니다.)

  * "NamedTuple" 또는 "typing.TypedDict" 클래스를 만들 때 *fields* 매
    개변수를 생략하는 것과, 두 가지의 타입 모두에 있어 *fields* 매개변
    수에 "None"을 전달하는 방식의 사용이 사용 지원 중단(deprecate)되었
    습니다. 파이썬 3.15에서는 *fields* 매개 변수에 유효한 시퀀스를 반
    드시 지정해주셔야 합니다. 필드가 없는(zero field의) NamedTuple 클
    래스를 만들려면 "class NT(NamedTuple): pass"이나 "NT =
    NamedTuple(\"NT\", ())"을 사용하십시오. 필드가 없는 TypedDict 클래
    스를 만들려면 "class TD(TypedDict): pass"또는 "TD =
    TypedDict(\"TD\", {})"를 사용해주시기를 부탁드립니다. (Alex
    Waygood가 gh-105566와 gh-105570를 통해 기능을 구현하였습니다.)

  * "typing.no_type_check_decorator()" 데코레이터 함수를 사용 지원 중
    단(deprecate)하였으며, 파이썬 3.15에서 제거할 예정입니다. "typing"
    모듈에 도입된 지 8년이 지났지만, 여전히 여러 인지도 있는 주요 정적
    타입 검사기(type checker)도 이를 지원하지 않고 있습니다. (Alex
    Waygood이 gh-106309를 통해 기능을 구현하였습니다.)

  * "typing.AnyStr"의 사용 지원이 중단되었습니다. 파이썬 3.16에서는
    "typing.__all__"에 더 이상 포함되지 않도록 제거될 것입니다. 해당하
    는 코드를 임포트(import)하거나 액세스하면 런타임에
    "DeprecationWarning"이 발생하게 될 것입니다. 파이썬 3.18에서 완전
    히 제거될 예정입니다. 대신 새로운 타입 매개변수 구문을 사용해주시
    기를 부탁드립니다. (Michael The가 gh-107116를 통해 기능을 구현하였
    습니다.)

* "wave":

  * "Wave_read" 및 "Wave_write" 클래스에 있는 "getmark()",
    "setmark()", "getmarkers()" 메서드의 사용 지원이 중단(deprecated)
    되었으며, 파이썬 3.15에서 제거될 예정입니다. (Victor Stinner가
    gh-105096를 통해 기능을 구현하였습니다.)


파이썬 3.14에서 제거 예정인 항목들
----------------------------------

* "argparse": "argparse.BooleanOptionalAction"의 *type*, *choices*,
  *metavar* 매개변수의 사용 지원이 중단(deprecated)되었으며, 파이썬
  3.14에서 제거될 예정입니다. (Nikita Sobolev가 gh-92248을 통해 기능을
  구현하였습니다.)

* "ast": 다음 기능들은 파이썬 3.8부터 문서상에서 사용 지원이 중단
  (deprecated)된 것으로 표시되었었습니다. 이제 실행 중에 접근하거나 사
  용하면 런타임에 "DeprecationWarning"이 발생합니다. 파이썬 3.14에서
  제거될 예정입니다:

  * "ast.Num"

  * "ast.Str"

  * "ast.Bytes"

  * "ast.NameConstant"

  * "ast.Ellipsis"

  대신 "ast.Constant"을 사용해주시기를 부탁드립니다. (Serhiy Storchaka
  가 gh-90953을 통해 기능을 구현하였습니다.)

* "asyncio":

  * 자식 관찰자 클래스(child watcher class)인
    "asyncio.MultiLoopChildWatcher", "asyncio.FastChildWatcher",
    "asyncio.AbstractChildWatcher", 그리고 "asyncio.SafeChildWatcher"
    는 사용 지원 중단(deprecated)되었으며 파이썬 3.14에서 제거될 예정
    입니다. (Kumar Aditya가 gh-94597를 통해 기능을 구현하였습니다.)

  * "asyncio.set_child_watcher()", "asyncio.get_child_watcher()",
    "asyncio.AbstractEventLoopPolicy.set_child_watcher()", 그리고
    "asyncio.AbstractEventLoopPolicy.get_child_watcher()"는 사용 지원
    중단(deprecated)되었으며 파이썬 3.14에서 제거될 예정입니다. (Kumar
    Aditya가 gh-94597를 통해 기능을 구현하였습니다.)

  * 이제, 기본 이벤트 루프 정책의 "get_event_loop()" 메서드는 이벤트
    루프가 설정되어 있지 않아 새 루프를 생성하는 경우
    "DeprecationWarning" 경고를 발생시킵니다. (Serhiy Storchaka가
    gh-100160를 통해 기능을 구현하였습니다.)

* "email": "email.utils.localtime()"의 *isdst* 매개 변수 사용이 사용
  지원 중단(deprecated)되었습니다. (Alan Williams가 gh-72346를 통해 기
  능을 구현하였습니다.)

* "importlib.abc" 사용 지원 중단(deprecated)된 클래스들:

  * "importlib.abc.ResourceReader"

  * "importlib.abc.Traversable"

  * "importlib.abc.TraversableResources"

  대신 다음과 같은 "importlib.resources.abc" 모듈의 클래스를 사용해주
  시기를 부탁드립니다:

  * "importlib.resources.abc.Traversable"

  * "importlib.resources.abc.TraversableResources"

  (Jason R. Coombs와 Hugo van Kemenade가 gh-93963를 통해 기능을 구현하
  였습니다.)

* "itertools" 모듈은 copy, deepcopy, pickle 연산에 대해 문서화되지 않
  았었습니다. 또한, 과거로부터 계속, 비효율적이며, 버그가 많이 발견되
  며, 일관되지 않은 방식으로만 지원되어왔었습니다. 해당하는 모듈은 파
  이썬 3.14에서 제거될 예정이며, 이를 통해 많은 양의 코드 분량이 삭제
  될 것이며 유지 관리 부담이 크게 줄어들 것입니다. (Raymond Hettinger
  가 gh-101588를 통해 기능을 구현하였습니다.)

* "multiprocessing": 현재 기본값이 *'fork'*인 리눅스, BSD 및 그 밖의
  macOS 이외의 POSIX 플랫폼에서는 더 안전한 기본 시작 방법으로 변경될
  예정입니다 (gh-84559를 참고 부탁드립니다). 대부분의 코드 베이스 및
  구성 요소들은 이와 관련 없을 것으로 예상욉니다. 때문에 실행 시간 경
  고를 추가하는 것은 불필요할 수 있다고 생각되었습니다. 코드에서
  *'fork'*가 *필요*한 경우에만 "get_context()" 혹은
  "set_start_method()" API를 통해 명시적으로 지정해주시기를 부탁드립니
  다. 보다 자세한 내용의 경우 컨텍스트 및 시작 방법를 참고 부탁드립니
  다.

* "pathlib": "is_relative_to()" 및 "relative_to()"에 추가 인자를 전달
  하는 것은 사용 지원 중단(deprecated) 되었습니다.

* "pkgutil": "pkgutil.find_loader()" 및 "pkgutil.get_loader()"는 이제
  "DeprecationWarning"을 발생시킵니다. 대신
  "importlib.util.find_spec()"를 사용해주시기를 부탁드립니다. (Nikita
  Sobolev가 gh-97850을 통해 기능을 구현하였습니다.)

* "pty":

  * *master_open()*대신 "pty.openpty()"를 사용해주시기를 부탁드립니다.

  * *slave_open()*대신 "pty.openpty()"를 사용해주시기를 부탁드립니다.

* "sqlite3":

  * "version" 그리고 "version_info".

  * "execute()" 및 "executemany()"에서 이름있는 자리 표시자(named
    placeholders)를 사용하고 *매개변수* 가 "dict"가 아니라 시퀀스인 경
    우.

* "urllib": "urllib.parse.Quoter" 클래스는 사용 지원 중단(deprecated)
  되었습니다. 해당하는 클래스는 공개 API로 제공할 의도로 작성된 것이
  아니었습니다. (Gregory P. Smith가 gh-88168를 통해 기능을 구현하였습
  니다.)


파이썬 3.15에서 제거 예정인 항목들
----------------------------------

* 임포트 시스템:

  * 모듈에 "__cached__"를 설정하면서 "__spec__.cached"를 설정하지 않는
    동작은 사용 지원 중단(deprecated)되었습니다. 파이썬 3.15부터는
    "__cached__" 어트리뷰트가 임포트 시스템이나 표준 라이브러리에서 더
    이상 설정 혹은 고려되지 않습니다. (gh-97879를 참고 부탁드립니다.)

  * 모듈에 "__package__"를 설정하는 동시에 "__spec__.parent"를 설정하
    지 않는 방식의 사용은 사용 지원 중단(deprecated)되었습니다. 파이썬
    3.15부터는 "__package__" 어트리뷰트가 임포트 시스템이나 표준 라이
    브러리에서 더 이상 설정 혹은 고려되지 않습니다. (gh-97879를 참고
    부탁드립니다.)

* "ctypes":

  * 문서화되지 않았던 "ctypes.SetPointerType()" 함수는 파이썬 3.13부터
    사용 지원 중단(deprecated)되었습니다.

* "http.server":

  * 오랫동안 거의 사용되지 않았던 "CGIHTTPRequestHandler" 클래스는 파
    이썬 3.13부터 사용 지원 중단(deprecated)되었습니다. 직접적인 대체
    수단은 없으나, 그 *어떤* 종류의 요청 처리를 수행하는 웹 서버 인터
    페이스도 CGI를 사용하는 것에 비해서는 보다 바람직하다는 점에 대해
    유의 부탁드리고자 합니다.

  * **python -m http.server** 명령줄 인터페이스의 "--cgi" 플래그는 파
    이썬 3.13부터 사용 지원 중단(deprecated)되었습니다.

* "importlib":

  * *load_module()* 메서드: 대신 *exec_module()*을 사용해주시기를 부탁
    드립니다.

* "locale":

  * "getdefaultlocale()" 함수는 파이썬 3.11부터 사용 지원 중단
    (deprecated)되었습니다. 해당하는 함수는 파이썬 3.13(gh-90817)에서
    제거될 예정이었으나, 파이썬 3.15로 제거의 일정이 연기되었습니다.
    대신 "getlocale()", "setlocale()", 그리고 "getencoding()"를 사용해
    주시기를 부탁드립니다. (Hugo van Kemenade가 gh-111187를 통해 기능
    을 구현하였습니다.)

* "pathlib":

  * "PurePath.is_reserved()"는 파이썬 3.13부터 사용 지원 중단
    (deprecated)되었습니다. 윈도우에서 예약된 경로를 파악하기 위해서는
    "os.path.isreserved()"를 사용해주시기를 부탁드립니다.

* "platform":

  * "java_ver()"는 파이썬 3.13부터 사용 지원 중단(deprecated)되었습니
    다. 해당하는 함수는 Jython의 지원에만 유용할 수 있고, API가 혼란스
    럽고, 대부분의 경우에 대해 테스트되지 않았습니다.

* "sysconfig":

  * "sysconfig.is_python_build()"의 *check_home* 인자는 파이썬 3.12부
    터 폐지되었습니다.

* "threading":

  * "RLock()" will take no arguments in Python 3.15. Passing any
    arguments has been deprecated since Python 3.14, as the Python
    version does not permit any arguments, but the C version allows
    any number of positional or keyword arguments, ignoring every
    argument.

* "types":

  * "types.CodeType": "co_lnotab"에 대한 접근은 **PEP 626**을 통해
    3.10부터 사용 지원 중단(deprecated)되었고 3.12에서 제거될 예정이었
    습니다만, 3.12에서 "DeprecationWarning"이 추가되었습니다. 3.15에서
    제거될 수 있습니다. (Nikita Sobolev가 gh-101866를 통해 기능을 구현
    하였습니다.)

* "typing":

  * "NamedTuple" 클래스를 생성할 때 사용하는 키워드 인자 문법(예를 들
    어, "Point = NamedTuple(\"Point\", x=int, y=int)")은 Python 3.13부
    터 사용 지원 중단(deprecated)되었습니다. 해당하는 문법은 문서화되
    어 있지 않았습니다. 대신 클래스 기반 구문 문법(syntax)이나 함수형
    구문 문법(syntax)을 사용해주시기를 부탁드립니다.

  * "TypedDict"의 함수형 문법을 사용할 때 "TD = TypedDict("TD")"와 같
    이 *fields* 매개변수에 값을 전달하지 않거나, "TD = TypedDict("TD",
    None)"와 같이 *None*을 전달하는 방식은 파이썬 3.13부터 사용 지원이
    중단(deprecated)되었습니다. 필드가 없는 (zero-field의) TypedDict를
    만들려면 "class TD(TypedDict): pass"나 "TD = TypedDict("TD", {})"
    를 사용해주시기를 부탁드립니다.

  * "typing.no_type_check_decorator()" 데코레이터 함수는 파이썬 3.13부
    터 사용 지원이 중단(deprecated)되었습니다. "typing" 모듈에 추가된
    지 8년이 지났었으나, 아직까지 어떤 주요 정적 타입 검사기(type
    checker)도 해당하는 함수를 지원하지 않았었습니다.

* "wave":

  * "Wave_read"와 "Wave_write" 클래스들의 "getmark()", "setmark()", 그
    리고 "getmarkers()" 메서드들은 파이썬 3.13부터 사용 지원 중단
    (deprecated) 되었습니다.

* "zipimport":

  * "load_module()" 메서드는 파이썬 3.10부터 사용 지원 중단
    (deprecated)되었습니다. 대신 "exec_module()"를 사용해주시기를 부탁
    드립니다. (Jiahao Li가 gh-125746를 통해 기능을 구현하였습니다.)


파이썬 3.16에서 제거 예정인 항목들
----------------------------------

* 임포트 시스템:

  * 모듈에 "__loader__"를 설정하면서 "__spec__.loader"를 설정하지 않는
    방식의 사용에 대한 사용 지원이 중단(deprecated)되었습니다. 파이썬
    3.16부터는 임포트 시스템과 표준 라이브러리가 "__loader__"를 설정
    혹은 참조하지 않습니다.

* "array":

  * "'u'" 포맷 코드("wchar_t")는 문서에서는 파이썬 3.3부터, 런타임에서
    는 파이썬 3.13부터 사용 지원이 중단(deprecated)되었습니다. 유니코
    드 문자에는 대신 "'w'" 포맷 코드("Py_UCS4")를 사용해주시기를 부탁
    드립니다.

* "asyncio":

  * "asyncio.iscoroutinefunction()" 함수는 사용 지원이 중단
    (deprecated)되었으며 파이썬 3.16에서 제거될 예정입니다. 대신
    "inspect.iscoroutinefunction()"을 사용해주시기를 부탁드립니다.
    (Jiahao Li와 Kumar Aditya가 gh-122875를 통해 기능을 구현하였습니다
    .)

  * "asyncio" 정책 시스템은 사용 지원이 중단(deprecated)되었으며 파이
    썬 3.16에서 제거될 예정입니다. 다음 클래스와 함수의 사용 지원이 중
    단(deprecated)되었음에 유의해주십사 부탁드립니다:

    * "asyncio.AbstractEventLoopPolicy"

    * "asyncio.DefaultEventLoopPolicy"

    * "asyncio.WindowsSelectorEventLoopPolicy"

    * "asyncio.WindowsProactorEventLoopPolicy"

    * "asyncio.get_event_loop_policy()"

    * "asyncio.set_event_loop_policy()"

    사용자는 원하는 이벤트 루프 구현을 사용하기 위해 "asyncio.run()"
    또는 "asyncio.Runner"와 *loop_factory*를 함께 사용해야 합니다.

    예를 들어, 윈도우에서 "asyncio.SelectorEventLoop"을 사용하기 위해:

       import asyncio

       async def main():
           ...

       asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)

    (Kumar Aditya가 gh-127949를 통해 기여하였습니다.)

* "builtins":

  * 논리(boolean) 타입에서의 비트별 반전 연산인 *~True* 또는 *~False*
    는 직관적이지 않은 결과인(*-2*, *-1*)를 출력하기 때문에 파이썬
    3.12부터 사용 지원이 중단(deprecated)되었습니다. 논리(boolean) 값
    의 논리적 부정을 위해서는 대신 *not x*를 사용해주시기를 부탁드립니
    다. 정수 값의 비트별 반전이 실제로 필요한 몇 안되는 경우에 대한 필
    요에 있어서는, 명시적으로 *int*로 변환한 뒤 *~int(x)*를 사용해주시
    기를 부탁드립니다.

* "functools":

  * 파이썬 구현인 "functools.reduce()" 함수에서 *function* 또는
    *sequence*를 키워드 인자로 사용하는 것은 파이썬 3.14부터 사용 지원
    중단(deprecated)되었습니다.

* "logging":

  사용자 정의 로깅 처리기(custom logging handlers)의 *strm* 인자를 받
  는 방식의 사용은 사용 지원 중단(deprecated)되었으며 파이썬 3.16에서
  제거될 예정입니다. 대신 *stream* 인자를 사용하여 처리기를 정의하는
  방식으로 사용해주시기를 부탁드립니다. (Mariusz Felisiak가 gh-115032
  를 통해 기능을 구현하였습니다.)

* "mimetypes":

  * "mimetypes.MimeTypes.add_type()"에서 유효한 확장자는 *.*으로 시작
    하거나 빈 문자열이어야 합니다. 점으로 시작하지 않는 확장자는 사용
    지원 중단(deprecated)되었으며, 파이썬 3.16에서는 "ValueError"를 발
    생시킵니다. (Hugo van Kemenade가 gh-75223를 통해 기능을 구현하였습
    니다.)

* "shutil":

  * "ExecError" 예외가 파이썬 3.14부터 사용 지원 중단(deprecated)되었
    습니다. 파이썬 3.4 이후로는 "shutil" 모듈의 어떤 함수에서도 사용되
    지 않았으며, 이제는 "RuntimeError"의 다른 이름(alias)으로 간주됩니
    다.

* "symtable":

  * "Class.get_methods" 메서드는 파이썬 3.14부터 사용 지원 중단
    (deprecated)되었습니다.

* "sys":

  * "_enablelegacywindowsfsencoding()" 함수는 파이썬 3.13부터 사용 지
    원 중단(deprecated)되었습니다. 대신
    "PYTHONLEGACYWINDOWSFSENCODING" 환경 변수를 사용해주시기를 부탁드
    립니다.

* "sysconfig":

  * "sysconfig.expand_makefile_vars()" 함수는 파이썬 3.14부터 사용 지
    원 중단(deprecated)되었습니다. 대신 "sysconfig.get_paths()" 의
    *vars* 인자를 사용해주시기를 부탁드립니다.

* "tarfile":

  * 문서화되지도 사용되지도 않고 있는 "TarFile.tarfile" 어트리뷰트는
    파이썬 3.13부터 사용 지원 중단(deprecated)되었습니다.


파이썬 3.17에서 제거 예정인 항목들
----------------------------------

* "collections.abc":

  * "collections.abc.ByteString"은 파이썬 3.17에서 제거될 예정입니다.

    실행 시간에 특정 "obj"가 버퍼 프로토콜을 활용하는지 확인하려면
    "isinstance(obj, collections.abc.Buffer)"를 사용해주시기를 부탁드
    립니다. 타입 어노테이션(type annotation)에서 사용하시기를 원하는
    경우 "Buffer"를 사용하거나, 코드에서 지원하는 타입을 명시적으로 지
    정한 유니언(예를 들어, *bytes | bytearray | memoryview*)을 사용해
    주시기를 부탁드립니다.

    "ByteString"은 원래 "bytes"와 "bytearray" 두 경우 모두에 있어 상위
    타입으로 동작하는 추상 클래스로 설계되었습니다. 그러나 ABC에는 관
    련된 메서드가 전혀 없었기 때문에, 어떤 객체가 "ByteString" 인스턴
    스라는 사실을 알아도 그 객체에 대해 실제로 유용한 정보를 얻을 수
    없었습니다. "memoryview"와 같은 다른 보다 일반적인 버퍼 타입들도,
    런타임에서 혹은 정적 타입 검사기(type checker)에서 "ByteString"의
    하위 타입으로 취급된 적이 없습니다.

    보다 자세한 내용은 **PEP 688**을 참고해주시기를 부탁드립니다.
    (Shantanu Jain이 gh-91896를 통해 기능을 구현하였습니다.)

* "typing":

  * 파이썬 3.14 이전에는 이전 스타일의 유니언(old-style union)이 비공
    개(private) 클래스 *typing._UnionGenericAlias*를 사용해 구현되었습
    니다. 해당하는 클래스는 더 이상 관련된 구체적인 구현에 필요하지는
    않지만 하위 호환성을 위해 유지되고 있습니다. 파이썬 3.17에서 제거
    될 예정입니다. 관련된 사용을 하실 경우, 문서화가 지원되는 관련 분
    석 도구들인 "typing.get_origin()"과 "typing.get_args()" 등을 보다
    적극적으로 활용해주시기를 부탁드립니다.

  * "typing.ByteString"는 파이썬 3.9부터 사용 지원 중단(deprecated)되
    었으며 파이썬 3.17에서 제거될 예정입니다.

    실행 시간에 특정 "obj"가 버퍼 프로토콜을 활용하는지 확인하려면
    "isinstance(obj, collections.abc.Buffer)"를 사용해주시기를 부탁드
    립니다. 타입 어노테이션(type annotation)에서 사용하시기를 원하는
    경우 "Buffer"를 사용하거나, 코드에서 지원하는 타입을 명시적으로 지
    정한 유니언(예를 들어, *bytes | bytearray | memoryview*)을 사용해
    주시기를 부탁드립니다.

    "ByteString"은 원래 "bytes"와 "bytearray" 두 경우 모두에 있어 상위
    타입으로 동작하는 추상 클래스로 설계되었습니다. 그러나 ABC에는 관
    련된 메서드가 전혀 없었기 때문에, 어떤 객체가 "ByteString" 인스턴
    스라는 사실을 알아도 그 객체에 대해 실제로 유용한 정보를 얻을 수
    없었습니다. "memoryview"와 같은 다른 보다 일반적인 버퍼 타입들도,
    런타임에서 혹은 정적 타입 검사기(type checker)에서 "ByteString"의
    하위 타입으로 취급된 적이 없습니다.

    보다 자세한 내용은 **PEP 688**을 참고해주시기를 부탁드립니다.
    (Shantanu Jain이 gh-91896를 통해 기능을 구현하였습니다.)


파이썬 3.18에서 제거 예정인 항목들
----------------------------------

* "decimal":

  * The non-standard and undocumented "Decimal" format specifier
    "'N'", which is only supported in the "decimal" module's C
    implementation, has been deprecated since Python 3.13.
    (Contributed by Serhiy Storchaka in gh-89902.)


Pending removal in Python 3.19
------------------------------

* "ctypes":

  * Implicitly switching to the MSVC-compatible struct layout by
    setting "_pack_" but not "_layout_" on non-Windows platforms.


향후 보다 상위 버전의 제거 예정 항목들
--------------------------------------

다음의 API들은 향후 버전에서 제거될 예정이지만, 구체적인 제거 시점이
아직 정해지지는 않았습니다.

* "argparse":

  * 인자 그룹과 상호 배타적 인자 그룹을 중첩해서 사용하는 기능은 사용
    지원 중단(deprecated)되었습니다.

  * 문서화되지 않은 키워드 인자 *prefix_chars*를
    "add_argument_group()"에 전달하는 방식의 사용이 사용 지원 중단
    (deprecated)되었습니다.

  * "argparse.FileType" 타입 변환기(type converter)가 사용 지원 중단
    (deprecated)되었습니다.

* "builtins":

  * 제너레이터에서 *throw(type, exc, tb)* 및 *athrow(type, exc, tb)*
    시그니처는 사용 지원 중단(deprecated)되었습니다. 대신 단일 인자 시
    그니처인 *throw(exc)*와 *athrow(exc)*를 사용해주시기를 부탁드립니
    다.

  * 현재 파이썬은 숫자 리터럴 바로 뒤에 키워드가 오는 방식의 표현을 허
    용합니다. 예를 들어, "0in x", "1or x", "0if 1else 2"와 같은 표현이
    허용됩니다. 이로 인해, *[0x1for x in y]*처럼 혼란스럽거나 모호한
    종류의 표현도 허용됩니다. 해당하는 예시의 표현은 "[0x1 for x in
    y]" 또는 "[0x1f or x in y]"로 해석될 수 있습니다. 숫자 리터럴 바로
    뒤에 "and", "else", "for", "if", "in", "is", "or" 중 하나의 키워드
    가 오는 경우 구문 경고가 발생합니다. 향후 릴리스에서는 이것이 문법
    에러로 간주될 예정입니다. (보다 자세한 내용의 경우 gh-87999를 참고
    부탁드립니다.)

  * "__index__()" 및 "__int__()" 메서드가 정수가 아닌 타입을 반환하는
    방식의 사용은 사용 지원 중단(deprecated)되었습니다. 대신 해당하는
    메서드는 "int"의 실제 하위 클래스(strict subclass) 인스턴스를 반환
    하는 방식으로 사용해주시기를 부탁드립니다.

  * "__float__()" 메서드가 "float"의 실제 하위 클래스(strict subclass)
    를 반환하는 방식의 사용은 사용 지원 중단(deprecated)되었습니다. 이
    제 해당하는 메서드는 "float" 인스턴스를 반환하는 방식으로 사용해주
    시기를 부탁드립니다.

  * *__complex__()* 메서드가 "complex"의 실제 하위 클래스(strict
    subclass)를 반환하는 방식의 사용은 사용 지원 중단(deprecated)되었
    습니다. 이제 해당하는 메서드는 "complex" 인스턴스를 반환하는 방식
    으로 사용해주시기를 부탁드립니다.

  * 복소수를 "complex()" 생성자의 *real* 또는 *imag* 인자로 전달하는
    것은 이제 사용 지원이 중단(deprecated)되었으며, 복소수는 하나의 위
    치 인자로만 전달해주시기를 부탁드립니다. (Serhiy Storchaka가
    gh-109218를 통해 기능을 구현하였습니다.)

* "calendar": *calendar.January*와 *calendar.February* 상수는 사용 지
  원이 중단(deprecated)되었으며, 대신 "calendar.JANUARY" 와
  "calendar.FEBRUARY" 를 사용해주시기를 부탁드립니다. (Prince Roshan이
  gh-103636를 통해 기능을 구현하였습니다.)

* "codecs": "codecs.open()" 대신 "open()"을 사용하십시오. (보다 자세한
  내용의 경우 gh-133038를 참고 부탁드립니다.)

* "codeobject.co_lnotab" 대신 "codeobject.co_lines()" 메서드를 사용해
  주시기를 부탁드립니다.

* "datetime":

  * "utcnow()": 대신 "datetime.datetime.now(tz=datetime.UTC)" 메서드를
    사용해주시기를 부탁드립니다.

  * "utcfromtimestamp()": use
    "datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)".

* "gettext": 복수형 값(plural value)은 정수여야 합니다.

* "importlib":

  * "cache_from_source()" 의 *debug_override* 매개 변수는 사용 지원 중
    단(deprecated)되었습니다. 대신 *optimization* 매개 변수를 사용해주
    시기를 부탁드립니다.

* "importlib.metadata":

  * "EntryPoints" 튜플 인터페이스.

  * 반환 값의 암시적 "None".

* "logging": "warn()" 메서드는 파이썬 3.3부터 사용 지원 중단
  (deprecated) 되었습니다. 대신 "warning()"을 사용해주시기를 부탁드립
  니다.

* "mailbox": StringIO 입력과 텍스트 모드 사용은 사용 지원 중단
  (deprecated) 되었습니다. 대신 *BytesIO* 와 바이너리 모드를 사용해주
  시기를 부탁드립니다.

* "os": 다중 스레드 프로세스에서 "os.register_at_fork()"를 호출하는 것
  은 사용 지원 중단(deprecated) 되었습니다.

* "pydoc.ErrorDuringImport": *exc_info* 매개 변수에 튜플 값을 사용하는
  것은 사용 지원 중단(deprecated) 되었습니다. 대신 예외 인스턴스를 사
  용해주시기를 부탁드립니다.

* "re": 정규식의 숫자 그룹 참조와 그룹 이름에 보다 더 엄격한 규칙이 적
  용됩니다. 숫자 참조에는 ASCII 숫자 시퀀스만 허용됩니다. 바이트 패턴
  과 치환 문자열에서 사용되는 그룹 이름에는 이제 ASCII 영문자, 숫자,
  밑줄(*_*)만 포함될 수 있습니다. (Serhiy Storchaka가 gh-91760를 통해
  기능을 구현하였습니다.)

* "sre_compile", "sre_constants" and "sre_parse" modules.

* "shutil": "rmtree()"의 *onerror* 매개변수는 파이썬 3.12에서 사용 지
  원이 중단(deprecated)되었습니다. 대신 *onexc* 매개변수를 사용해주시
  기를 부탁드립니다.

* "ssl" 옵션 및 프로토콜:

  * "ssl.SSLContext" 생성 시 프로토콜 인자를 지정하지 않는 방식은 사용
    지원이 중단(deprecated)되었습니다.

  * "ssl.SSLContext": "set_npn_protocols()" 그리고
    "selected_npn_protocol()"은 사용 지원이 중단(deprecated)되었습니다
    . 대신 ALPN을 사용해주시기를 부탁드립니다.

  * "ssl.OP_NO_SSL*" options

  * "ssl.OP_NO_TLS*" options

  * "ssl.PROTOCOL_SSLv3"

  * "ssl.PROTOCOL_TLS"

  * "ssl.PROTOCOL_TLSv1"

  * "ssl.PROTOCOL_TLSv1_1"

  * "ssl.PROTOCOL_TLSv1_2"

  * "ssl.TLSVersion.SSLv3"

  * "ssl.TLSVersion.TLSv1"

  * "ssl.TLSVersion.TLSv1_1"

* "threading" 메서드:

  * "threading.Condition.notifyAll()": 대신
    "threading.current_thread()"를 사용해주시기를 부탁드립니다.

  * "threading.Event.isSet()": 대신 "is_set()"를 사용해주시기를 부탁드
    립니다.

  * "threading.Thread.isDaemon()"와 "threading.Thread.setDaemon()": 대
    신 "threading.Thread.daemon" 어트리뷰트를 사용해주시기를 부탁드립
    니다.

  * "threading.Thread.getName()"와 "threading.Thread.setName()": 대신
    "threading.Thread.name" 어트리뷰트를 사용해주시기를 부탁드립니다.

  * "threading.currentThread()": 대신 "threading.current_thread()"를
    사용해주시기를 부탁드립니다.

  * "threading.activeCount()": 대신 "threading.active_count()"를 사용
    해주시기를 부탁드립니다.

* "typing.Text" (gh-92332).

* 내부 클래스 *typing._UnionGenericAlias*는 "typing.Union" 구현에 있어
  더 이상 사용되지 않습니다. 해당하는 비공개(private) 클래스를 사용하
  는 코드들과의 호환성을 유지하기 위해, 호환성을 위한 도구(shim)이 최
  소한 파이썬 3.17까지는 제공될 예정입니다. (Jelle Zijlstra가
  gh-105499를 통해 기능을 구현하였습니다.)

* "unittest.IsolatedAsyncioTestCase": 테스트 케이스에서 "None"이 아닌
  값을 반환하는 방식의 사용은 사용 지원 중단(deprecated)되었습니다.

* "urllib.parse"의 사용 지원 중단된 함수들: 대신 "urlparse()"를 사용해
  주시기를 부탁드립니다.

  * "splitattr()"

  * "splithost()"

  * "splitnport()"

  * "splitpasswd()"

  * "splitport()"

  * "splitquery()"

  * "splittag()"

  * "splittype()"

  * "splituser()"

  * "splitvalue()"

  * "to_bytes()"

* "wsgiref": *SimpleHandler.stdout.write()*는 부분 쓰기(partial write)
  를 수행하지 않아야 함을 유의해주십사 부탁드립니다.

* "xml.etree.ElementTree": "Element"의 진리값(truth value)을 검사하는
  것은 더 이상 권장되지 않으며(Deprecated) 폐지 예정입니다. 향후 파이
  썬 버전에서는 모든 경우에 있어 "True"를 반환할 것입니다. 명시적인
  "len(elem)" 또는 "elem is not None" 방식의 테스트를 대신 사용해주시
  기를 부탁드립니다.

* "sys._clear_type_cache()" 함수는 사용 지원 중단(deprecated)되었습니
  다. 대신 "sys._clear_internal_caches()"를 사용해주시기를 부탁드립니
  다.


CPython 바이트 코드 변경 사항
=============================

* "YIELD_VALUE`의 oparg는 yield가 yield from이나 await의 일부인 경우에
  는 ``1`"이 되고, 그렇지 않으면 "0"이 됩니다. "RESUME"의 oparg에는 예
  외 깊이(except-depth)가 1인지 여부를 나타내는 비트가 추가되도록 변경
  되었으며, 이는 제너레이터를 닫는 처리를 최적화하기 위해 필요합니다.
  (Irit Katriel이 gh-111354를 통해 기능을 구현하였습니다.)


C API의 변경 사항들
===================


새로운 기능들
-------------

* **PEP 669** 모니터링 이벤트 생성을 위한 PyMonitoring C API가 추가되
  었습니다:

  * "PyMonitoringState"

  * "PyMonitoring_FirePyStartEvent()"

  * "PyMonitoring_FirePyResumeEvent()"

  * "PyMonitoring_FirePyReturnEvent()"

  * "PyMonitoring_FirePyYieldEvent()"

  * "PyMonitoring_FireCallEvent()"

  * "PyMonitoring_FireLineEvent()"

  * "PyMonitoring_FireJumpEvent()"

  * "PyMonitoring_FireBranchEvent"

  * "PyMonitoring_FireCReturnEvent()"

  * "PyMonitoring_FirePyThrowEvent()"

  * "PyMonitoring_FireRaiseEvent()"

  * "PyMonitoring_FireCRaiseEvent()"

  * "PyMonitoring_FireReraiseEvent()"

  * "PyMonitoring_FireExceptionHandledEvent()"

  * "PyMonitoring_FirePyUnwindEvent()"

  * "PyMonitoring_FireStopIterationEvent()"

  * "PyMonitoring_EnterScope()"

  * "PyMonitoring_ExitScope()"

  (Irit Katriel이 gh-111997를 통해 기능을 구현하였습니다.)

* 1바이트만 차지하는 경량 뮤텍스인 "PyMutex"와 새로운 "PyMutex_Lock()"
  및 "PyMutex_Unlock()" 함수를 추가했습니다. 연산을 수행하기 위해 블록
  이 필요하면, 현재 GIL을 보유 중인 경우 "PyMutex_Lock()"는 *전역 인터
  프리터 잠금(GIL)*을 해제합니다. (Sam Gross이 gh-108724를 통해 기능을
  구현하였습니다.)

* 시스템 시계에 액세스할 수 있도록 PyTime C API를 추가했습니다.

  * "PyTime_t".

  * "PyTime_MIN" 그리고 "PyTime_MAX".

  * "PyTime_AsSecondsDouble()".

  * "PyTime_Monotonic()".

  * "PyTime_MonotonicRaw()".

  * "PyTime_PerfCounter()".

  * "PyTime_PerfCounterRaw()".

  * "PyTime_Time()".

  * "PyTime_TimeRaw()".

  (Victor Stinner과 Petr Viktorin이 gh-110850를 통해 기능을 구현하였습
  니다.)

* "PyDict_Contains()"와 동일하게 동작하지만, *key*를 PyObject* 대신
  const char* 형식의 UTF-8 인코딩된 바이트 문자열로 지정하는
  "PyDict_ContainsString()" 함수를 추가했습니다. (Victor Stinner가
  gh-108314를 통해 기능을 구현하였습니다.)

* "PyDict_GetItemWithError()"와 유사하게 동작하지만 *빌린 참조
  (borrowed reference)* 대신 *강한 참조(strong reference)*를 반환하는
  "PyDict_GetItemRef()" 및 "PyDict_GetItemStringRef()" 함수를 추가했습
  니다. 해당하는 함수는 오류가 발생하면 *-1*을 반환하므로
  "PyErr_Occurred()"를 별도로 확인할 필요가 없습니다. (Victor Stinner
  가 gh-106004를 통해 기능을 구현하였습니다.)

* "PyDict_SetDefault()"와 유사하게 동작하지만 *빌린 참조(borrowed
  reference)* 대신 *강한 참조(strong reference)*를 반환하는
  "PyDict_SetDefaultRef()" 함수를 추가했습니다. 이 함수는 오류가 발생
  하면 *-1*을, 새 항목을 삽입한 경우 *0*을, 키가 딕셔너리에 이미 존재
  하는 경우 *1*을 반환합니다. (Sam Gross가 gh-112066를 통해 기능을 구
  현하였습니다.)

* 딕셔너리에서 키를 제거하고 필요에 따라 제거된 값을 반환하는
  "PyDict_Pop()" 및 "PyDict_PopString()" 함수를 추가했습니다. 이는
  "dict.pop()" 메서드와 비슷하지만, 기본값 인자가 없으며 존재하지 않는
  키에 대해서도 "KeyError"를 발생시키지 않습니다. (Stefan Behnel과
  Victor Stinner가 gh-111262를 통해 기능을 구현하였습니다.)

* "PyObject_GetItem()" 및 "PyMapping_GetItemString()"의 대안으로, 각각
  "PyMapping_GetOptionalItem()" 및 "PyMapping_GetOptionalItemString()"
  함수를 추가하였습니다. 해당하는 새로운 함수들은 요청된 키가 기존 매
  핑에 없더라도 "KeyError"를 발생시키지 않습니다. 해당하는 변형은 누락
  된 키를 오류 사례(failure)로 취급하지 않아야 하는 경우에 보다 더 편
  리하고 빠른 작동에 도움이 됩니다. (Serhiy Storchaka가 gh-106307를 통
  해 기능을 구현하였습니다.)

* "PyObject_GetOptionalAttr()" 및 "PyObject_GetOptionalAttrString()"의
  대안으로, 각각 "PyObject_GetAttr()" 및 "PyObject_GetAttrString()" 함
  수를 추가하였습니다. 새로운 함수는 요청된 어트리뷰트를 객체에서 찾을
  수 없더라도 "AttributeError"를 발생시키지 않습니다. 해당하는 변형은
  누락된 어트리뷰트를 오류 사례(failure)로 취급하지 않아야 하는 경우에
  보다 더 편리하고 빠른 작동에 도움이 됩니다. (Serhiy Storchaka가
  gh-106521를 통해 기능을 구현하였습니다.)

* 경고 메시지를 사용자 지정할 수 있도록 "PyErr_WriteUnraisable()" 함수
  의 확장으로 "PyErr_FormatUnraisable()" 함수를 추가했습니다. (Serhiy
  Storchaka가 gh-108082를 통해 기능을 구현하였습니다.)

* 프레임의 locals, globals, 빌트인에 대해 *빌린 참조(borrowed
  reference)* 대신 *강한 참조(strong reference)*를 반환하는 새로운 함
  수들을 추가했습니다. 해당하는 업데이트들은 PEP 667의 일환입니다:

  * "PyEval_GetBuiltins()" 대신 "PyEval_GetFrameBuiltins()"를 사용해주
    시기를 부탁드립니다.

  * "PyEval_GetGlobals()" 대신 "PyEval_GetFrameGlobals()"를 사용해주시
    기를 부탁드립니다.

  * "PyEval_GetLocals()" 대신 "PyEval_GetFrameLocals()"를 사용해주시기
    를 부탁드립니다.

  (Mark Shannon과 Tian Gao가 gh-74929를 통해 기능을 구현하였습니다.)

* 상수에 대한 *강한 참조(strong reference)* 또는 *빌린 참조(borrowed
  reference)*를 얻을 수 있도록 "Py_GetConstant()" 및
  "Py_GetConstantBorrowed()" 함수를 추가했습니다. 예를 들어,
  *Py_GetConstant(Py_CONSTANT_ZERO)*는 상수 0에 대한 강한 참조(strong
  reference)를 반환합니다. (Victor  Stinner가 gh-115754를 통해 기능을
  구현하였습니다.)

* "PyImport_AddModule()" 함수의 대체로 "PyImport_AddModuleRef()" 함수
  를 추가했습니다. 이 함수는 *빌린 참조(borrowed reference)* 대신 *강
  한 참조(strong reference)*를 반환합니다. (Victor Stinner가 gh-105922
  를 통해 기능을 구현하였습니다.)

* 메인 파이썬 인터프리터가 *종료 중(interpreter shutdown)* 상태에 해당
  하는지 확인할 수 있도록 "Py_IsFinalizing()" 함수를 추가했습니다.
  (Victor Stinner가 gh-108014를 통해 기능을 구현하였습니다.)

* *빌린 참조(borrowed reference)* 대신 *강한 참조(strong reference)*를
  반환하는 "PyList_GetItem()"의 대체 함수로 "PyList_GetItemRef()" 함수
  를 추가합니다. (Sam Gross가 gh-114329를 통해 기능을 구현하였습니다.)

* "PyList_Extend()" 및 "PyList_Clear()" 함수를 추가하였습니다. 해당하
  는 함수들은 기존 파이썬의 "list.extend()" 및 "list.clear()" 메서드를
  그대로 반영한 것입니다. (Victor Stinner가 gh-111138를 통해 기능을 구
  현하였습니다.)

* 새로운 "PyLong_AsInt()" 함수를 추가했습니다. 해당하는 함수는
  "PyLong_AsLong()"과 유사하게 동작하지만, 결과를 C의 long 대신 C의
  int에 저장합니다. (Victor Stinner가 gh-108014를 통해 기능을 구현하였
  습니다.)

* 네이티브 정수형과 파이썬 "int" 객체 사이의 변환을 단순화하기 위해
  "PyLong_AsNativeBytes()", "PyLong_FromNativeBytes()",
  "PyLong_FromUnsignedNativeBytes()" 함수를 추가했습니다. (Steve Dower
  가 gh-111140를 통해 기능을 구현하였습니다.)

* "PyModule_AddObjectRef()" 그리고 "PyModule_AddObject()"와 유사하지만
  항상 값에 대한 참조를 가져가는(steal) "PyModule_Add()" 함수를 추가했
  습니다. (Serhiy Storchaka가 gh-86493를 통해 기능을 구현하였습니다.)

* 파이썬 객체의 기본 해싱 함수를 구현하는 "PyObject_GenericHash()" 함
  수를 추가했습니다. (Serhiy Storchaka가 gh-113024를 통해 기능을 구현
  하였습니다.)

* 가공되지 않은(raw) 포인터를 해싱하기 위한 "Py_HashPointer()" 함수를
  추가했습니다. (Victor Stinner가 gh-111545를 통해 기능을 구현하였습니
  다.)

* "PyObject_VisitManagedDict()" 그리고 "PyObject_ClearManagedDict()"
  함수를 추가하였습니다. 해당하는 함수들은 "Py_TPFLAGS_MANAGED_DICT"
  플래그를 사용하는 타입의 *traverse* 및 *clear* 함수를 통해 호출되어
  야 합니다. pythoncapi-compat 프로젝트를 통해 해당하는 함수들을
  Python 3.11 및 3.12에서 사용할 수 있습니다. (Victor Stinner가
  gh-107073를 통해 기능을 구현하였습니다.)

* "tracemalloc" 모듈과 같은 방식으로 객체의 생성(creation)과 파기
  (destruction)를 추적할 수 있도록 "PyRefTracer_SetTracer()" 그리고
  "PyRefTracer_GetTracer()" 함수를 추가했습니다. (Pablo Galindo가
  gh-93502를 통해 기능을 구현하였습니다.)

* 이벤트 인자를 파이썬 "tuple" 객체로 받는 "PySys_Audit()"의 대안으로
  "PySys_AuditTuple()" 함수를 추가했습니다. (Victor Stinner가 gh-85283
  를 통해 기능을 구현하였습니다.)

* "NULL"인 경우에 치명적인(fatal) 에러로 프로세스를 종료하지 않는
  "PyThreadState_Get()" 의 대안으로 "PyThreadState_GetUnchecked()" 함
  수를 추가했습니다. 결과가 "NULL" 인지 여부를 확인하는 역할을 호출자
  가 수행합니다.

* 타입의 완전히 정규화된 이름을 얻기 위한
  "PyType_GetFullyQualifiedName()" 함수를 추가했습니다.
  "type.__module__"가 문자열이고 그 값이 *'builtins'* 또는
  *'__main__'*이 아닌 경우, 모듈 이름이 앞에 붙습니다. (Victor Stinner
  가 gh-111696를 통해 기능을 구현하였습니다.)

* 특정 타입의 모듈 이름을 가져오는 "PyType_GetModuleName()" 함수를 추
  가했습니다. 해당하는 함수의 이런 동작은 "type.__module__" 어트리뷰트
  를 가져오는 것과 동일합니다. (Eric Snow와 Victor Stinner가 gh-111696
  를 통해 기능을 구현하였습니다.)

* 유니코드 객체를 const char* 형식의 UTF-8 인코딩된 문자열과 비교하기
  위한 "PyUnicode_EqualToUTF8AndSize()"와 "PyUnicode_EqualToUTF8()" 함
  수를 추가했습니다. 두 값이 같으면 *1*을 반환하며, 두 값이 같지 않으
  면 *0*을 반환합니다. 해당하는 함수들은 예외를 발생시키지 않습니다.
  (Serhiy Storchaka가 gh-110289를 통해 기능을 구현하였습니다.)

* "PyWeakref_GetObject()"의 대안으로 "PyWeakref_GetRef()" 함수를 추가
  했습니다. 해당하는 함수는 참조 대상이 아직 살아 있는 경우 *강한 참조
  (strong reference)*를, 더 이상 살아 있지 않은 경우 *NULL*을 반환합니
  다. (Victor Stinner가 gh-105927를 통해 기능을 구현하였습니다.)

* 에러를 조용한 방식으로 간과/무시하던 함수들의 동작을 바로잡은 새로운
  함수들을 추가했습니다:

  * "PyObject_HasAttr()" 대신 "PyObject_HasAttrWithError()"를 사용해주
    시기를 부탁드립니다.

  * "PyObject_HasAttrString()"의 사용 대신
    "PyObject_HasAttrStringWithError()"의 사용을 부탁드립니다.

  * "PyMapping_HasKey()" 대신 "PyMapping_HasKeyWithError()"를 사용해주
    시기를 부탁드립니다.

  * "PyMapping_HasKeyString()"의 사용 대신
    "PyMapping_HasKeyStringWithError()"의 사용을 부탁드립니다.

  새로운 함수들은 에러의 경우 *-1*을, 참의 경우 기존과 같이 *1*을, 거
  짓의 경우 *0*을 반환합니다.

  (Serhiy Storchaka가 gh-108511를 통해 기능을 구현하였습니다.)


C API의 변경 사항들
-------------------

* "PyArg_ParseTupleAndKeywords()"와 "PyArg_VaParseTupleAndKeywords()"
  의 *keywords* 매개 변수는 이제 C 언어에서는 char *const*, C++ 언어에
  서는 const char *const* 형식을 가지며, 이전의 char** 형식으로부터 업
  데이트되었습니다. C++ 언어에서는 이를 통해 해당하는 함수들이 const
  char *const*, const char**, char *const* 형식의 인자와 명시적인 타입
  변환(explicit type cast) 없이도 호환되도록 합니다. C 언어에서는 해당
  하는 함수들이 char *const* 형식의 인자만 지원합니다. 해당하는 방식의
  작동은 "PY_CXX_CONST" 매크로를 사용하여 재정의할 수 있습니다.
  (Serhiy Storchaka가 gh-65210를 통해 기능을 구현하였습니다.)

* "PyArg_ParseTupleAndKeywords()"가 이제 ASCII 가 아닌 키워드 매개 변
  수 이름도 지원합니다. (Serhiy Storchaka가 gh-110815를 통해 기능을 구
  현하였습니다.)

* "PyCode_GetFirstFree()" 함수는 이제 불안정한 API로 분류되며, 이름도
  "PyUnstable_Code_GetFirstFree()"로 변경되었습니다. (Bogdan Romanyuk
  가 gh-115781를 통해 기능을 구현하였습니다.)

* "PyDict_GetItem()", "PyDict_GetItemString()", "PyMapping_HasKey()",
  "PyMapping_HasKeyString()", "PyObject_HasAttr()",
  "PyObject_HasAttrString()", 그리고 "PySys_GetObject()" 함수는 호출
  시 발생한 모든 에러를 이전에는 그냥 지워 버렸지만, 이제
  "sys.unraisablehook()"을 사용하는 방식을 통해 해당하는 에러들을 보고
  합니다. 관련된 설명서를 기반으로 다른 함수로 변경하는 것이 보다 권장
  되는 방법입니다. (Serhiy Storchaka가 gh-106672를 통해 기능을 구현하
  였습니다.)

* "PyUnicode_FromFormat()"에 "%T", "%#T", "%N", 그리고 "%#N" 형식에 대
  한 지원이 추가되었습니다.

  * "%T": 객체 타입의 완전히 정규화된 이름을 가져옵니다.

  * "%#T": 위의 "%T"와 같은 방식으로, 그러나 콜론을 구분 기호로 사용합
    니다.

  * "%N": 타입의 완전히 정규화된 이름을 가져옵니다.

  * "%#N": 위의 "%N"과 같은 방식으로, 그러나 콜론을 구분 기호로 사용합
    니다.

  보다 자세한 내용의 경우 **PEP 737**를 참고 부탁드립니다. (Victor
  Stinner가 gh-111696를 통해 기능을 구현하였습니다.)

* 이제 "#" 포맷 코드를 사용할 때에 "Python.h"를 포함하기 전에
  "PY_SSIZE_T_CLEAN" 매크로를 정의할 필요가 없습니다. 해당하는 포맷 코
  드를 받는 API들은 "#" 포맷에 대해 항상 "Py_ssize_t"를 사용합니다.
  (Inada Naoki가 gh-104922를 통해 기능을 구현하였습니다.)

* 파이썬이 디버그 모드로 빌드되었거나 "with assertions" 옵션으로 빌드
  된 경우, "PyTuple_SET_ITEM()"과 "PyList_SET_ITEM()" 함수는 인덱스 인
  자가 올바른지 검사문을 통한 확인(assert)을 통해 검사합니다.


제한된 C API 변경 사항들
------------------------

* 다음과 같은 함수들은 이제 제한된 C API에 포함됩니다.

  * "PyMem_RawMalloc()"

  * "PyMem_RawCalloc()"

  * "PyMem_RawRealloc()"

  * "PyMem_RawFree()"

  * "PySys_Audit()"

  * "PySys_AuditTuple()"

  * "PyType_GetModuleByDef()"

  (Contributed by Victor Stinner in gh-85283 and gh-116936.)

* 참조 추적(tracing references)을 활성화하여 "--with-trace-refs" 옵션
  으로 빌드된 파이썬은 이제 제한된 C API를 지원합니다. (Victor Stinner
  가 gh-108634를 통해 기능을 구현하였습니다.)


제거된 C API들
--------------

* "_Py" 또는 "_PY" 접두사가 붙은 (비공개로 간주되는) 여러 함수, 매크로
  , 변수 등을 제거되었습니다. 혹시나라도 프로젝트가 해당하는 제거의 영
  향을 받거나 제거된 API가 계속 제공되어야 한다고 생각하신다면, 공개 C
  API를 요청하기 위해 새 이슈를 열어주시고, Victor Stinner에게 알리기
  위해 이슈에 "cc: @vstinner"를 추가해 주십시오. (Victor Stinner가
  gh-106320를 통해 기능을 구현하였습니다.)

* 파이썬 3.0에서 사용 지원이 중단된 낡은 버퍼 프로토콜을 제거합니다.
  대신 버퍼 프로토콜를 사용해주시기를 부탁드립니다.

  * "PyObject_CheckReadBuffer()": 객체가 버퍼 프로토콜을 지원하는지 테
    스트하고자 하는 경우 "PyObject_CheckBuffer()"를 사용해주시기를 부
    탁드립니다. 참고로 "PyObject_CheckBuffer()"는
    "PyObject_GetBuffer()"가 성공하는 것을 보장하는 방식의 가정을 하지
    는 않습니다. 객체를 실제로 읽을 수 있는지 테스트하고자 하는 경우
    "PyObject_GetBuffer()"의 다음 예제를 참조해주시기를 부탁드립니다.

  * "PyObject_AsCharBuffer()", "PyObject_AsReadBuffer()": 대신
    "PyObject_GetBuffer()"와 "PyBuffer_Release()"를 사용해주시기를 부
    탁드립니다:

       // `view.buf`\와 `view.len`\을 사용하여 버퍼로부터 읽는 것이 가능합니다.

       // buf를 `(const char*)view.buf`\로 캐스팅해야 하는 경우가 있을 수 있습니다.

  * "PyObject_AsWriteBuffer()": 대신 "PyObject_GetBuffer()"와
    "PyBuffer_Release()"를 사용해주시기를 부탁드립니다.

       // 버퍼에 쓸 때에는 `view.buf`\와 `view.len`\을 사용할 수 있습니다.

  (Inada Naoki가 gh-85275를 통해 기능을 구현하였습니다.)

* 파이썬 3.9에서 사용 지원이 중단된 여러 함수를 제거합니다.

  * "PyEval_CallObject()", "PyEval_CallObjectWithKeywords()": 대신
    "PyObject_CallNoArgs()" 혹은 "PyObject_Call()"를 사용해주시기를 부
    탁드립니다.

    경고:

      "PyObject_Call()"에서는 위치 인자가 "tuple"이어야 하고 *NULL*이
      면 안 됩니다. 키워드 인자는 "dict"이거나 *NULL*입니다. 제거된 과
      거의 함수들은 인자 형식을 검사하고, 위치 인자와 키워드 인자에 대
      해 *NULL*을 허용했었습니다. *PyEval_CallObjectWithKeywords(func,
      NULL, kwargs)*를 "PyObject_Call()" 대신 사용할 때에,
      "PyTuple_New(0)"로 생성한 빈 튜플을 위치 인자로 전달하는 것이 가
      능합니다.

  * "PyEval_CallFunction()": 대신 "PyObject_CallFunction()"를 사용해주
    시기를 부탁드립니다.

  * "PyEval_CallMethod()": 대신 "PyObject_CallMethod()"를 사용해주시기
    를 부탁드립니다.

  * "PyCFunction_Call()": 대신 "PyObject_Call()"를 사용해주시기를 부탁
    드립니다.

  (Victor Stinner가 gh-105107를 통해 기능을 구현하였습니다.)

* 오래된, 파이썬 초기화를 구성할 때 사용되던, 파이썬 3.11에서 사용 지
  원이 중단(deprecated)된, 다음 함수들을 제거합니다:

  * "PySys_AddWarnOptionUnicode()": 대신 "PyConfig.warnoptions"를 사용
    해주시기를 부탁드립니다.

  * "PySys_AddWarnOptionUnicode()": 대신 "PyConfig.warnoptions"를 사용
    해주시기를 부탁드립니다.

  * "PySys_AddXOption()": 대신 "PyConfig.xoptions"를 사용해주시기를 부
    탁드립니다.

  * "PySys_HasWarnOptions()": 대신 "PyConfig.xoptions"를 사용해주시기
    를 부탁드립니다.

  * "PySys_SetPath()": 대신 "PyConfig.module_search_paths"를 설정해주
    시기를 부탁드립니다.

  * "Py_SetPath()": 대신 "PyConfig.module_search_paths"를 설정해주시기
    를 부탁드립니다.

  * "Py_SetStandardStreamEncoding()": 대신 "PyConfig.stdio_encoding"를
    설정해주시기를 부탁드립니다. 또한, 윈도우에서의 경우
    "PyConfig.legacy_windows_stdio"를 설정해주시는 것이 필요한 경우가
    종종 있습니다.

  * "_Py_SetProgramFullPath()": 대신 "PyConfig.executable"를 설정해주
    시기를 부탁드립니다.

  파이썬 3.8에 추가된 파이썬 초기화 구성의 새로운 "PyConfig" API를 대
  신 사용해주시기를 부탁드립니다(보다 자세한 내용의 경우 **PEP 587**를
  참고해주시기를 부탁드립니다). (Victor Stinner가 gh-105145를 통해 기
  능을 구현하였습니다.)

* 파이썬 3.2에서 폐지된 "PyEval_AcquireLock()"과
  "PyEval_ReleaseLock()" 함수들을 제거하였습니다. 해당하는 함수들은 스
  레드 상태를 갱신하지 않았었습니다. 해당하는 함수들은 다음의 함수들을
  통해 대체 가능합니다:

  * "PyEval_SaveThread()"와 "PyEval_RestoreThread()";

  * 저수준 "PyEval_AcquireThread()"과 "PyEval_RestoreThread()";

  * 혹은 "PyGILState_Ensure()"와 "PyGILState_Release()".

  (Victor Stinner가 gh-105182를 통해 기능을 구현하였습니다.)

* 파이썬 3.9에서 사용 지원이 중단(deprecated)되었던
  "PyEval_ThreadsInitialized()" 함수를 제거했습니다. 파이썬 3.7부터는
  "Py_Initialize()"가 항상 GIL을 생성합니다. 따라서,
  "PyEval_InitThreads()"를 호출해도 아무런 효과가 없으며
  "PyEval_ThreadsInitialized()"는 항상 0이 아닌 값을 반환합니다.
  (Victor Stinner가 gh-105182를 통해 기능을 구현하였습니다.)

* 파이썬 3.8과의 하위 호환성을 위해 유지되던
  "_PyInterpreterState_Get()" 별칭(alias)을 제거했습니다. 해당하는 별
  칭(alias)은 "PyInterpreterState_Get()"에 대한 별칭(alias)이었습니다.
  파이썬 3.8 및 그 이전 버전에서 "PyInterpreterState_Get()"을 사용하는
  것은 pythoncapi-compat project를 통해 가능합니다. (Victor Stinner가
  gh-106320를 통해 기능을 구현하였습니다.)

* 비공개(private) 함수 "_PyObject_FastCall()"을 제거했습니다: 대신 파
  이썬 3.8부터 사용할 수 있는 "PyObject_Vectorcall()"을 사용해주시기를
  부탁드립니다(보다 자세한 내용의 경우 **PEP 590**를 참고해주시기를 부
  탁드립니다). (Victor Stinner가 gh-106023를 통해 기능을 구현하였습니
  다.)

* 비공개(private) 함수만을 포함하던 *cpython/pytime.h* 헤더 파일을 제
  거했습니다. (Victor Stinner가 gh-106316를 통해 기능을 구현하였습니다
  .)

* 제한된 C API에서 문서화되지 않은 상수 *PY_TIMEOUT_MAX*를 제거했습니
  다.

* 휴지통 매크로 *Py_TRASHCAN_SAFE_BEGIN*과 *Py_TRASHCAN_SAFE_END*를 제
  거했습니다. 해당 매크로는 오래된 것이었습니다. 대신 새로운 매크로인
  *Py_TRASHCAN_BEGIN*과 *Py_TRASHCAN_END*를 사용해주시기를 부탁드립니
  다. (Irit Katriel이 gh-105111를 통해 기능을 구현하였습니다.)


사용 지원 중단(deprecated)된 C API들
------------------------------------

* 오래된 파이썬 초기화 함수들의 사용 지원을 중단(deprecate)합니다:

  * "PySys_ResetWarnOptions()": 대신 "sys.warnoptions"와
    "warnings.filters"를 초기화해주시기를 부탁드립니다.

  * "Py_GetExecPrefix()": 대신 "sys.exec_prefix"를 활용해주시기를 부탁
    드립니다.

  * "Py_GetPath()": 대신 "sys.path"를 활용해주시기를 부탁드립니다.

  * "Py_GetPrefix()": 대신 "sys.prefix"를 활용해주시기를 부탁드립니다.

  * "Py_GetProgramFullPath()": 대신 "sys.executable"를 활용해주시기를
    부탁드립니다.

  * "Py_GetProgramName()": 대신 "sys.executable"를 활용해주시기를 부탁
    드립니다.

  * "Py_GetPythonHome()": 대신 "PyConfig.home" 혹은 "PYTHONHOME" 환경
    변수를 활용해주시기를 부탁드립니다.

  (Victor Stinner가 gh-105145를 통해 기능을 구현하였습니다.)

* "PyEval_GetBuiltins()", "PyEval_GetGlobals()", "PyEval_GetLocals()"
  함수를 *소프트 사용 지원 중단(soft deprecated)* 상태로 표시합니다.
  이들 함수는 *빌린 참조(borrowed reference)*를 반환합니다.

* "PyImport_ImportModuleNoBlock()" 함수를 사용 지원 중단(deprecate)합
  니다. 해당하는 함수는 파이썬 3.3부터 "PyImport_ImportModule()"의 별
  칭(alias)입니다.

* "PyModule_AddObject()" 함수를 *소프트 사용 지원 중단(soft
  deprecated)* 상태로 표시합니다. 해당하는 함수는 "PyModule_Add()" 또
  는 "PyModule_AddObjectRef()"로 대체해야 합니다. (Serhiy Storchaka가
  gh-86493를 통해 기능을 구현하였습니다.)

* 오래된 *Py_UNICODE* 그리고 *PY_UNICODE_TYPE* 타입과
  "Py_UNICODE_WIDE" 매크로를 폐지합니다. 대신 "wchar_t"타입을 사용해주
  시기를 부탁드립니다. 파이썬 3.3부터 *Py_UNICODE*와 *PY_UNICODE_TYPE*
  은 "wchar_t"의 별칭(alias)입니다.

* "PyWeakref_GetObject()"와 "PyWeakref_GET_OBJECT()" 함수가 사용 지원
  중단(deprecate)되었습니다. 해당하는 함수들은 *빌린 참조(borrowed
  reference)*를 반환합니다. 해당하는 함수들은 새 "PyWeakref_GetRef()"
  함수로 대체되어야 합니다. 해당하는 함수는 *강한 참조 (strong
  reference)*를 반환합니다. 파이썬 3.12 및 그 이전 버전에서
  "PyWeakref_GetRef()"를 사용하기 위해 pythoncapi-compat 프로젝트를 활
  용할 수 있습니다.


파이썬 3.14에서 제거 예정인 항목들
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* 확장 모듈용 "PyDictObject"의 *ma_version_tag* 필드(보다 자세한 내용
  의 경우 **PEP 699**과 gh-101193를 참고 부탁드립니다).

* 변형 가능한(mutable) 기반으로부터 "immutable types"의 생성 (보다 자
  세한 내용의 경우 gh-95388를 참고 부탁드립니다).


파이썬 3.15에서 제거 예정인 항목들
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* "PyImport_ImportModuleNoBlock()": 대신 "PyImport_ImportModule()"를
  사용해주시기를 부탁드립니다.

* "PyWeakref_GetObject()"와 "PyWeakref_GET_OBJECT()": 대신
  "PyWeakref_GetRef()"를 사용해주시기를 부탁드립니다. 파이썬 3.12 및
  그 이전 버전에서 "PyWeakref_GetRef()"를 사용하려면 pythoncapi-compat
  프로젝트를 활용할 수 있습니다.

* "Py_UNICODE" 타입과 "Py_UNICODE_WIDE" 매크로는 대신 "wchar_t"를 사용
  해주시기를 부탁드립니다.

* "PyUnicode_AsDecodedObject()": 대신 "PyCodec_Decode()"를 사용해주시
  기를 부탁드립니다.

* "PyUnicode_AsDecodedUnicode()": 대신 "PyCodec_Decode()"를 사용해주시
  기를 부탁드립니다. 다만, 일부 코덱(예를 들어, "base64")은 "str"이 아
  닌 "bytes"와 같은 다른 타입을 반환할 수 있음을 주의해주시기를 부탁드
  립니다.

* "PyUnicode_AsEncodedObject()": 대신 "PyCodec_Encode()"를 사용해주시
  기를 부탁드립니다.

* "PyUnicode_AsEncodedUnicode()" 대신 "PyCodec_Encode()"를 사용해주시
  기를 부탁드립니다. 일부 코덱(예를 들어, "base64")은 "bytes"가 아닌
  "str"과 같은 다른 타입을 반환할 수 있음을 주의해주시기를 부탁드립니
  다.

* 파이썬 3.13에서 사용 지원 중단(deprecated)된 파이썬 초기화 함수들:

  * "Py_GetPath()": 대신 "PyConfig_Get("module_search_paths")"
    ("sys.path")를 사용해주시기를 부탁드립니다.

  * "Py_GetPrefix()": 대신 "PyConfig_Get("base_prefix")"
    ("sys.base_prefix")를 사용해주시기를 부탁드립니다. 만약 가상 환경
    에 대한 처리가 필요한 경우에는 대신 "PyConfig_Get("prefix")"
    ("sys.prefix")를 사용해주시기를 부탁드립니다.

  * "Py_GetExecPrefix()": 대신 "PyConfig_Get("base_exec_prefix")"
    ("sys.base_exec_prefix")를 사용해주시기를 부탁드립니다. 만약 가상
    환경에 대한 처리가 필요한 경우에는 대신
    "PyConfig_Get("exec_prefix")" ("sys.exec_prefix")를 사용해주시기를
    부탁드립니다.

  * "Py_GetProgramFullPath()": 대신 "PyConfig_Get("executable")"
    ("sys.executable")를 사용해주시기를 부탁드립니다.

  * "Py_GetProgramName()": 대신 "PyConfig_Get("executable")"
    ("sys.executable")를 사용해주시기를 부탁드립니다.

  * "Py_GetPythonHome()": 대신 "PyConfig_Get("home")" 혹은
    "PYTHONHOME" 환경 변수를 사용해주시기를 부탁드립니다.

  Python 3.13 및 이전 버전에서 "PyConfig_Get()"을 사용하기 위해
  pythoncapi-compat 프로젝트를 사용할 수 있습니다.

* 파이썬 3.11에서 사용 지원이 중단(deprecated)된, 파이썬 초기화를 구성
  하는 함수들은 다음과 같습니다:

  * "PySys_SetArgvEx()": 대신 "PyConfig.argv"를 설정해주시기를 부탁드
    립니다.

  * "PySys_SetArgv()": 대신 "PyConfig.argv"를 설정해주시기를 부탁드립
    니다.

  * "Py_SetProgramName()": 대신 "PyConfig.program_name"를 설정해주시기
    를 부탁드립니다.

  * "Py_SetPythonHome()": 대신 "PyConfig.home"를 설정해주시기를 부탁드
    립니다.

  * "PySys_ResetWarnOptions()": 대신 "sys.warnoptions"와
    "warnings.filters"를 초기화해주시기를 부탁드립니다.

  "Py_InitializeFromConfig()" API는 "PyConfig"와 함께 사용되어야 합니
  다.

* 전역 구성 변수들:

  * "Py_DebugFlag": 대신 "PyConfig.parser_debug"나
    "PyConfig_Get("parser_debug")"를 사용해주시기를 부탁드립니다.

  * "Py_VerboseFlag": 대신 "PyConfig.verbose"나
    "PyConfig_Get("verbose")"를 사용해주시기를 부탁드립니다.

  * "Py_QuietFlag": 대신 "PyConfig.quiet"나 "PyConfig_Get("quiet")"를
    사용해주시기를 부탁드립니다.

  * "Py_InteractiveFlag": 대신 "PyConfig.interactive"나
    "PyConfig_Get("interactive")"를 사용해주시기를 부탁드립니다.

  * "Py_InspectFlag": 대신 "PyConfig.inspect"나
    "PyConfig_Get("inspect")"를 사용해주시기를 부탁드립니다.

  * "Py_OptimizeFlag": 대신 "PyConfig.optimization_level"나
    "PyConfig_Get("optimization_level")"를 사용해주시기를 부탁드립니다
    .

  * "Py_NoSiteFlag": 대신 "PyConfig.site_import"나
    "PyConfig_Get("site_import")"를 사용해주시기를 부탁드립니다.

  * "Py_BytesWarningFlag": 대신 "PyConfig.bytes_warning"나
    "PyConfig_Get("bytes_warning")"를 사용해주시기를 부탁드립니다.

  * "Py_FrozenFlag": 대신 "PyConfig.pathconfig_warnings"나
    "PyConfig_Get("pathconfig_warnings")"를 사용해주시기를 부탁드립니
    다.

  * "Py_IgnoreEnvironmentFlag": 대신 "PyConfig.use_environment"나
    "PyConfig_Get("use_environment")"를 사용해주시기를 부탁드립니다.

  * "Py_DontWriteBytecodeFlag": 대신 "PyConfig.write_bytecode"나
    "PyConfig_Get("write_bytecode")"를 사용해주시기를 부탁드립니다.

  * "Py_NoUserSiteDirectory": 대신 "PyConfig.user_site_directory"나
    "PyConfig_Get("user_site_directory")"를 사용해주시기를 부탁드립니
    다.

  * "Py_UnbufferedStdioFlag": 대신 "PyConfig.buffered_stdio"나
    "PyConfig_Get("buffered_stdio")"를 사용해주시기를 부탁드립니다.

  * "Py_HashRandomizationFlag": 대신 "PyConfig.use_hash_seed"나
    "PyConfig.hash_seed" 혹은 "PyConfig_Get("hash_seed")"를 사용해주시
    기를 부탁드립니다.

  * "Py_IsolatedFlag": 대신 "PyConfig.isolated" 혹은
    "PyConfig_Get("isolated")"를 사용해주시기를 부탁드립니다.

  * "Py_LegacyWindowsFSEncodingFlag": 대신
    "PyPreConfig.legacy_windows_fs_encoding" 혹은
    "PyConfig_Get("legacy_windows_fs_encoding")"를 사용해주시기를 부탁
    드립니다.

  * "Py_LegacyWindowsStdioFlag": 대신 "PyConfig.legacy_windows_stdio"
    혹은 "PyConfig_Get("legacy_windows_stdio")"를 사용해주시기를 부탁
    드립니다.

  * "Py_FileSystemDefaultEncoding"와
    "Py_HasFileSystemDefaultEncoding": 대신
    "PyConfig.filesystem_encoding" 혹은
    "PyConfig_Get("filesystem_encoding")"를 사용해주시기를 부탁드립니
    다.

  * "Py_FileSystemDefaultEncodeErrors": 대신
    "PyConfig.filesystem_errors" 혹은
    "PyConfig_Get("filesystem_errors")"를 사용해주시기를 부탁드립니다.

  * "Py_UTF8Mode": 대신 "PyPreConfig.utf8_mode" 혹은
    "PyConfig_Get("utf8_mode")"를 사용해주시기를 부탁드립니다 (보다 자
    세한 내용의 경우 "Py_PreInitialize()"를 참고 부탁드립니다).

  해당하는 옵션들을 설정하기 위해 "Py_InitializeFromConfig()" API를
  "PyConfig"와 함께 사용해주시기를 부탁드립니다. 혹은, 실행 시간에 해
  당하는 옵션 값을 가져오는 방식으로 "PyConfig_Get()"을 사용해주시기를
  부탁드립니다.


파이썬 3.16에서 제거 예정인 항목들
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* 번들로 포함된 "libmpdec" 사본.


파이썬 3.18에서 제거 예정인 항목들
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* 다음의 비공개(private) 함수들은 사용 지원이 중단(deprecated)되었으며
  파이썬 3.18에서 제거될 예정입니다.

  * "_PyBytes_Join()": 대신 "PyBytes_Join()"를 사용해주시기를 부탁드립
    니다.

  * "_PyDict_GetItemStringWithError()": 대신
    "PyDict_GetItemStringRef()"를 사용해주시기를 부탁드립니다.

  * "_PyDict_Pop()": 대신 "PyDict_Pop()"을 사용해주시기를 부탁드립니다
    .

  * "_PyLong_Sign()": 대신 "PyLong_GetSign()"을 사용해주시기를 부탁드
    립니다.

  * "_PyLong_FromDigits()" 그리고 "_PyLong_New()": 대신
    "PyLongWriter_Create()"를 사용해주시기를 부탁드립니다.

  * "_PyThreadState_UncheckedGet()": 대신
    "PyThreadState_GetUnchecked()"를 사용해주시기를 부탁드립니다.

  * "_PyUnicode_AsString()": 대신 "PyUnicode_AsUTF8()"를 사용해주시기
    를 부탁드립니다.

  * "_PyUnicodeWriter_Init()": "_PyUnicodeWriter_Init(&writer)"와 같은
    사용 대신 "writer = PyUnicodeWriter_Create(0)"와 같은 사용을 부탁
    드립니다.

  * "_PyUnicodeWriter_Finish()": "_PyUnicodeWriter_Finish(&writer)"와
    같은 사용 대신 "PyUnicodeWriter_Finish(writer)"와 같은 사용을 부탁
    드립니다.

  * "_PyUnicodeWriter_Dealloc()": "_PyUnicodeWriter_Dealloc(&writer)"
    와 같은 사용 대신 "PyUnicodeWriter_Discard(writer)"와 같은 사용을
    부탁드립니다.

  * "_PyUnicodeWriter_WriteChar()":
    "_PyUnicodeWriter_WriteChar(&writer, ch)"와 같은 사용 대신
    "PyUnicodeWriter_WriteChar(writer, ch)"와 같은 사용을 부탁드립니다
    .

  * "_PyUnicodeWriter_WriteStr()": "_PyUnicodeWriter_WriteStr(&writer,
    str)"와 같은 사용 대신 "PyUnicodeWriter_WriteStr(writer, str)"와
    같은 사용을 부탁드립니다.

  * "_PyUnicodeWriter_WriteSubstring()":
    "_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)"와 같은
    사용 대신 "PyUnicodeWriter_WriteSubstring(writer, str, start, end)
    " ""와 같은 사용을 부탁드립니다.

  * "_PyUnicodeWriter_WriteASCIIString()":
    "_PyUnicodeWriter_WriteASCIIString(&writer, str)"와 같은 사용 대신
    "PyUnicodeWriter_WriteASCII(writer, str)"와 같은 사용을 부탁드립니
    다.

  * "_PyUnicodeWriter_WriteLatin1String()":
    "_PyUnicodeWriter_WriteLatin1String(&writer, str)"와 같은 사용 대
    신 "PyUnicodeWriter_WriteUTF8(writer, str)"와 같은 사용을 부탁드립
    니다.

  * "_PyUnicodeWriter_Prepare()": (다른 직접적인 대안이 없습니다.)

  * "_PyUnicodeWriter_PrepareKind()": (다른 직접적인 대안이 없습니다.)

  * "_Py_HashPointer()": 대신 "Py_HashPointer()"를 사용해주시기를 부탁
    드립니다.

  * "_Py_fopen_obj()": 대신 "Py_fopen()"를 사용해주시기를 부탁드립니다
    .

  pythoncapi-compat 프로젝트를 통해 Python 3.13 및 그 이전 버전에서 새
  로운 공개 함수를 사용할 수 있습니다.


향후 보다 상위 버전의 제거 예정 항목들
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

다음의 API는 사용 지원 중단(deprecated)되었습니다. 제거될 예정이지만,
아직 구체적인 제거 일정이 정해지지는 않았습니다.

* "Py_TPFLAGS_HAVE_FINALIZE": 파이썬 3.8부터 활용되고 있지 않습니다.

* "PyErr_Fetch()": 대신 "PyErr_GetRaisedException()"를 사용해주시기를
  부탁드립니다.

* "PyErr_NormalizeException()": 대신 "PyErr_GetRaisedException()"를 사
  용해주시기를 부탁드립니다.

* "PyErr_Restore()": 대신 "PyErr_SetRaisedException()"를 사용해주시기
  를 부탁드립니다.

* "PyModule_GetFilename()": 대신 "PyModule_GetFilenameObject()"를 사용
  해주시기를 부탁드립니다.

* "PyOS_AfterFork()": 대신 "PyOS_AfterFork_Child()"를 사용해주시기를
  부탁드립니다.

* "PySlice_GetIndicesEx()": 대신 "PySlice_Unpack()"과
  "PySlice_AdjustIndices()"를 사용해주시기를 부탁드립니다.

* "PyUnicode_READY()": 파이썬 3.12부터 활용되고 있지 않습니다.

* "PyErr_Display()": 대신 "PyErr_DisplayException()"를 사용해주시기를
  부탁드립니다.

* "_PyErr_ChainExceptions()": 대신 "_PyErr_ChainExceptions1()"를 사용
  해주시기를 부탁드립니다.

* "PyBytesObject.ob_shash": 대신 "PyObject_Hash()"를 사용해주시기를 부
  탁드립니다.

* 스레드 로컬 저장소 (Thread Local Storage; TLS) API:

  * "PyThread_create_key()": 대신 "PyThread_tss_alloc()"를 사용해주시
    기를 부탁드립니다.

  * "PyThread_delete_key()": 대신 "PyThread_tss_free()"를 사용해주시기
    를 부탁드립니다.

  * "PyThread_set_key_value()": 대신 "PyThread_tss_set()"를 사용해주시
    기를 부탁드립니다.

  * "PyThread_get_key_value()": 대신 "PyThread_tss_get()"를 사용해주시
    기를 부탁드립니다.

  * "PyThread_delete_key_value()": 대신 "PyThread_tss_delete()"를 사용
    해주시기를 부탁드립니다.

  * "PyThread_ReInitTLS()": 파이썬 3.7부터 활용되고 있지 않습니다.


빌드 변경 사항들
================

* *arm64-apple-ios*와 *arm64-apple-ios-simulator*는 이제  **PEP 11**에
  서 규정된 3단계 (Tier 3) 지원 플랫폼입니다. (Russell Keith-Magee가
  PEP 730를 작성하였으며, gh-114099를 통해 기능을 구현하였습니다.)

* *aarch64-linux-android*와 *x86_64-linux-android*는 이제 **PEP 11**에
  서 규정된 3단계 (Tier 3) 지원 플랫폼입니다. (Malcolm Smith가 PEP 738
  를 작성하였으며, gh-116622를 통해 기능을 구현하였습니다.)

* "wasm32-wasi"는 **PEP 11**에서 규정된 2단계 (Tier 2) 지원 플랫폼입니
  다. (Brett Cannon이 gh-115192를 통해 기능을 구현하였습니다.)

* *wasm32-emscripten*은 더 이상 **PEP 11**에서 규정된 공식 지원 플랫폼
  이 아닙니다. (Brett Cannon이 gh-115192를 통해 기능을 구현하였습니다
  .)

* 이제 CPython을 빌드하려면 C11 atomic 라이브러리, GCC 내장 atomic 함
  수, 또는 MSVC interlocked intrinsic를 지원하는 컴파일러가 필요합니다
  .

* 이제 "configure" 스크립트를 다시 생성하려면 Autoconf 2.71과 aclocal
  1.16.5가 필요합니다. (Christian Heimes가 gh-89886를 통해, 그리고
  Victor Stinner가 gh-112090를 통해 기능을 구현하였습니다.)

* "sqlite3" 확장 모듈을 빌드하려면 SQLite 3.15.2 이상이 필요합니다.
  (Erlend Aasland가 gh-105875를 통해 기능을 구현하였습니다.)

* CPython은 이제 기본적으로 mimalloc 라이브러리를 함께 제공합니다. 해
  당하는 라이브러리는 MIT 라이센스로 배포됩니다. 보다 자세한 내용은
  mimalloc 라이센스을 참고 부탁드립니다. mimalloc 번들에는 사용자에 의
  한 변경 사항이 있을 수 있습니다. 보다 자세한 내용은 gh-113141을 참고
  부탁드립니다.

* "configure" 스크립트의 "--with-system-libmpdec" 옵션 기본값은 이제
  "yes"입니다. 내장된 *libmpdec* 사본은 Python 3.16에서 제거될 예정입
  니다.

* "configure"에서 "--with-trace-refs" (참조 추적) 옵션을 사용해 빌드한
  파이썬은 이제 파이썬 릴리스 빌드 및 디버그 빌드와 ABI 호환됩니다.
  (Victor Stinner가 gh-108634를 통해 기능을 구현하였습니다.)

* POSIX 시스템에서 이제 pkg-config(".") 파일 이름에 ABI 플래그가 포함
  됩니다. 예를 들어, 제한 없는 스레드를 사용하는(free-threaded) 빌드는
  *python-3.13t.pc*를 생성하고 디버그 빌드는 *python-3.13d.pc*를 생성
  합니다.

* "errno", "fcntl", "grp", "md5", "pwd", "resource", "termios",
  "winsound", "_ctypes_test", "_multiprocessing.posixshmem",
  "_scproxy", "_stat", "_statistics", "_testconsole",
  "_testimportmultiple", 그리고 "_uuid" C 확장 모듈은 이제 제한된 C
  API (limited-c-api)로 빌드됩니다. (Victor Stinner가 gh-85283를 통해
  기능을 구현하였습니다.)


파이썬 3.13으로의 (코드) 이식
=============================

해당하는 섹션을 통해, 앞서 설명한 변경 사항과, 코드 변경이 필요할 수
있는 기타 버그 수정 사항들을 나열하며 각각에 대한 설명을 드리고자 합니
다.


파이썬 API 변경 사항
--------------------

* PEP 667는 "locals()"와 "f_locals"의 의미 구조에 여러 변경 가능성을
  제안하였습니다.

  * *최적화된 스코프(optimized scope)*에서 "locals()"를 호출하면 호출
    할 때마다 서로 독립적인 스냅샷이 생성되며, 그 결과 이전에 반환된
    참조는 더 이상 암시적으로 갱신되지 않습니다. 레거시 CPython 동작을
    재현하려면, 처음에 반환된 딕셔너리를 이후의 "locals()" 호출 결과로
    명시적으로 갱신해 주어야 합니다. "locals()"를 암시적으로 대상으로
    하는 코드 실행 함수들(예를 들어, *exec* 혹은 *eval*)은 최적화된 스
    코프(optimized scope)에서 실행 결과에 접근하려면 반드시 명시적인
    네임 스페이스(namespace)을 전달받아야 합니다. (**PEP 667**를 통해
    제안된 가능성 중 일부가 적용된 결과입니다.)

  * 모듈이나 클래스 스코프에서 컴프리헨션 내부에서(*exec*혹은 *eval*를
    사용하는 경우를 포함하는 방식으로) "locals()"를 호출하면, 다시 한
    번 그 컴프리헨션이 독립적인 중첩 함수처럼 실행되는 것과 같은 방식
    으로 작동합니다. 이를 감싸고 있는(containing) 스코프의 지역 변수는
    포함되지 않습니다. 파이썬 3.12에서는 **PEP 709**을 통해 제안된 가
    능성 중 일부를 적용한 결과로, 감싸고 있는(containing) 스코프의 지
    역 변수까지 포함하도록 해당하는 동작이 구현되었던 적 있습니다. (현
    재 버전의 변경은, **PEP 667**를 통해 제안된 가능성 중 일부가 적용
    된 결과입니다.)

  * 이제 *최적화된 스코프*에서 "FrameType.f_locals"에 접근하면, 특정
    시점에만 갱신되는 스냅샷이 아니라 이어쓰기(write-through) 프록시가
    반환됩니다. 스냅샷이 필요한 경우에는, *dict* 생성자나 프록시의
    *.copy()* 메서드를 통해 명시적으로 만들어주셔야 합니다. (**PEP
    667**를 통해 제안된 가능성 중 일부가 적용된 결과입니다.)

* "functools.partial"을 메서드로 사용할 경우 이제 "FutureWarning" 경고
  가 발생합니다. 해당하는 동작은 향후의 파이썬 버전에서 수정 변경될 예
  저입니다. 이전 방식의 동작을 그대로 유지하고자 하는 경우,
  "staticmethod()"로 감싸서 사용해주시기를 부탁드립니다. (Serhiy
  Storchaka가 gh-121027를 통해 기능을 구현하였습니다.)

* "getpass.getuser()"은 사용자 아이디 검색에 실패하면 비유닉스 플랫폼
  에서는 "ImportError", 유닉스 플랫폼에서는 비밀번호 데이터베이스가 비
  어 있는 경우 "KeyError" 대신 "OSError"이 발생함을 유의해주시기를 부
  탁드립니다.

* "gzip.GzipFile"의 "mode" 어트리뷰트 값은 이제 정수형 ("1" 또는 "2")
  대신 문자열("'rb'" 또는 "'wb'")입니다. "zipfile.ZipFile.open()"에서
  반환되는 읽기 가능한 파일형 객체의 "mode" 어트리뷰트 값은 이제 "'r'"
  대신 "'rb'"입니다. (Serhiy Storchaka가 gh-115961를 통해 기능을 구현
  하였습니다.)

* "mailbox.Maildir"는 이제 이름이 점("'.'")으로 시작하는 파일을 무시합
  니다. (Zackery Spytz가 gh-65559를 통해 기능을 구현하였습니다.)

* "pathlib.Path.glob()" 및 "rglob()"는 이제 ""**""로 끝나는 패턴이 주
  어지면 디렉터리뿐만 아니라 파일도 모두 반환합니다. 이전에는 디렉터리
  만 반환했습니다. 이전과 같이 디렉터리만 일치시키려면 패턴 끝에 슬래
  시를 추가하십시오.

* "threading" 모듈은 이제 "_thread" 모듈에 "_is_main_interpreter()" 함
  수가 정의되어 있는 것을 가정합니다. 해당하는 함수는 인자를 받지 않으
  며, 현재의 인터프리터가 메인 인터프리터이면 *True*를 반환합니다.

  커스텀 "_thread" 모듈을 제공하는 모든 라이브러리나 응용 프로그램은,
  모듈의 다른 "비공개(private)" 어트리뷰트와 마찬가지로
  "_is_main_interpreter()" 함수를 반드시 제공해야 합니다. (보다 자세한
  내용은 gh-112826를 참고 부탁드립니다.)


C API 변경사항
--------------

* "Python.h"는 더 이상 "<ieeefp.h>" 표준 헤더 파일을 포함하지 않습니다
  . 해당하는 헤더는 원래 "finite()" 함수를 제공하기 위해 포함되었으나,
  이제 해당하는 함수는 "<math.h>" 헤더를 통해 제공됩니다. 이제는 필요
  한 경우에만 명시적으로 포함해야 합니다. 또한, "HAVE_IEEEFP_H" 매크로
  가 제거되었습니다. (Victor Stinner가 gh-108765를 통해 기능을 구현하
  였습니다.)

* *Python.h*는 이제 "<time.h>", "<sys/select.h>", "<sys/time.h>" 표준
  헤더 파일을 더 이상 포함하지 않습니다. 이제는 필요한 경우에만 해당하
  는 헤더들을 명시적으로 포함해야 합니다. 예를 들어, "<time.h>"는
  "clock()" 및 "gmtime()" 함수를 제공하고, *<sys/select.h>`는
  :c:func:*!select` 함수를 제공하며, "<sys/time.h>"는 "futimes()",
  "gettimeofday()", "setitimer()" 함수들을 제공합니다. (Victor Stinner
  가 gh-108765를 통해 기능을 구현하였습니다.)

* Windows에서 "Python.h"는 더 이상 "<stddef.h>" 표준 헤더 파일을 포함
  하지 않습니다. 이제는 필요한 경우에만 해당하는 헤더들을 명시적으로
  포함해야 합니다. 예를 들어, 해당하는 헤더는 "offsetof()" 함수와
  "size_t" 및 "ptrdiff_t" 타입을 제공합니다. 다른 모든 플랫폼에서는 이
  미 "<stddef.h>"를 명시적으로 포함해야 했습니다. "HAVE_STDDEF_H" 매크
  로는 윈도우에서만 정의됩니다. (Victor Stinner가 gh-108765를 통해 기
  능을 구현하였습니다.)

* "Py_LIMITED_API" 매크로가 정의된 경우, "Py_BUILD_CORE",
  "Py_BUILD_CORE_BUILTIN", 그리고 "Py_BUILD_CORE_MODULE" 매크로는 이제
  "<Python.h>"에서 정의가 해제됩니다. (Victor Stinner가 gh-85283를 통
  해 기능을 구현하였습니다.)

* 이전 trashcan 매크로인 "Py_TRASHCAN_SAFE_BEGIN"과
  "Py_TRASHCAN_SAFE_END"가 제거되었습니다. 대신 보다 새로운 매크로인
  "Py_TRASHCAN_BEGIN" 및 "Py_TRASHCAN_END"를 사용해주시기를 부탁드립니
  다.

  이전 매크로를 사용하는 "tp_dealloc" 함수는 다음과 같이:

     static void
     mytype_dealloc(mytype *p)
     {
         PyObject_GC_UnTrack(p);
         Py_TRASHCAN_SAFE_BEGIN(p);
         ...
         Py_TRASHCAN_SAFE_END
     }

  새 매크로를 사용하는 방식으로 업데이트되어야 합니다.

     static void
     mytype_dealloc(mytype *p)
     {
         PyObject_GC_UnTrack(p);
         Py_TRASHCAN_BEGIN(p, mytype_dealloc)
         ...
         Py_TRASHCAN_END
     }

  "Py_TRASHCAN_BEGIN"의 두 번째 인자는 해당하는 매크로가 사용되는 할당
  해제 함수 자신을 가리켜야 한다는 점을 유의해주십사 부탁드립니다. 새
  로운 매크로는 파이썬 3.8에서 추가되었고, 기존 매크로는 파이썬 3.11에
  서 사용 지원이 중단(deprecated)되었습니다. (Irit Katriel이 gh-105111
  을 통해 기능을 구현하였습니다.)

* PEP 667은 프레임 관련 함수에 여러 변경 가능성을 제안합니다:

  * *최적화된 스코프*에서 "PyEval_GetLocals()"가 반환하는 딕셔너리를
    변경했을 때의 작동 방식이 달라졌습니다. 추가된 새 딕셔너리 항목은
    이제 해당 프레임에서 이어지는 "PyEval_GetLocals()" 호출에서만 *보
    이게* 됩니다. "PyFrame_GetLocals()", "locals()",
    "FrameType.f_locals"는 더 이상 동일한 하부 캐시 딕셔너리에 액세스
    하지 않습니다. 실제 변수 이름에 대한 항목과 이어쓰기(write-
    through) 프록시 인터페이스를 통해 추가된 이름에 대한 변경 사항은,
    해당 프레임에서 "PyEval_GetLocals()"를 이어서 호출하는 경우에 덮어
    씁니다. 권장되는 코드 수정 방법은 그 함수가 어떻게 사용되고 있었는
    지에 따라 달라질 수 있습니다. 보다 자세한 내용의 경우 해당하는 함
    수에 대한 사용 지원 중단 안내(deprecation notice)를 참고해주시기를
    부탁드립니다.

  * *최적화된 스코프*에서 "PyFrame_GetLocals()"를 호출하면, 이제는 시
    점이 불분명하게 갱신되는 스냅샷 대신 이어쓰기(write-through) 프록
    시를 반환합니다. 스냅샷이 필요한 경우에는 명시적으로 (예를 들어,
    "PyDict_Copy()"를 통해) 만들거나 혹은 새로운
    "PyEval_GetFrameLocals()" API를 호출하는 방법이 있습니다.

  * "PyFrame_FastToLocals`와
    :c:func:()"!PyFrame_FastToLocalsWithError`는 더 이상 아무런 효과도
    가지지 않습니다. 파이썬 3.11에 "PyFrame_GetLocals()"이 도입된 이후
    로 해당하는 함수들을 호출하는 것이 불필요하다는 점에 유의해주시기
    를 부탁드립니다.

  * "PyFrame_LocalsToFast()"는 더 이상 아무런 효과도 가지지 않습니다.
    "PyFrame_GetLocals()"이 *optimized scopes*에 대한 이어 쓰기 프록시
    를 반환하므로 해당하는 함수를 호출하는 것이 불필요하다는 점에 유의
    해주시기를 부탁드립니다.

* 파이썬 3.13은 많은 비공개(private) 함수들을 제거했습니다. 일부는 다
  음과 같은 방식으로 대체될 수 있습니다:

  * "_PyDict_Pop()" "PyDict_Pop()" 또는 "PyDict_PopString()";

  * "_PyDict_GetItemWithError()": "PyDict_GetItemRef()";

  * "_PyErr_WriteUnraisableMsg()":  "PyErr_FormatUnraisable()";

  * "_PyEval_SetTrace()" "PyEval_SetTrace()" 또는
    "PyEval_SetTraceAllThreads()";

  * "_PyList_Extend()": "PyList_Extend()";

  * "_PyLong_AsInt()": "PyLong_AsInt()";

  * "_PyMem_RawStrdup()": "strdup()";

  * "_PyMem_Strdup()": "strdup()";

  * "_PyObject_ClearManagedDict()": "PyObject_ClearManagedDict()";

  * "_PyObject_VisitManagedDict()": "PyObject_VisitManagedDict()";

  * "_PyThreadState_UncheckedGet()": "PyThreadState_GetUnchecked()";

  * "_PyTime_AsSecondsDouble()": "PyTime_AsSecondsDouble()";

  * "_PyTime_GetMonotonicClock()" "PyTime_Monotonic()" 또는
    "PyTime_MonotonicRaw()";

  * "_PyTime_GetPerfCounter()" "PyTime_PerfCounter()" 또는
    "PyTime_PerfCounterRaw()";

  * "_PyTime_GetSystemClock()" "PyTime_Time()" 또는
    "PyTime_TimeRaw()";

  * "_PyTime_MAX": "PyTime_MAX";

  * "_PyTime_MIN": "PyTime_MIN";

  * "_PyTime_t": "PyTime_t";

  * "_Py_HashPointer()": "Py_HashPointer()";

  * "_Py_IsFinalizing()": "Py_IsFinalizing()".

  파이썬 3.12 및 상위 버전에서  pythoncapi-compat 프로젝트를 통해 해당
  하는 새로운 함수 대부분을 사용할 수 있습니다.


회귀 테스트 변경 사항
=====================

* "configure" "--with-pydebug"을 통해 빌드된 파이썬은 이제 "-X
  presite=package.module"를 지원합니다. 해당하는 옵션을 사용하면
  "site.py"이 실행되기 전에 인터프리터의 라이프 사이클 초기에 가져와야
  하는 모듈들을 지정합니다. (Łukasz Langa가 gh-110769를 통해 기능을 구
  현하였습니다.)
