# 파이썬 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를 통해 기능을 구현하였습니다.)