Python

Python 3.15의 새로운 기능

편집자:

Hugo van Kemenade

이 문서는 3.14와 비교하여 Python 3.15에 추가된 새로운 기능들을 설명합니다.

자세한 내용은 변경 로그 를 참조하십시오.

참고

사전 출시 버전 사용자는 이 문서가 현재 초안 상태임을 인지해야 합니다. Python 3.15의 출시가 다가옴에 따라 내용이 크게 업데이트될 예정이므로, 이전 버전을 읽은 후에도 다시 확인해 볼 가치가 있습니다.

요약 – 릴리스 하이라이트

새 기능

PEP 810: 명시적 지연 임포트

규모가 큰 Python 애플리케이션은 종종 느린 시작 시간 문제를 겪습니다. 이 문제의 주요 원인 중 하나는 임포트 시스템입니다. 모듈이 임포트될 때 Python은 파일을 찾고, 디스크에서 읽어 들여, 바이트코드로 컴파일한 다음 모든 최상위 수준(top-level) 코드를 실행해야 합니다. 의존성 트리가 깊은 애플리케이션의 경우, 실제로는 특정 실행 중에 사용되지 않는 코드일지라도 이 과정이 수 초 이상 걸릴 수 있습니다.

개발자들은 이를 해결하기 위해 임포트를 함수 내부로 옮기거나, importlib 을 사용하여 필요할 때 모듈을 로드하거나, 불필요한 의존성을 피하도록 코드를 재구성하는 방식을 사용해 왔습니다. 이러한 방식들은 효과가 있지만 코드를 읽고 유지 관리하기 어렵게 만들며, 임포트 문이 코드 전반에 흩어지게 하고, 일관되게 적용하려면 주의가 필요합니다.

이제 Python은 새로운 lazy 소프트 키워드를 사용하여 명시적인 lazy 임포트를 제공하는 더 깔끔한 해결책을 제공합니다. 임포트를 lazy로 표시하면, Python은 해당 이름이 처음으로 사용될 때까지 실제 모듈 로딩을 지연시킵니다. 이를 통해 파일 상단에 모든 임포트를 선언하는 구조적 이점을 얻으면서도 실제로 사용하는 모듈에 대해서만 로딩 비용을 지불할 수 있습니다.

lazy 키워드는 importfrom ... import 문 모두에서 작동합니다. lazy import heavy_module 과 같이 작성하면 Python은 모듈을 즉시 로드하지 않습니다. 대신 가벼운 프록시 객체를 생성합니다. 실제 모듈 로딩은 해당 이름을 처음으로 접근할 때 투명하게 수행됩니다.

lazy import json
lazy from pathlib import Path

print("Starting up...")  # json 및 pathlib이 아직 로드되지 않음

data = json.loads('{"key": "value"}')  # 여기서 json 로드
p = Path(".")  # 여기서 pathlib 로드

이 메커니즘은 최상위 수준에서 많은 모듈을 임포트하지만 실제 실행 시에는 그 중 일부만 사용하는 애플리케이션에 특히 유용합니다. 지연 로딩(deferred loading)은 코드 구조를 복잡하게 변경하거나 코드 전반에 조건부 임포트를 흩어놓지 않고도 시작 지연 시간을 줄여줍니다.

지연 임포트된 모듈을 로드하는 데 실패하는 경우(예: 모듈이 존재하지 않는 경우), Python은 임포트 시점이 아니라 처음 사용하는 시점에 예외를 발생시킵니다. 관련 트레이스백에는 이름에 접근한 위치와 원래의 임포트 문이 모두 포함되어 있어 오류를 진단하고 디버그하기 쉽습니다.

소스 코드를 수정하지 않고 전역적으로 지연 로딩을 활성화하려면 Python이 제공하는 -X lazy_imports 명령줄 옵션과 PYTHON_LAZY_IMPORTS 환경 변수를 사용할 수 있습니다. 두 옵션 모두 두 가지 값을 수용합니다: all``은 모든 임포트를 기본적으로 지연 처리하고, ``normal``(기본값)은 소스 코드의 ``lazy 키워드를 따릅니다. sys.set_lazy_imports()sys.get_lazy_imports() 함수를 사용하여 실행 중에 이 모드를 변경하거나 조회할 수 있습니다.

더욱 선택적인 제어를 위해 sys.set_lazy_imports_filter() 는 특정 모듈을 지연 로드할지 여부를 결정하는 호출 가능한(callable) 객체를 인수로 받습니다. 필터는 세 개의 인자를 받습니다: 임포트하는 모듈의 이름(또는 None), 임포트되는 모듈의 이름, 그리고 fromlist(일반 임포트의 경우 None). 지연 로딩을 허용하려면 True 를, 즉시 로딩을 강제하려면 False 를 반환해야 합니다. 이를 통해 서드파티 의존성은 즉시 로드하면서 본인 애플리케이션의 모듈만 지연 로드하는 것과 같은 패턴이 가능합니다:

import sys

def myapp_filter(importing, imported, fromlist):
    return imported.startswith("myapp.")
sys.set_lazy_imports_filter(myapp_filter)
sys.set_lazy_imports("all")

import myapp.slow_module  # 지연 로드 (필터 일치)
import json               # 즉시 로드 (필터 불일치)

프로그램적으로 지연 임포트를 감지해야 하는 코드를 위해 프록시 타입 자체를 types.LazyImportType 으로 제공합니다.

lazy 키워드를 사용할 수 있는 위치에는 몇 가지 제한이 있습니다. 지연 임포트는 모듈 범위에서만 허용됩니다. 함수 내부, 클래스 본문 또는 try/except/finally 블록 내에서 lazy 를 사용하면 SyntaxError 가 발생합니다. 별표(*) 임포트나 future 임포트는 지연 로딩을 사용할 수 없습니다(lazy from module import *lazy from __future__ import ... 모두 SyntaxError 를 발생시킵니다).

lazy 키워드를 직접 사용할 수 없는 코드의 경우(예: 3.15 버전 이상에서 지연 임포트를 사용하면서도 3.15 이전 버전을 지원해야 하는 경우), 모듈이 이러한 모듈에 대한 일반적인 ``import` 문은 lazy 키워드와 동일한 의미를 가지며 지연 로드로 처리됩니다:

__lazy_modules__ = ["json", "pathlib"]

import json     # 지연 로드
import os       # 여전히 즉시 로드

더 보기

상세 사양 및 근거는 PEP 810 을 참조하십시오.

(Pablo Galindo Salgado와 Dino Viehland가 gh-142349 에서 기여하였습니다.)

PEP 814: frozendict 내장 타입 추가

A new immutable type, frozendict, is added to the builtins module. It does not allow modification after creation. A frozendict is not a subclass of dict; it inherits directly from object. A frozendict is hashable as long as all of its keys and values are hashable. A frozendict preserves insertion order, but comparison does not take order into account.

예를 들면:

>>> a = frozendict(x=1, y=2)
>>> a
frozendict({'x': 1, 'y': 2})
>>> a['z'] = 3
Traceback (most recent call last):
  File "<python-input-2>", line 1, in <module>
    a['z'] = 3
    ~^^^^^
TypeError: 'frozendict' object does not support item assignment
>>> b = frozendict(y=2, x=1)
>>> hash(a) == hash(b)
True
>>> a == b
True

다음 표준 라이브러리 모듈들이 frozendict 를 수용하도록 업데이트되었습니다: copy, decimal, json, marshal, plistlib (직렬화에 대해서만), pickle, pprintxml.etree.ElementTree.

eval()exec()globalsfrozendict 를 수용하며, type()str.maketrans()dictfrozendict 를 수용합니다.

isinstance(arg, dict) 를 사용하여 dict 유형을 확인하는 코드를 isinstance(arg, (dict, frozendict)) 로 업데이트하여 frozendict 타입도 수용하거나, isinstance(arg, collections.abc.Mapping) 으로 수정하여 MappingProxyType 과 같은 다른 매핑 유형도 지원하도록 할 수 있습니다.

더 보기

PEP 814 을 참조하여 전체 사양 및 근거를 확인하십시오.

(Victor Stinner와 Donghee Na가 gh-141510 에서 기여하였습니다.)

PEP 661: sentinel 내장 타입 추가

간결한 표현을 가진 고유한 sentinel 값을 생성하기 위해 builtins 모듈에 새로운 sentinel 타입이 추가되었습니다. Sentinel 객체는 복사될 때 정체성(identity)을 유지하며, | 연산자를 사용하는 유형 표현에서 사용 가능하고, 모듈과 이름으로 임포트 가능한 경우 피클링할 수 있습니다.

(Tal Einat에 의한 PEP이며, Jelle Zijlstra가 gh-148829 에서 기여하였습니다.)

더 보기

상세 내용은 PEP 661 을 참조하십시오.

PEP 799: 전용 프로파일링 패키지

Python의 내장 프로파일링 도구들을 단일하고 일관된 네임스페이스로 정리하기 위해 새로운 profiling 모듈이 추가되었습니다. 이 모듈은 다음을 포함합니다:

cProfile 모듈은 하위 호환성을 위해 별칭으로 유지됩니다. profile 모듈은 더 이상 권장되지 않으며(deprecated) Python 3.17에서 제거될 예정입니다.

더 보기

상세 내용은 PEP 799 를 참조하십시오.

(Pablo Galindo와 László Kiss Kollár가 gh-138122 에서 기여하였습니다.)

Tachyon: 고주파수 통계적 샘플링 프로파일러

Tachyon 프로파일러 로고

새로운 통계적 샘플링 프로파일러(Tachyon)가 profiling.sampling 으로 추가되었습니다. 이 프로파일러는 코드 수정이나 프로세스 재시작 없이 실행 중인 Python 프로세스의 저오버헤드 성능 분석을 가능하게 합니다.

모든 함수 호출을 계측하는 결정론적 프로파일러(예: profiling.tracing)와 달리, 샘플링 프로파일러는 실행 중인 프로세스에서 주기적으로 스택 트레이스를 캡처합니다. 이 방식은 최대 1,000,000 Hz 의 샘플링 속도를 달성하면서도 사실상 거의 없는 오버헤드를 제공하므로, (기여 당시) Python에서 사용 가능한 가장 빠른 샘플링 프로파일러이며 운영 환경에서 성능 문제를 디버깅하는 데 이상적입니다. 이러한 기능은 기존의 프로파일링 방식이 너무 방해가 될 수 있는 실제 서비스 운영 시스템에서 성능 문제를 해결할 때 특히 가치가 있습니다.

주요 기능은 다음과 같습니다:

  • 제로 오버헤드 프로파일링: 애플리케이션의 성능에 영향을 주지 않고 실행 중인 모든 Python 프로세스에 연결합니다. 재시작이나 속도 저하를 감수할 수 없는 운영 환경 디버깅에 이상적입니다.

  • 코드 수정 필요 없음: 재시작 없이 기존 애플리케이션을 프로파일링합니다. 단순히 실행 중인 프로세스의 PID를 지정하여 데이터를 수집하기 시작하면 됩니다.

  • 유연한 타겟 모드:

    • PID로 실행 중인 프로세스 프로파일링(attach) - 이미 실행 중인 애플리케이션에 연결

    • 스크립트 직접 실행 및 프로파일링(run) - 실행 시작 시점부터 프로파일링

    • 모듈 실행 및 프로파일링(run -m) - python -m module 으로 실행되는 패키지 프로파일링

    • 실행 중인 프로세스의 단발성 스냅샷 캡처(dump) - 모든 스레드(또는 --async-aware 를 사용한 모든 asyncio 태스크)의 트레이스백 스타일 스택을 출력합니다. 응답이 없는(hung) 프로세스를 조사할 때 유용합니다.

  • 다양한 프로파일링 모드: 성능 조사의 목적에 따라 측정 항목을 선택하십시오:

    • 벽시계 시간(Wall-clock time) (--mode wall, 기본값): I/O, 네트워크 대기, 차단 작업 등을 포함한 실제 경과 시간을 측정합니다. 외부 리소스를 기다리는 시간을 포함하여 프로그램이 실제 시간상으로 어디에 많은 시간을 소비하는지 파악할 때 사용하십시오.

    • CPU 시간 (--mode cpu): I/O 대기 및 차단을 제외하고 실제 활성화된 CPU 실행 시간만 측정합니다. CPU 바운드 병목 현상을 파악하고 연산 작업을 최적화할 때 사용하십시오.

    • GIL 보유 시간 (--mode gil): Python의 전역 인터프리터 록(Global Interpreter Lock)을 점유하며 소요되는 시간을 측정합니다. 멀티스레드 애플리케이션에서 어떤 스레드가 GIL 사용을 주도하는지 파악할 때 사용하십시오.

    • 예외 처리 시간 (--mode exception): 활성화된 예외가 있는 스레드에서만 샘플을 캡처합니다. 예외 처리 오버헤드를 분석할 때 사용하십시오.

  • 스레드 인식 프로파일링: 모든 스레드(-a) 또는 메인 스레드만 프로파일링하는 옵션으로, 멀티스레드 애플리케이션 동작을 이해하는 데 필수적입니다.

  • 다양한 출력 형식: 워크플로우에 가장 적합한 시각화 방식을 선택하십시오:

    • --pstats: pstats 와 호환되는 상세한 표 형식의 통계입니다. 직접 샘플과 누적 샘플을 포함한 함수 수준의 타이밍을 보여줍니다. 세부 분석 및 기존 파이썬 프로파일링 도구와의 통합에 가장 적합합니다.

    • --collapsed: 요약된 스택 트레이스(스택당 한 줄)를 생성합니다. 이 형식은 Brendan Gregg의 FlameGraph 스크립트나 speedscope와 같은 외부 도구를 사용하여 플레임 그래프를 만드는 데 특화되어 있습니다.

    • --flamegraph: D3.js를 사용하여 독립적인 대화형 HTML 플레임 그래프를 생성합니다. 브라우저에서 바로 열어 즉각적으로 시각적 분석이 가능합니다. 플레임 그래프는 호출 계층을 보여주며 너비가 소요 시간을 나타내므로 한눈에 병목 지점을 파악하기 쉽습니다.

    • --gecko: Firefox Profiler 와 호환되는 Gecko Profiler 형식을 생성합니다. 출력물을 Firefox Profiler에 업로드하여 스택 차트, 마커, 네트워크 활동과 같은 기능을 포함한 고급 타임라인 기반 분석을 수행하십시오.

    • --heatmap: 라인 수준의 샘플 수가 포함된 대화형 HTML 히트맵 시각화를 생성합니다. 소스 코드 수준에서 정확히 어느 부분에서 시간이 소요되는지 보여주는 파일별 히트맵이 포함된 디렉토리를 생성합니다.

  • 라이브 대화형 모드: top과 유사한 인터페이스를 가진 실시간 TUI 프로파일러(--live)입니다. 애플리케이션이 실행되는 동안 상호작용형 정렬 및 필터링을 통해 성능을 모니터링하십시오.

  • 비동기 인식 프로파일링: 태스크 기반 스택 재구성을 통해 async/await 코드를 프로파일링합니다(--async-aware). 실행 중인 태스크만 표시하거나 대기 중인 태스크를 포함한 모든 태스크를 표시하는 옵션을 선택하여 어떤 코루틴이 시간을 소비하고 있는지 확인하십시오.

  • Op코드 수준 프로파일링: 명령어 수준의 프로파일링을 위해 바이트코드 Op코드 정보를 수집합니다(--opcodes). 적응형 인터프리터(adaptive interpreter)에 의한 특수화된 내용을 포함하여 어떤 바이트코드 명령어가 실행되는지 보여줍니다.

사용 가능한 모든 출력 형식, 프로파일링 모드 및 구성 옵션을 포함한 전체 문서는 profiling.sampling 을 참조하십시오.

(Pablo Galindo와 László Kiss Kollár가 gh-135953gh-138122 에서 기여하였습니다.)

PEP 831: 프레임 포인터 기본 활성화

CPython은 이제 이를 지원하는 플랫폼에서 프레임 포인터가 기본으로 활성화되어 빌드됩니다. 이는 컴파일러 플래그 -fno-omit-frame-pointer-mno-omit-leaf-frame-pointer 를 사용하여 시스템 프로파일러, 디버거, 충돌 분석 도구 및 eBPF 기반 관측성(observability) 도구에서 네이티브 스택 언와인딩(unwinding)을 더 빠르고 안정적으로 만듭니다.

이 플래그는 sysconfig 를 통해 노출되므로, Python의 빌드 구성을 사용하는 도구에 의해 구축된 확장 모듈은 기본적으로 프레임 포인터를 상속받습니다. 이러한 전파는 의도적인 것입니다. 혼합된 Python/네이티브 프로파일링을 위해서는 인터프리터, 확장 모듈, 임베딩 애플리케이션 및 네이티브 라이브러리를 가로지르는 끊김 없는 프레임 포인터 체인이 필요하기 때문입니다.

중요

서드파티 빌드 백엔드 및 네이티브 빌드 시스템은 Python의 sysconfig 값을 사용할 때 이러한 플래그를 유지해야 합니다. Python의 컴파일러 플래그를 상속하지 않고 C, C++, Rust 또는 기타 네이티브 코드를 컴파일하는 빌드 시스템은 스스로 동일한 프레임 포인터 플래그를 활성화해야 합니다. 프레임 포인터 없이 구축된 단 하나의 네이티브 구성 요소가 Python 프로세스 전체의 스택 언와인딩을 망가뜨릴 수 있기 때문입니다.

(Pablo Galindo Salgado와 Savannah Ostrowski가 gh-149201 에서 기여했으며, PEP 831은 Pablo Galindo Salgado, Ken Jin, Savannah Ostrowski, 그리고 Diego Russo가 작성했습니다.)

더 보기

자세한 내용은 PEP 831 을 참조하십시오.

PEP 798: 컴프리헨션 내에서의 언 패킹

리스트, 세트, 딕셔너리 컴프리헨션뿐만 아니라 제너레이터 표현식도 이제 *** 를 사용한 언 패킹을 지원합니다. 이는 PEP 448 의 언 패킹 구문을 컴프리헨션으로 확장하여, 임의의 수의 이터러블 또는 딕셔너리를 단일 평면 구조로 결합하는 새로운 구문을 제공합니다. 이 새 구문은 중첩된 컴프리헨션, itertools.chain(), 그리고 itertools.chain.from_iterable() 의 직접적인 대안입니다. 예를 들어:

>>> lists = [[1, 2], [3, 4], [5]]
>>> [*L for L in lists]  # [x for L in lists for x in L]과 동일
[1, 2, 3, 4, 5]

>>> sets = [{1, 2}, {2, 3}, {3, 4}]
>>> {*s for s in sets}  # {x for s in sets for x in s}와 동일
{1, 2, 3, 4}

>>> dicts = [{'a': 1}, {'b': 2}, {'a': 3}]
>>> {**d for d in dicts}  # {k: v for d in dicts for k,v in d.items()}와 동일
{'a': 3, 'b': 2}

제너레이터 표현식도 이와 유사하게 언 패킹을 사용하여 여러 이터러블로부터 값을 생성할 수 있습니다:

>>> gen = (*L for L in lists)  # (x for L in lists for x in L)과 동일
>>> list(gen)
[1, 2, 3, 4, 5]

이 변경 사항은 비동기 제너레이터 표현식에도 적용되어, 예를 들어 (*a async for a in agen())(x async for a in agen() for x in a) 와 동일합니다.

더 보기

자세한 내용은 PEP 798 을 참조하십시오.

(Adam Hartz가 gh-143055 에서 기여했습니다.)

PEP 829: 패키지 시작 설정 파일

-S 가 제공되지 않을 때 site 모듈에 의해 로드되는 .pth 파일sys.path 를 확장하는 동시에, 라인이 import (그 뒤에 공백이나 탭이 오는 경우)로 시작하면 임의의 코드를 실행할 수도 있는 라인을 포함할 수 있습니다. 후자의 기능은 파이썬이 시작될 때 정확히 어떤 코드가 실행되는지 알기 어렵기 때문에 문제가 될 수 있습니다.

시작 전 실행 가능한 코드를 감사하는 기능을 개선하기 위해, 파이썬 3.15는 pkg.mod 가 주어진 호출 가능(callable)의 임포트 경로인 pkg.mod:callable 형식의 엔트리 포인트 사양을 포함하는 .start 파일 을 도입합니다. 파이썬이 시작될 때 해당 callable이 찾아져 인자 없이 호출됩니다.

.pth 파일 내의 import 라인은 조용히(silently) 지원이 중단되었습니다. 일치하는 .start 파일이 발견되면, .pth 파일의 import 라인은 무시됩니다. .pth 파일의 sys.path 확장 라인에는 변경 사항이 없습니다.

site 모듈은 또한 여러 사이트 디렉터리에 대한 시작 처리를 일괄 처리하여 모든 정적 경로 확장이 실행되기 전에 적용되도록 하는 site.StartupState 를 제공합니다. site.main() 은 일반적인 인터프리터 시작 중에 모든 시작 구성 파일을 일괄 처리하기 위해 이 클래스의 인스턴스를 암시적으로 사용합니다. 동일한 배치 처리가 필요한 호출자는 StartupState 를 직접 생성하고 addsitedir(), addusersitepackages(), 그리고 addsitepackages() 를 사용하여 처리한 후, 배치 마지막에 process() 를 한 번 호출하면 됩니다.

(Barry Warsaw가 gh-148641gh-150228 에서 기여했습니다.)

PEP 803 – 프리 스레드 빌드를 위한 안정적인 ABI

안정적인 ABI 를 목표로 하는 C 확장 프로그램은 이제 새로운 프리 스레드 빌드를 위한 안정적인 ABI (또한 abi3t 로 알려짐)를 위해 컴파일될 수 있으며, 이를 통해 CPython의 프리 스레드 빌드 와 호환됩니다. 이는 일반적으로 소스 코드에 상당한 변경을 필요로 하며, 구체적으로는 다음과 같습니다:

  • PyObject 를 인스턴스 구조의 일부로 만드는 대신, 음수(negative)인 basicsizePyObject_GetTypeData() 와 같은 PEP 697 (Python 3.12)에서 도입된 API로 전환하며;

  • PyInit_ 함수에서 이 목적을 위해 PEP 793 에 도입된 새로운 내보내기 훅인 PyModExport_* 으로 전환하며, 이때 PEP 820 에서 도입된 새로운 PySlot 구조를 사용합니다.

안정적인 ABI(Stable ABI)가 CPython이 제공하는 모든 기능을 지원하지 않는다는 점에 유의하십시오. abi3t``로 전환할 없는 확장 프로그램은 기존의 안정적 ABI(``abi3)와 프리 스레딩용 버전별 ABI(cp315t)를 각각 위해 계속 빌드해야 합니다.

프리 스레드 빌드를 위한 안정적 ABI는 일반적으로 빌드 도구(예: Setuptools, meson-python, scikit-build-core 또는 Maturin)에서 선택해야 합니다. 작성 시점에 이러한 도구들은 abi3t 를 지원하지 않았습니다. 사용하는 도구가 이 경우에 해당한다면, cp315t 를 별도로 컴파일하십시오. 빌드 도구를 사용하지 않거나(또는 그러한 도구를 작성하는 경우), Stable ABI용 컴파일 에서 논의된 것처럼 매크로 Py_TARGET_ABI3T 를 설정하여 abi3t 를 선택할 수 있습니다.

abi3t 로 전환하기 위한 실용적인 마이그레이션 가이드 를 제공합니다.

더 보기

PEP 803 을 참조하십시오.

PEP 788: 인터프리터 종료 시 C API 보호

C API에서, 인터프리터 종료 는 많은 확장 프로그램에 문제를 일으킬 수 있는데, 이는 스레드 상태를 연결(attaching) 할 때 해당 스레드가 영구적으로 멈추고 데드락 및 기타 예기치 않은 문제가 발생하기 때문입니다. 또한, 기존에는 인터프리터를 사용하기 전에 활성 상태인지 안전하게 확인하는 것이 불가능하여, 한 스레드가 다른 스레드가 연결을 시도하는 동안 동시에 인터프리터를 삭제할 때 충돌이 발생하는 경우가 있었습니다.

이제 이러한 문제를 피하기 위한 몇 가지 새로운 API 세트가 도입되었습니다:

  • 인터프리터 가드 는 인터프리터가 종료되는 것을 방지합니다.

  • 인터프리터 뷰 는 동시 종료되거나 삭제될 수 있는 인터프리터에 대한 스레드 안전한 접근을 허용합니다.

  • 새로운 API 는 종료에 대한 내장 보호 기능이 포함된 스레드 상태를 자동으로 연결하고 분리합니다.

In addition, APIs in the PyGILState family (most notably PyGILState_Ensure() and PyGILState_Release()) have been soft deprecated. There is no plan to remove them, and existing code will continue to work, but there will be no new PyGILState APIs in future versions of Python.

더 보기

PEP 788 을 참조하십시오.

(Peter Bierma가 gh-149101 에서 기여했습니다.)

에러 메시지 개선

  • 존재하지 않는 객체의 속성에 접근할 때, 해당 객체의 멤버 중 하나를 통해 유사한 속성을 사용할 수 있는 경우 이제 인터프리터가 AttributeError 예외에서 더 유용한 제안을 제공합니다.

    예를 들어, 객체가 요청된 이름을 노출하는 속성을 가지고 있는 경우, 에러 메시지는 해당 내부 속성을 통해 접근할 것을 제안합니다:

    @dataclass
    class Circle:
       radius: float
    
       @property
       def area(self) -> float:
          return pi * self.radius**2
    
    class Container:
       def __init__(self, inner: Circle) -> None:
          self.inner = inner
    
    circle = Circle(radius=4.0)
    container = Container(circle)
    print(container.area)
    

    이 코드를 실행하면 이제 더 명확한 제안이 출력됩니다:

    Traceback (most recent call last):
      File "/home/pablogsal/github/python/main/lel.py", line 42, in <module>
        print(container.area)
              ^^^^^^^^^^^^^^
    AttributeError: 'Container' object has no attribute 'area'. Did you mean '.inner.area' instead of '.area'?
    
  • 내장 타입에서 발생한 AttributeError 가 르벤슈타인 거리(Levenshtein distance)로 근접한 일치 항목이 없는 경우, 에러 메시지는 이제 다른 언어(JavaScript, Java, Ruby, C#)의 일반적인 메서드 이름 정적 테이블을 확인하여 Python에 해당하는 것을 제안합니다:

    >>> [1, 2, 3].push(4)
    Traceback (most recent call last):
    ...
    AttributeError: 'list' object has no attribute 'push'. Did you mean '.append'?
    
    >>> 'hello'.toUpperCase()
    Traceback (most recent call last):
    ...
    AttributeError: 'str' object has no attribute 'toUpperCase'. Did you mean '.upper'?
    

    Python 대응 항목이 메서드가 아닌 언어 구조인 경우, 힌트는 해당 구조를 직접 제안합니다:

    >>> {}.put("a", 1)
    Traceback (most recent call last):
    ...
    AttributeError: 'dict' object has no attribute 'put'. Use d[k] = v.
    

    불변 타입에서 가변(mutable) 메서드가 호출되는 경우, 힌트는 그에 대응하는 가변형 대안을 제안합니다:

    >>> (1, 2, 3).append(4)
    Traceback (most recent call last):
    ...
    AttributeError: 'tuple' object has no attribute 'append'. Did you mean to use a 'list' object?
    

    이러한 힌트는 내장 타입의 서브 클래스에서도 작동합니다.

    (Matt Van Horn이 gh-146406 에서 기여했습니다.)

  • 이제 인터프리터는 속성이 없어 delattr() 이 실패할 때 제안을 제공하려고 시도합니다. 존재하는 속성과 매우 유사한 이름의 속성을 사용할 경우, 인터프리터는 에러 메시지에서 올바른 속성 이름을 제안합니다. 예를 들어:

    >>> class A:
    ...     pass
    >>> a = A()
    >>> a.abcde = 1
    >>> del a.abcdf
    Traceback (most recent call last):
    ...
    AttributeError: 'A' object has no attribute 'abcdf'. Did you mean: 'abcde'?
    

    (Nikita Sobolev와 Pranjal Prajapati가 gh-136588 에서 기여했습니다.)

  • 용어를 잘못 사용하여 “argument”라고 표시된 몇몇 에러 메시지가 수정되었습니다. (Stan Ulbrych가 gh-133382 에서 기여했습니다.)

기타 언어 변경 사항

  • Python now uses UTF-8 as the default encoding, independent of the system’s environment. This means that I/O operations without an explicit encoding, for example, open('flying-circus.txt'), will use UTF-8. UTF-8 is a widely-supported Unicode character encoding that has become a de facto standard for representing text, including nearly every webpage on the internet, many common file formats, programming languages, and more.

    이 사항은 encoding 인자가 제공되지 않을 때만 적용됩니다. Python 버전 간의 최적의 호환성을 위해 항상 명시적인 encoding 인자를 제공하십시오. 선택형 인코딩 경고 를 사용하여 이 변경 사항의 영향을 받을 수 있는 코드를 식별할 수 있습니다. 특수한 encoding='locale' 인자는 현재 로캘 인코딩을 사용하며, 이는 Python 3.10부터 지원되었습니다.

    이전 동작을 유지하려면 환경 변수 PYTHONUTF8=0 또는 명령줄 옵션 -X utf8=0 를 사용하여 Python의 UTF-8 모드를 비활성화할 수 있습니다.

    더 보기

    PEP 686 을 참조하십시오.

    (Adam Turner가 gh-133711 에서 기여했으며, PEP 686은 Inada Naoki가 작성했습니다.)

  • 인터프리터 도움말(예: python --help)에 색상이 적용됩니다. 이 기능은 환경 변수 를 통해 제어할 수 있습니다. (Hugo van Kemenade가 gh-148766 에서 기여했습니다.)

  • 발생할 수 없는(unraisable) 예외가 이제 기본적으로 색상으로 강조됩니다. 이 기능은 환경 변수 를 통해 제어할 수 있습니다. (Peter Bierma가 gh-134170 에서 기여했습니다.)

  • argparse, ast, calendar, difflib, http.server, pickletools, PyREPL tab completion, python –help, sqlite3, timeit, tokenize, unraisable exceptionsstdlib (ast, compileall, doctest, gzip, inspect, json.tool, pdb, profiling.sampling, random, regrtest, sqlite3, timeit, tokenize, trace, unittest, uuid, zipapp, zipfile) CLI 도움말에서 색상을 더 지원합니다.

  • 이제 ImportErrorModuleNotFoundError__repr__() 에서 생성 시점에 키워드 인자로 전달된 경우 “name”과 “path”가 각각 name=<name> ` 및 path=<path> 로 표시됩니다. (Serhiy Storchaka, Oleg Iarygin, Yoav Nir가 :gh:`74185 에서 기여함.)

  • __dict____weakref__ 디스크립터가 이제 인터프리터당 단일 인스턴스를 사용하며, 이를 필요한 모든 타입이 공유합니다. 이는 클래스 생성 속도를 높이고 참조 사이클을 방지하는 데 도움이 됩니다. (Petr Viktorin이 gh-135228 에서 기여함.)

  • -W 옵션과 PYTHONWARNINGS 환경 변수에서 해당 필드가 슬래시(/)로 시작하고 끝나는 경우, 경고 메시지와 모듈 이름을 매칭하기 위해 리터럴 문자열 대신 정규 표현식을 지정할 수 있습니다. (Serhiy Storchaka가 gh-134716 에서 기여함.)

  • 타임스탬프 또는 타임아웃 인수를 받는 함수가 이제 정수나 부동 소수점뿐만 아니라 모든 실수(예: Decimal, Fraction)를 수용합니다. 단, 이 기능이 정밀도를 향상시키지는 않습니다. (Serhiy Storchaka가 gh-67795 에서 기여함.)

  • 복사 없이 bytearray 에서 바이트를 가져오는 bytearray.take_bytes(n=None, /) 가 추가되었습니다. 이를 통해 데이터 버퍼링, 네트워크 프로토콜 파싱, 인코딩, 디코딩 및 압축과 같이 가변 바이트 버퍼를 다룬 후 bytes 를 반환해야 하는 코드를 최적화할 수 있습니다. take_bytes() 로 최적화할 수 있는 일반적인 코드 패턴은 아래에 나열되어 있습니다.

    권장되는 최적화 리팩터링

    설명

    이전

    신규

    bytearray 를 처리한 후 bytes 반환

    def read() -> bytes:
        buffer = bytearray(1024)
        ...
        return bytes(buffer)
    
    def read() -> bytes:
        buffer = bytearray(1024)
        ...
        return buffer.take_bytes()
    

    바이트를 가져오면서 버퍼 비우기

    buffer = bytearray(1024)
    ...
    data = bytes(buffer)
    buffer.clear()
    
    buffer = bytearray(1024)
    ...
    data = buffer.take_bytes()
    

    특정 구분자로 버퍼 분할

    buffer = bytearray(b'abc\ndef')
    n = buffer.find(b'\n')
    data = bytes(buffer[:n + 1])
    del buffer[:n + 1]
    assert data == b'abc\n'
    assert buffer == bytearray(b'def')
    
    buffer = bytearray(b'abc\ndef')
    n = buffer.find(b'\n')
    data = buffer.take_bytes(n + 1)
    

    특정 구분자로 버퍼를 분할하고 구분자 이후 부분은 폐기

    buffer = bytearray(b'abc\ndef')
    n = buffer.find(b'\n')
    data = bytes(buffer[:n])
    buffer.clear()
    assert data == b'abc'
    assert len(buffer) == 0
    
    buffer = bytearray(b'abc\ndef')
    n = buffer.find(b'\n')
    buffer.resize(n)
    data = buffer.take_bytes()
    

    (Cody Maloney가 gh-139871 에서 기여함.)

  • compile(), ast.parse(), symtable.symtable(), 그리고 importlib.abc.InspectLoader.source_to_code() 와 같은 파이썬 코드 컴파일 또는 파싱 관련 기능들이 이제 모듈 이름을 매개변수로 받을 수 있습니다. 이는 모듈 이름으로 구문 경고를 명확하게 필터링 하기 위해 필요합니다. (Serhiy Storchaka가 gh-135801 에서 기여함.)

  • 모든 클래스에 대해 __dict____weakref__ __slots__ 를 정의할 수 있게 되었습니다. (Serhiy Storchaka가 gh-41779 에서 기여함.)

  • tuple 에서 파생된 클래스( collections.namedtuple() 로 생성된 클래스 포함)에 대해 모든 __slots__ 를 정의할 수 있게 되었습니다. (Serhiy Storchaka가 gh-41779 에서 기여함.)

  • slice 형이 이제 인덱싱을 지원하여 제네릭 형 이 되었습니다. (James Hilton-Balfe가 gh-128335 에서 기여함.)

  • memoryview 클래스가 이제 float complexdouble complex C 형을 지원합니다. 포맷 문자는 각각 'Zf'''Zd'' 입니다. (Victor Stinner가 gh-146151, gh-148675 에서 기여함.)

  • bytes.replace()count 인자를 키워드 인자로 사용할 수 있게 되었습니다. (Stan Ulbrych가 gh-147856 에서 기여함.)

  • 단항 마이너스 지원에 맞춰 이제 match 리터럴 패턴에서도 단항 플러스가 허용됩니다. (Bartosz Sławecki가 gh-145239 에서 기여함.)

  • 임포트 시스템이 이제 계층적 순서(하위 모듈보다 상위 패키지 우선)로 모듈별 잠금을 획득합니다. 이는 pkg/sub/__init__.pypkg.sub.mod 를 임포트할 때, pkg.subpkg.sub.mod 를 각각 임포트하는 두 스레드가 서로를 차단할 수 있었던 오랜 교착 상태 문제를 해결합니다. (Gregory P. Smith가 gh-83065 에서 기여함.)

기본 대화형 셸

새로운 모듈

math.integer

이 모듈은 정수 인수를 위한 수학 함수에 접근할 수 있도록 합니다(PEP 791). (Serhiy Storchaka가 gh-81313 에서 기여함.)

개선된 모듈

argparse

  • BooleanOptionalAction 액션이 이제 단일 대시(single-dash) 긴 옵션과 대체 접두사 문자를 지원합니다. (Serhiy Storchaka가 gh-138525 에서 기여함.)

  • argparse.ArgumentParsersuggest_on_error 매개변수 기본값을 True 로 변경했습니다. 이를 통해 오타가 발생한 인자에 대한 제안을 기본적으로 제공합니다. (Jakob Schluse가 gh-140450 에서 기여함.)

  • 색상 출력이 활성화되었을 때 인라인 코드를 강조하기 위해 ArgumentParser 설명과 에필로그 텍스트에 백틱(`) 마크업 지원을 추가했습니다. (Savannah Ostrowski가 gh-142390 에서 기여함.)

  • 백틱 마크업을 인자 help 텍스트까지 확장하고 이중 백틱(RST 인라인 리터럴 스타일) 지원을 추가했습니다. (Hugo van Kemenade가 gh-149375 에서 기여함.)

배열

  • float complexdouble complex C 타입을 지원합니다. 각각 포맷 문자는 'Zf''Zd' 입니다. (Victor Stinner가 gh-146151 \와 gh-148675 \를 통해 기능을 구현하였습니다.)

  • 반 정밀도 부동 소수점(16비트 IEEE 754 바이너리 교환 형식): 포맷 문자 'e' 를 지원합니다. (Sergey B Kirpichev가 gh-146238 \를 통해 기능을 구현하였습니다.)

  • 한 글자보다 긴 타입 코드(ZfZd)를 지원하기 위해 array.typecodes 타입을 str 에서 tuple 로 변경했습니다. (Victor Stinner가 gh-148675 에서 기여함.)

ast

  • dump()color 매개변수를 추가했습니다. True 인 경우 반환된 문자열이 ANSI 이스케이프 시퀀스를 사용하여 구문 강조됩니다. False (기본값)인 경우 색상 출력이 항상 비활성화됩니다. (Stan Ulbrych가 gh-148981 에서 기여함.)

  • 명령줄 출력이 이제 기본적으로 구문 강조됩니다. 이는 환경 변수 를 통해 제어할 수 있습니다. (Stan Ulbrych가 gh-148981 에서 기여함.)

asyncio

  • 태스크 그룹의 목적이 달성되었거나 더 이상 필요하지 않을 때 태스크 그룹을 조기에 종료할 수 있는 TaskGroup.cancel 가 추가되었습니다. 이전에는 이를 위해 커스텀 예외를 발생시키는 추가 태스크를 생성하고 종료 시 이를 무시하는 방식의 직관적이지 않은 보일러플레이트 코드가 필요했습니다. (John Belmonte가 gh-127214 에서 기여함.)

base64

binascii

calendar

  • calendar명령줄 텍스트 출력에 더 많은 색상이 적용됩니다. 이는 환경 변수 로 제어할 수 있습니다. (Hugo van Kemenade가 gh-148352 에서 기여했습니다.)

  • calendar명령줄 HTML 출력에서 이제 연도-월 옵션을 지원합니다: python -m calendar -t html 2009 06. (Pål Grønås Drange가 gh-140212 에서 기여했습니다.)

  • calendar.HTMLCalendar 클래스에 의해 생성된 달력 페이지가 이제 다크 모드를 지원하며, 접근성 향상을 위해 HTML5 표준으로 마이그레이션되었습니다. (Jiahao Li와 Hugo van Kemenade가 gh-137634 에서 기여했습니다.)

collections

  • Counter 객체 간의 대칭 차이를 계산하기 위해 collections.Counter.__xor__()collections.Counter.__ixor__() 를 추가했습니다. (Raymond Hettinger가 gh-138682 에서 기여했습니다.)

concurrent.futures

  • concurrent.futures.ProcessPoolExecutor 의 자식 프로세스가 갑자기 종료될 때 오류 보고 기능을 개선했습니다. 이제 생성된 트레이스백에 종료된 프로세스의 PID와 종료 코드가 표시됩니다. (Jonathan Berg가 gh-139486 에서 기여했습니다.)

contextlib

  • withasync with 구문과의 일관성을 위해 ExitStackcontextlib.AsyncExitStack 에서 임의의 디스크립터인 __enter__(), __exit__(), __aenter__(), __aexit__() 에 대한 지원을 추가했습니다. (Serhiy Storchaka가 gh-144386 에서 기여했습니다.)

  • ContextDecoratorAsyncContextDecorator (따라서 데코레이터로 사용되는 contextmanager()asynccontextmanager())가 이제 제너레이터 함수, 코루틴 함수, 비동기 제너레이터 함수를 감지하며 반복 또는 await 과정 중에도 컨텍스트 관리자를 유지합니다. 이전에는 제너레이터나 코루틴 객체가 생성되는 즉시 컨텍스트 관리자가 종료되었습니다. (Alex Grönholm 및 Gregory P. Smith가 gh-125862 에서 기여했습니다.)

dataclasses

  • 생성된 __init__ 메서드에 대한 어노테이션이 더 이상 내부 타입 이름을 포함하지 않습니다.

dbm

  • 삭제된 항목이 차지하던 사용되지 않는 여유 공간을 회수하기 위해 dbm.dumbdbm.sqlite3 에 새로운 reorganize() 메서드들을 추가했습니다. (Andrea Oliveri가 gh-134004 에서 기여했습니다.)

difflib

  • difflib.unified_diff() 에 선택적인 color 매개변수를 도입하여 git diff 와 유사한 색상 출력을 지원합니다. 이는 환경 변수 로 제어할 수 있습니다. (Douglas Thor가 gh-133725 에서 기여했습니다.)

  • difflib.HtmlDiff 클래스에 의해 생성되는 HTML diff 페이지의 스타일을 개선하고 출력을 HTML5 표준으로 마이그레이션했습니다. (Jiahao Li가 gh-134580 에서 기여했습니다.)

email

  • 주소 헤더에 비-ASCII 이메일 주소(mailbox)가 포함되어 EmailMessage 를 정확하게 평탄화할 수 없는 경우, 이제 이메일 제너레이터가 오류를 발생시킵니다. 이메일 주소 국제화(EAI) 지원 옵션은 EmailPolicy.utf8 에서 설명합니다. (R David Murray와 Mike Edmunds가 gh-122540 에서 기여했습니다.)

faulthandler

functools

  • singledispatchmethod() 이 이제 descriptor 가 아닌 호출 가능 객체를 지원합니다. (Serhiy Storchaka가 gh-140873 에서 기여했습니다.)

  • singledispatchmethod() 이 일반 메서드를 래핑하고 클래스 속성으로 호출될 경우, 이제 두 번째 인자를 기준으로 디스패치합니다. (Bartosz Sławecki가 gh-143535 에서 기여했습니다.)

gc

  • Python 3.14.0-3.14.4는 새로운 증분 가비지 수거기를 포함하여 출시되었습니다. 그러나 운영 환경에서 상당한 메모리 압박이 발생했다는 여러 건의 보고 에 따라 3.13 버전의 세대별 GC로 다시 되돌려졌습니다. 이는 현재 Python 3.14.5 이후 및 Python 3.15에서 사용되는 가비지 수거기입니다.

hashlib

  • 백엔드 구현이 누락되어 런타임에 작동하지 않더라도 항상 사용 가능 한 것으로 보장되는 해시 함수들이 hashlib 의 속성으로 존재하도록 보장합니다. 예를 들어, OpenSSL을 사용할 수 없고 Python이 MD5 지원 없이 빌드된 경우에도 hashlib.md5 가 더 이상 AttributeError 를 발생시키지 않습니다. (Bénédikt Tran이 gh-136929 에서 기여했습니다.)

http.client

  • HTTPConnectionHTTPSConnection 생성자에 새로운 max_response_headers 키워드 전용 매개변수가 추가되었습니다. 이 매개변수는 허용되는 응답 헤더의 기본 최대 수를 재정의합니다. (Alexander Enrique Urieles Nieto가 gh-131724 에서 기여했습니다.)

http.server

  • 명령줄 인터페이스 에서 사용하는 BaseHTTPRequestHandler 의 로깅은 기본적으로 색상이 적용됩니다. 이는 환경 변수 로 제어할 수 있습니다. (Hugo van Kemenade가 gh-146292 에서 기여했습니다.)

  • 확장자가 없는 파일에 대해 기본 Content-Type 헤더를 사용자 정의할 수 있도록 default_content_type--content-type 명령줄 옵션을 추가했습니다. (John Comeau와 Hugo van Kemenade가 gh-113471 에서 기여했습니다.)

  • HTTP 응답에서 사용자 정의 헤더를 지원하기 위해 SimpleHTTPRequestHandler 에 새로운 extra_response_headers 키워드 인수를 추가했습니다. (Anton I. Sipos가 gh-135057 에서 기여했습니다.)

  • HTTP 응답에서 사용자 정의 헤더를 지원하기 위해 python -m http.server 명령줄 인터페이스에 -H/--header 옵션을 추가했습니다. (Anton I. Sipos가 gh-135057 에서 기여했습니다.)

importlib.metadata

  • 이전에 메타데이터 파일이 포함되어 있지 않은 배포 메타데이터 디렉토리에 접근할 때, metadata()Distribution.metadata() 는 파일이 존재하지만 비어 있는 것처럼 빈 PackageMetadata 객체를 반환했습니다. 이제는 MetadataNotFound 예외가 발생합니다. 배경 및 이유에 대해서는 importlib_metadata#493 를 참조하십시오. 호환성 관련 우려에 대한 논거는 gh-143387 을 참고하십시오. (Jason R. Coombs가 기여했습니다.)

inspect

  • getdoc()inherit_class_docfallback_to_class_doc 매개변수를 추가했습니다. (Serhiy Storchaka가 gh-132686 에서 기여했습니다.)

json

  • load()loads() 함수에 array_hook 매개변수를 추가했습니다. 이를 통해 JSON 리터럴 배열 유형에 대한 콜백을 사용하여 결과로 디코딩된 객체의 Python 리스트를 사용자 정의할 수 있습니다. object_pairs_hook 매개변수에 결합된 frozendict 를 전달하고 array_hooktuple 을 전달하면 JSON 데이터를 나타내는 깊은 중첩 구조의 불변 Python 구조가 생성됩니다. (Joao S. O. Bueno가 gh-146440 에서 기여했습니다.)

locale

  • setlocale() 이 이제 @ 수정자가 포함된 언어 코드를 지원합니다. @ 수정자는 더 이상 getlocale() 에서 묵시적으로 제거되지 않고 언어 코드에 포함됩니다. (Serhiy Storchaka가 gh-137729 에서 기여했습니다.)

  • locale.getdefaultlocale() 함수의 사용 중단(deprecation)을 철회했습니다. (Victor Stinner가 gh-130796 에서 기여했습니다.)

math

mimetypes

  • 더 많은 MIME 형식을 추가했습니다. (Benedikt Johannes, Charlie Lin, Foolbar, Gil Forcada 및 John Franey가 gh-144217, gh-145720, gh-140937, gh-139959, gh-145698, gh-145718, gh-145918, 및 gh-144213 에서 기여했습니다.)

  • application/x-texinfoapplication/texinfo 로 변경했습니다. (Charlie Lin이 gh-140165 에서 기여했습니다.)

  • .ai 파일의 MIME 형을 application/pdf 로 변경했습니다. (Stan Ulbrych가 gh-141239 에서 기여했습니다.)

mmap

  • mmap.mmap 이 이제 Windows에서 trackfd 매개변수를 가집니다. 이 값이 False 인 경우, fileno 에 해당하는 파일 핸들이 복제되지 않습니다. (Serhiy Storchaka가 gh-78502 에서 기여했습니다.)

  • Linux 커널이 PR_SET_VMA_ANON_NAME 를 지원하는 경우(Linux 5.17 이상) 익명 메모리 매핑에 주석을 달 수 있는 mmap.mmap.set_name() 메서드를 추가했습니다. (Donghee Na가 gh-142419 에서 기여했습니다.)

os

  • glibc 버전 2.28 이상 및 Linux 커널 버전 4.11 이상의 환경에서 os.statx() 를 추가했습니다. (Jeffrey Bosboom과 Victor Stinner가 gh-83714 에서 기여했습니다.)

  • os.makedirs() 함수에 중간 디렉터리의 모드를 지정할 수 있는 parent_mode 매개변수가 추가되었습니다. 이를 통해 parent_mode=mode 를 전달하여 Python 3.6 이전 버전과 동일한 동작을 구현할 수 있습니다. (Zackery Spytz와 Gregory P. Smith가 gh-86533 에서 기여했습니다.)

os.path

  • realpath() 에서 마지막을 제외한 모든 경로(all-but-last) 모드를 지원합니다. (Serhiy Storchaka가 gh-71189 에서 기여했습니다.)

  • os.path.realpath()strict 매개변수가 새로운 값인 os.path.ALLOW_MISSING 을 허용합니다. 이 값을 사용하면 FileNotFoundError 를 제외한 오류는 다시 발생하며, 결과 경로가 존재하지 않을 수 있지만 심볼릭 링크는 포함되지 않습니다. (Petr Viktorin이 CVE 2025-4517 을 위해 기여했습니다.)

pdb

  • pdb 의 기본 입력 셸로 새로운 대화형 셸을 사용합니다. (Tian Gao가 gh-145379 에서 기여했습니다.)

pickle

  • 사설 메서드 및 중첩된 클래스의 피클링을 지원합니다. (Zackery Spytz와 Serhiy Storchaka가 gh-77188 에서 기여했습니다.)

pickletools

  • pickletools 명령줄 인터페이스의 출력은 기본적으로 색상이 적용됩니다. 이는 환경 변수 로 제어할 수 있습니다. (Hugo van Kemenade가 gh-149026 에서 기여함.)

pprint

  • pprint.pprint(), pprint.pformat(), pprint.pp()expand 키워드 인수를 추가했습니다. 이 값이 참이면, indent 가 제공될 때 출력 형식이 예쁘게 인쇄된 json.dumps() 와 유사하게 구성됩니다. (Stefan Todoran, Semyon Moroz 및 Hugo van Kemenade가 gh-112632 에서 기여함.)

  • pprint 에 t-string 지원을 추가했습니다. (Loïc Simon 및 Hugo van Kemenade가 gh-134551 에서 기여함.)

re

  • re.prefixmatch() 와 해당 re.Pattern.prefixmatch() 는 기존의 그리고 이제 soft deprecatedre.match()re.Pattern.match() API에 대한 대안적이고 더 명시적인 이름으로 추가되었습니다. 이는 Zen of Python의 “명시성이 암시성보다 낫다”라는 만트라를 따름으로써 match 가 의미하는 바에 대한 혼란을 줄이도록 의도된 것입니다. 대부분의 다른 언어 정규 표현식 라이브러리는 Python이 항상 search 라고 부르는 것을 나타내기 위해 match 라는 이름을 사용합니다. (Gregory P. Smith가 gh-86519 를 통해 기능 구현함.)

resource

shelve

  • shelve 에 삭제된 항목이 차지하던 공간 중 사용되지 않는 빈 공간을 회수하는 데 사용되는 새로운 reorganize() 메서드를 추가했습니다. (Andrea Oliveri가 gh-134004 에서 기여함.)

  • shelve 모듈에서 사용자 정의 직렬화 및 역직렬화 함수를 지원합니다. (Furkan Onder가 gh-99631 에서 기여함.)

socket

  • ISO-TP CAN 프로토콜을 위한 상수들을 추가했습니다. (Patrick Menschel 및 Stefan Tatschner가 gh-86819 에서 기여함.)

sqlite3

  • 명령줄 인터페이스 에 몇 가지 새로운 기능이 추가되었습니다:

    • <tab> 키를 통한 SQL 키워드 자동 완성 기능을 지원합니다. (Long Tan이 gh-133393 에서 기여함.)

    • 프롬프트, 에러 메시지, 도움말 텍스트에 색상이 적용됩니다. 이 기능은 기본적으로 활성화되어 있으며 자세한 내용은 색상 제어 를 참조하십시오. (Stan Ulbrych 및 Łukasz Langa가 gh-133461 에서 기여함.)

    • <tab> 키를 통한 Table, index, trigger, view, column, function, 그리고 schema 자동 완성 기능을 지원합니다. (Long Tan이 gh-136101 에서 기여함.)

ssl

  • ssl.HAS_PSK_TLS13 을 통해 ssl 모듈이 RFC 9258 에 설명된 TLSv1.3의 “External PSKs”를 지원하는지 여부를 나타냅니다. (Will Childs-Klein이 gh-133624 에서 기여함.)

  • SSL 키 합의에 사용되는 그룹을 관리하기 위한 새로운 메서드들을 추가했습니다.

    • ssl.SSLContext.set_groups() 는 키 합의에 허용되는 그룹을 설정하며, 기존의 ssl.SSLContext.set_ecdh_curve() 메서드를 확장합니다. 이 새로운 API는 여러 그룹을 나열할 수 있는 기능을 제공하며, ECDH 곡선 외에도 고정 필드 및 양자 내성(post-quantum) 그룹을 지원합니다. 또한 이 메서드는 TLS 핸드셰이크에서 어떤 키 공유 정보가 전송될지 제어하는 데 사용될 수도 있습니다.

    • ssl.SSLSocket.group() 은 TLS 핸드셰이크가 완료된 후 현재 연결에서 키 합의를 위해 선택된 그룹을 반환합니다. 이 호출은 OpenSSL 3.2 이상이 필요합니다.

    • ssl.SSLContext.get_groups() 는 현재 컨텍스트에 설정된 최소 및 최대 TLS 버전과 호환되는 모든 사용 가능한 키 합의 그룹 리스트를 반환합니다. 이 호출은 OpenSSL 3.5 이상이 필요합니다.

    (Ron Frederick가 gh-136306 에서 기여함.)

  • TLS 1.3 암호(cipher)를 설정하기 위한 새로운 메서드 ssl.SSLContext.set_ciphersuites() 를 추가했습니다. TLS 1.2 이하의 경우에는 계속해서 ssl.SSLContext.set_ciphers() 를 사용해야 합니다. 두 호출 모두 동일한 컨텍스트에서 수행할 수 있으며, 선택되는 암호 제품군은 연결 시 협상된 TLS 버전에 따라 결정됩니다. (Ron Frederick이 gh-137197 에서 기여함.)

  • 서명 알고리즘을 관리하기 위한 새로운 메서드들을 추가했습니다.

    • ssl.get_sigalgs() 는 사용 가능한 모든 TLS 서명 알고리즘 리스트를 반환합니다. 이 호출은 OpenSSL 3.4 이상이 필요합니다.

    • ssl.SSLContext.set_client_sigalgs() 는 인증서 기반 클라이언트 인증에 허용되는 서명 알고리즘을 설정합니다.

    • ssl.SSLContext.set_server_sigalgs() 는 서버가 TLS 핸드셰이크를 완료하는 데 허용되는 서명 알고리즘을 설정합니다.

    • ssl.SSLSocket.client_sigalg() 는 현재 연결에서 클라이언트 인증을 위해 선택된 서명 알고리즘을 반환합니다. 이 호출은 OpenSSL 3.5 이상이 필요합니다.

    • ssl.SSLSocket.server_sigalg() 는 현재 연결에서 서버가 TLS 핸드셰이크를 완료하기 위해 선택된 서명 알고리즘을 반환합니다. 이 호출은 OpenSSL 3.5 이상이 필요합니다.

    (Ron Frederick가 gh-138252 에서 기여함.)

subprocess

  • subprocess.Popen.wait(): timeoutNone 이 아니고 플랫폼에서 지원하는 경우, 프로세스 종료를 대기하기 위해 효율적인 이벤트 기반 메커니즘을 사용합니다:

    • Linux 5.3 이상 버전은 os.pidfd_open()select.poll() 을 사용합니다.

    • macOS 및 기타 BSD 변형은 select.kqueue()KQ_FILTER_PROC, KQ_NOTE_EXIT 를 사용합니다.

    • Windows는 계속해서 WaitForSingleObject 를 사용합니다(변경 없음).

    이러한 메커니즘 중 어느 것도 사용할 수 없는 경우, 이 함수는 기존의 비지 루프(비차단 호출 및 짧은 휴면)로 대체됩니다. (Giampaolo Rodola가 gh-83069 에서 기여함.)

symtable

sys

  • ABI 정보에 대한 접근을 개선하기 위해 sys.abi_info 네임스페이스를 추가했습니다. (Klaus Zimmermann이 gh-137476 에서 기여함.)

sys.monitoring

tarfile

  • data_filter() 는 이제 경로 탐색 공격을 방지하기 위해 심볼릭 링크 대상을 정규화합니다. (Petr Viktorin이 gh-127987CVE 2025-4138 에서 기여함.)

  • extractall() 은 이제 디렉터리가 삭제되었거나 다른 종류의 파일로 대체된 경우 디렉터리 속성 수정을 건너뜁니다. (Petr Viktorin이 gh-127987CVE 2024-12718 에서 기여함.)

  • extract()extractall() 은 이제 링크(하드 또는 심볼릭)를 다른 아카이브 멤버의 사본으로 대체하거나 디렉터리 속성을 수정할 때 추출 필터를 (재)적용합니다. 전자의 경우 새로운 예외인 LinkFallbackError 가 발생합니다. (Petr Viktorin이 CVE 2025-4330CVE 2024-12718 을 위해 기여함.)

  • extract()extractall() 은 이제 errorlevel() 이 0일 때 거부된 멤버를 추출하지 않습니다. (Matt Prodani와 Petr Viktorin이 gh-112887CVE 2025-4435 에서 기여함.)

  • extract()extractall() 은 이제 윈도우에서 손상된 링크 생성을 방지하기 위해 심볼릭 링크 대상의 슬래시를 백슬래시로 대체합니다. (Christoph Walcher가 gh-57911 에서 기여함.)

threading

timeit

  • timeit 명령줄 인터페이스의 출력은 기본적으로 색상이 적용됩니다. 이는 환경 변수 로 제어할 수 있습니다. (Hugo van Kemenade가 gh-146609 에서 기여함.)

  • 명령줄 인터페이스에서 이제 기본적으로 오류 트레이스백에 색상이 입혀집니다. 이는 환경 변수 로 제어할 수 있습니다. (Yi Hong이 gh-139374 에서 기여함.)

  • timeit.Timer.autorange() 의 목표 시간을 설정 가능하게 만들고 명령줄 인터페이스에 --target-time 옵션을 추가했습니다. (Alessandro Cucci 및 Miikka Koskinen이 gh-80642 에서 기여함.)

tkinter

  • tkinter.Text.search() 메서드가 두 가지 추가 인수를 지원합니다: 줄 경계를 넘어 검색을 계속할 수 있게 하는 nolinestop 과 지정된 범위 내로만 검색을 제한하는 strictlimits 입니다. (Rihaan Meher가 gh-130848 에서 기여함.)

  • 새로운 tkinter.Text.search_all() 메서드가 도입되었습니다. 이 메서드는 Tcl의 -all-overlap 옵션을 사용하여 패턴의 모든 일치 항목을 검색할 수 있게 합니다. (Rihaan Meher가 gh-130848 에서 기여함.)

  • 구식 이름의 Tk 명령을 사용하는 *_slaves() 메서드 대신, 새로운 이름(Tk 8.6에서 도입)의 Tk 명령을 사용하는 pack_content(), place_content(), 그리고 grid_content() 메서드를 추가했습니다. (Serhiy Storchaka가 gh-143754 에서 기여함.)

  • Tk 가상 이벤트를 위한 user_dataEnter, Leave, FocusIn, FocusOut, ConfigureRequest 이벤트를 위한 detail 속성을 Event 에 추가했습니다. (Matthias Kievernagel 및 Serhriy Storchaka가 gh-47655 에서 기여함.)

토큰화(tokenize)

tomllib

  • tomllib 모듈이 이제 TOML 1.1.0을 지원합니다. 이는 하위 호환성을 유지하는 업데이트로, 모든 유효한 TOML 1.0.0 문서가 동일하게 파싱됩니다.

    official TOML changelog 에 따른 변경 사항은 다음과 같습니다.

    • 인라인 테이블에서 줄바꿈과 뒤따르는 쉼표(trailing commas)를 허용합니다.

      이전에는 인라인 테이블이 단일 행에 있어야 했으며 뒤에 쉼표를 붙여 끝낼 수 없었습니다. 이제 이 제한이 완화되어 다음과 같은 구문이 유효합니다.

      tbl = {
         key      = "a string",
         moar-tbl =  {
            key = 1,
         },
      }
      
    • 255 미만의 코드 포인트에 대해 기본 문자열에 \xHH 표기법을 추가하고, 이스케이프 문자에 대한 \e 이스케이프를 추가했습니다.

      null = "null byte: \x00; letter a: \x61"
      csi = "\e["
      
    • datetime 및 시간 값의 초(seconds)가 이제 선택 사항입니다. 다음 항목들이 유효해집니다.

      dt = 2010-02-03 14:15
      t  = 14:15
      

    (Taneli Hukkinen이 gh-142956 에서 기여했습니다.)

types

타이핑

  • PEP 747: 타입 표현 자체인 값을 주석 처리하기 위한 새로운 특수 폼인 TypeForm 을 추가합니다. TypeForm[T] 는 “T (또는 T 에 할당 가능한 형식)를 설명하는 타입 폼 객체”를 의미합니다. 실행 시(runtime) TypeForm(x) 은 단순히 x 를 반환하며, 이는 동작을 변경하지 않으면서 타입 폼 값에 대한 명시적 주석을 가능하게 합니다.

    이는 사용자 지정 타입 표현식(예: int, str | None, TypedDict 클래스 또는 list[int])을 허용하는 라이브러리가 정확한 서명을 노출하도록 돕습니다:

    from typing import Any, TypeForm
    
    def cast[T](typ: TypeForm[T], value: Any) -> T: ...
    

    (Jelle Zijlstra가 gh-145033 에서 기여했습니다.)

  • PEP 728: TypedDict 에서 closedextra_items 클래스 인수를 지원합니다. closed TypedDict 는 클래스 본문에 명시된 것 이외의 추가 키를 허용하지 않으며, extra_items 가 포함된 TypedDict 는 값이 지정된 유형인 임의의 추가 항목을 허용합니다. (Angela Liss가 gh-137840 에서 기여했습니다.)

  • class ExtraTypeVars(P1[S], Protocol[T, T2]): ... 와 같은 코드는 이제 TypeError 를 발생시킵니다. 이유는 SProtocol 매개변수에 나열되지 않았기 때문입니다. (Nikita Sobolev가 gh-137191 에서 기여했습니다.)

  • class B2(A[T2], Protocol[T1, T2]): ... 와 같은 코드는 이제 타입 매개변수 순서를 올바르게 처리합니다. 이전에는 런타임에서 잘못 추론되어 (T2, T1) 로 인식되었으나, 현재는 (T1, T2) 로 처리됩니다. (Nikita Sobolev가 gh-137191 에서 기여했습니다.)

  • PEP 800: 클래스를 분리된 베이스(disjoint base)로 표시하는 새로운 데코레이터인 @typing.disjoint_base 를 추가합니다. 이는 주로 형 검사기가 내장 함수나 컴파일된 확장 프로그램에서 정의된 타입의 런타임 의미를 정확하게 반영할 수 있도록 하기 위한 고급 기능입니다. 클래스 C 가 분리된 베이스인 경우, 해당 클래스의 자식 클래스는 C 의 부모 또는 자식 클래스가 아닌 다른 분리된 베이스로부터 상속받을 수 없습니다. (Jelle Zijlstra가 gh-148639 에서 기여했습니다.)

  • TypeVarTuple`이 이제 ``bound`, covariant, contravariant, infer_variance 키워드 인수를 받아들여 TypeVar ``bound` 의미는 사양에서 여전히 정의되지 않은 상태로 유지됩니다.

unicodedata

unittest

urllib.parse

  • urlsplit(), urlparse(), urldefrag() 함수에 missing_as_none 매개변수를 추가했습니다. 또한 urlunsplit()urlunparse() 함수에 keep_empty 매개변수를 추가했습니다. 이를 통해 빈 URI 구성 요소와 정의되지 않은 요소를 구분하고, 빈 구성 요소를 유지할 수 있습니다. (Serhriy Storchaka가 gh-67041 에서 기여했습니다.)

venv

  • POSIX 플랫폼에서 가상 환경을 생성할 때, lib64 -> lib 심볼릭 링크를 사용하는 대신 필요할 경우 platlib 디렉터리를 생성합니다. 이는 sys.platlibdirlib 과 같지 않은 플랫폼에서 가상 환경의 purelib와 platlib이 더 이상 동일한 lib 디렉터리를 공유하지 않음을 의미합니다. (Rui Xi가 gh-133951 에서 기여했습니다.)

warnings

  • module 인자가 전달되지 않을 때 warnings.warn_explicit() 의 모듈별 필터링을 개선했습니다. 이제 경고 필터 내의 모듈 정규식을 .py 가 제거된 파일 이름뿐만 아니라, 파일의 다른 부모 디렉터리부터 생성된 모듈 이름(Windows에서 /__init__.py, .py, .pyw 제외)에 대해서도 테스트합니다. (Serhiy Storchaka가 gh-135801 에서 기여했습니다.)

wave

  • wave`에 IEEE 부동 소수점 WAVE 오디오(``WAVE_FORMAT_IEEE_FLOAT`) 지원을 추가했습니다.

  • 명시적인 프레임 형식 처리를 위해 wave.Wave_read.getformat(), wave.Wave_write.getformat(), 및 wave.Wave_write.setformat() 을 추가했습니다.

  • wave.Wave_write.setparams`는 하위 호환성을 위해 ``format``을 포함하는 7개 항목의 튜플과 6개 항목의 튜플(기본값은 ``WAVE_FORMAT_PCM`())을 모두 수용합니다.

  • WAVE_FORMAT_IEEE_FLOAT 출력에 이제 비 PCM(non-PCM) WAVE 형식이 요구하는 fact 청크가 포함됩니다.

(Lionel Koenig와 Michiel W. Beijen이 gh-60729 에서 기여했습니다.)

webbrowser

  • macOS에서 새 webbrowser.MacOS 클래스는 이제 osascript 를 통해 AppleScript를 구성하고 실행하는 대신 /usr/bin/open 을 통해 URL을 엽니다. 기본 브라우저는 plistlib 을 사용하여 LaunchServices 기본 설정 파일에서 감지하며, 신규 설치 시에는 com.apple.Safari 가 대체값으로 사용됩니다. HTTP(S)가 아닌 URL의 경우 OS 파일 처리기 대신 open -b <bundle-id> 를 사용하여 브라우저를 통해 경로를 전달함으로써 파일 삽입 공격을 방지합니다. (Jeff Lyon이 gh-137586 에서 기여했습니다.)

xml

  • 문자열이 XML에서 요소 또는 속성 이름으로 사용될 수 있는지 확인하는 xml.is_valid_name() 함수를 추가했습니다. (Serhiy Storchaka가 gh-139489 에서 기여했습니다.)

  • 문자열이 XML 문서에서 사용될 수 있는지 확인하는 xml.is_valid_text() 함수를 추가했습니다. (Serhiy Storchaka가 gh-139489 에서 기여했습니다.)

xml.parsers.expat

zlib

  • adler32_combine() 을 통해 두 개의 Adler-32 체크섬을 결합할 수 있게 되었습니다. (Callum Attryde와 Bénédikt Tran이 gh-134635 에서 기여했습니다.)

  • crc32_combine() 을 통해 두 개의 CRC-32 체크섬을 결합할 수 있게 되었습니다. (Bénédikt Tran이 gh-134635 에서 기여했습니다.)

최적화

base64 및 binascii

  • 단순한 CPU 파이프라이닝 최적화 덕분에 CPython의 기본 base64 구현체가 이제 2배 더 빠르게 인코딩되고 3배 더 빠르게 디코딩됩니다. (Gregory P. Smith와 Serhiy Storchaka가 gh-143262 에서 기여했습니다.)

  • Ascii85, Base85 및 Z85 인코딩 구현이 C로 재작성되었습니다. 이제 인코딩과 디코딩 속도가 20배 빨라졌으며 메모리 소비량은 20배 줄어들었습니다. (James Seo와 Serhiy Storchaka가 gh-101178 에서 기여했습니다.)

  • Base32 구현이 C로 재작성되었습니다. 이제 인코딩과 디코딩 속도가 20배 더 빠릅니다. (James Seo가 gh-146192 에서 기여했습니다.)

csv

  • csv.Sniffer.sniff() 의 구분 기호 감지 속도가 최대 1.6배 향상되었습니다. (Maurycy Pawłowski-Wieroński가 gh-137628 에서 기여했습니다.)

JIT 컴파일러 업그레이드

X86-64 리눅스에서 모든 최적화가 활성화된 표준 CPython 인터프리터 대비 JIT에 대한 pyperformance 벤치마크 스위트 결과로 8-9%의 기하 평균 성능 향상을 보입니다. AArch64 macOS에서는 모든 최적화가 활성화된 꼬리 호출 인터프리터 <whatsnew314-tail-call-interpreter>`에 비해 JIT이 12-13% 빠른 속도를 보여줍니다. JIT 빌드와 비(非)JIT 빌드의 속도 향상은 x86-64 리눅스와 AArch64 macOS 시스템에서 대략 15%의 저하부터 100% 이상의 속도 향상에 이르기까지 다양합니다 (``unpack_sequence` 마이크로벤치마크 제외).

주의

이 결과는 아직 확정된 것이 아닙니다.

JIT의 주요 업그레이드 사항은 다음과 같습니다.

  • LLVM 21 빌드 시 의존성 추가

  • 새로운 추적 프런트엔드

  • JIT 내 기본 레지스터 할당

  • 추가적인 JIT 최적화

  • GDB 및 GNU backtrace() 언와인딩 지원

  • 더 나은 머신 코드 생성

LLVM 21 빌드 시 의존성 추가

이제 JIT 컴파일러는 빌드 타임 스텐실 생성을 위해 LLVM 21을 사용합니다. 항상 그렇듯이, LLVM은 JIT를 활성화한 상태로 CPython을 빌드할 때만 필요하며, Python을 실행하는 최종 사용자에게는 LLVM 설치가 필요하지 않습니다. 모든 지원 플랫폼에 대한 LLVM 설치 방법은 JIT 컴파일러 문서 <https://github.com/python/cpython/blob/main/Tools/jit/README.md>`__에서 확인할 수 있습니다. (Savannah Ostrowski가 :gh:`140973 을 통해 기여함.)

새로운 트레이싱 프런트엔드

JIT 컴파일러가 이제 Python 3.14보다 훨씬 더 많은 바이트코드 연산과 제어 흐름을 지원하여, 더 다양한 종류의 코드에서 속도 향상을 제공합니다. 예를 들어, 간단한 Python 객체 생성이 이제 3.15 JIT 컴파일러에 의해 인식됩니다. 오버로드된 연산 및 제너레이터도 부분적으로 지원됩니다. 이는 이전 구현처럼 코드를 통한 경로를 추정하는 대신 실제 실행 경로를 기록하는 대대적으로 개편된 JIT 트레이싱 프런트엔드를 통해 가능해졌습니다. (Ken Jin이 gh-139109 를 통해 기여함. Mark Shannon이 gh-141703 을 통해 Windows 지원을 추가함.)

JIT 내 기본 레지스터 할당

JIT 컴파일러 옵티마이저에 기본적인 형태의 레지스터 할당이 추가되었습니다. 이를 통해 JIT 컴파일러는 특정 스택 작업을 완전히 피하고 대신 레지스터에서 작동할 수 있습니다. 결과적으로 JIT가 메모리 읽기 및 쓰기를 피함으로써 더 효율적인 트레이스를 생성할 수 있게 됩니다. (Mark Shannon이 gh-135379 를 통해 기여함.)

추가적인 JIT 최적화

더 많은 상수 전파 <https://en.wikipedia.org/wiki/Constant_folding>`__이 수행됩니다. 이는 JIT 컴파일러가 특정 사용자 코드가 상수를 결과로 낸다는 것을 감지할 때, 해당 코드를 JIT가 간소화할 수 있음을 의미합니다. (Ken Jin과 Savannah Ostrowski가 :gh:`132732 를 통해 기여함.)

안전한 경우라면 어디서든 가능할 때 참조 횟수 를 생략합니다. 이는 일반적으로 Python 내 대부분 연산의 비용을 줄여줍니다. (Ken Jin, Donghee Na, Zheao Li, Hai Zhu, Savannah Ostrowski, Reiden Ong, Noam Cohen, Tomas Roun, PuQing, Cajetan Rodrigues, 및 Sacul이 gh-134584 를 통해 기여함.)

객체에 대한 고유 참조를 추적함으로써, JIT 옵티마이저는 이제 참조 횟수 업데이트를 제거하고 int 및 float에 대해 인플레이스(in-place) 연산을 수행할 수 있습니다. (Reiden Ong과 Pieter Eendebak이 gh-143414gh-146306 을 통해 기여함.)

JIT 옵티마이저가 이제 3.14보다 훨씬 더 많은 연산을 지원합니다. (Kumar Aditya, Ken Jin, Jiahao Li, 및 Sacul이 gh-131798 을 통해 기여함.)

GDB 및 GNU backtrace() 언와인딩 지원

JIT 컴파일러는 이제 지원되는 Linux ELF 플랫폼에서 생성된 머신 코드에 대한 언와인드 정보를 GDB 인터페이스에 공개합니다. libgcc 프레임 등록을 사용할 수 있는 경우, 동일한 언와인드 정보가 GNU backtrace() 스택 워커를 위해서도 등록됩니다. 이를 통해 이러한 메커니즘을 사용하는 네이티브 디버거, 크래시 핸들러 및 진단 도구가 생성된 코드에서 멈추는 대신 JIT 프레임을 통과하여 언와인드를 수행할 수 있습니다. (Diego Russo와 Pablo Galindo Salgado가 gh-146071gh-149104 를 통해 기여함.)

더 나은 머신 코드 생성

JIT 컴파일러의 머신 코드 생성기가 이제 x86-64 및 AArch64 macOS와 Linux 대상을 위해 더 나은 머신 코드를 생성합니다. 일반적으로 사용자는 3.14에 비해 생성된 머신 코드의 메모리 사용량이 줄어들고 더욱 효율적인 머신 코드를 경험하게 될 것입니다. (Brandt Bucher가 gh-136528gh-135905 를 통해 기여함. AArch64 구현은 Mark Shannon이 gh-139855 를 통해 기여함. AArch64에 대한 추가 최적화는 Mark Shannon과 Diego Russo가 gh-140683gh-142305 를 통해 기여함.)

유지 관리성

JIT 옵티마이저의 연산이 단순화되었습니다. 이는 JIT 데이터 구조의 리팩터링을 통해 가능해졌습니다. (Zhongtian Zheng가 gh-148211 을, Hai Zhu가 gh-143421 을 통해 기여함.)

제거됨

ast

  • AST 노드 의 생성자는 이제 필수 인자가 생략되거나 AST 노드의 필드에 매핑되지 않는 키워드 인자가 전달될 때 TypeError 를 발생시킵니다. 이러한 경우들은 이전까지 Python 3.13부터 DeprecationWarning 을 발생시켰습니다. (Brian Schubert와 Jelle Zijlstra가 gh-137600gh-105858 을 통해 기여함.)

collections.abc

  • collections.abc.ByteString`이(가) ``collections.abc.__all__``에서 제거되었습니다. :class:!collections.abc.ByteString`은 파이썬 3.12부터 사용 지원 중단(deprecated)되었으며, 파이썬 3.17에서 제거될 예정입니다.

ctypes

  • 파이썬 3.13부터 사용 지원 중단된 문서화되지 않은 기능인 ctypes.SetPointerType() 을 제거했습니다. (Bénédikt Tran이 gh-133866 을 통해 기여함.)

  • numpy와의 호환성을 위해 c_float_complex, c_double_complex, 그리고 c_longdouble_complex_type_F, D, G 에서 Zf, Zd, Zg 로 변경했습니다. (Victor Stinner가 gh-148675 를 통해 기여함.)

datetime

  • strptime() 은 이제 형식 문자열에 연도 지시어 없이 %d (월의 일)가 포함된 경우 ValueError 를 발생시킵니다. 이는 파이썬 3.13부터 사용 지원 중단된 사항입니다. (Stan Ulbrych와 Gregory P. Smith가 gh-70647 을 통해 기여함.)

glob

  • 파이썬 3.13부터 사용 지원 중단된 문서화되지 않은 기능인 glob.glob0()glob.glob1() 을 제거했습니다. 대신 glob.glob() 을 사용하고 root_dir 인자에 디렉터리를 전달하십시오. (Barney Gale이 gh-137466 를 통해 기여함.)

http.server

  • python -m http.server 명령 줄 인터페이스에서 CGIHTTPRequestHandler 클래스와 --cgi 플래그를 제거했습니다. 이들은 파이썬 3.13에서 사용 지원 중단되었습니다. (Bénédikt Tran이 gh-133810 을 통해 기여함.)

importlib.resources

pathlib

  • pathlib.Path.mkdir() 은 이제 parents=True 일 때 중간 디렉터리에 대한 모드를 지정할 수 있는 parent_mode 매개 변수를 가집니다. (Gregory P. Smith가 gh-86533 을 통해 기여함.)

  • 사용 지원 중단된 pathlib.PurePath.is_reserved() 를 제거했습니다. 윈도우에서 예약된 경로를 확인하려면 os.path.isreserved() 를 사용하십시오. (Nikita Sobolev가 gh-133875 를 통해 기여함.)

플랫폼

  • 파이썬 3.13부터 사용 지원 중단된 platform.java_ver() 기능을 제거했습니다. (Alexey Makridenko가 gh-133604 를 통해 기여함.)

sre_*

  • sre_compile, sre_constants, sre_parse 모듈을 제거했습니다. (Stan Ulbrych가 gh-135994 를 통해 기여함.)

sysconfig

threading

  • RLock 객체의 C 구현에서 임의의 위치 또는 키워드 인자에 대한 지원을 제거했습니다. 이는 파이썬 3.14에서 사용 지원 중단되었습니다. (Bénédikt Tran이 gh-134087 을 통해 기여함.)

types

  • types.CodeType 에서 파이썬 3.12부터 PEP 626 에 의해 사용 지원 중단된 codeobject.co_lnotab 을 제거했습니다. (Nikita Sobolev가 gh-134690 를 통해 기여함.)

타이핑

  • typing.ByteString`이(가) ``typing.__all__``에서 제거되었습니다. :class:!typing.ByteString`은 파이썬 3.9부터 사용 지원 중단되었으며 파이썬 3.17에서 제거될 예정입니다.

  • NamedTuple 클래스를 생성할 때 사용하는 문서화되지 않은 키워드 인자 구문(예: Point = NamedTuple("Point", x=int, y=int))이 더 이상 지원되지 않습니다. 대신 클래스 기반 구문이나 함수형 구문을 사용하십시오. (Bénédikt Tran이 gh-133817 를 통해 기여함.)

  • 필드가 없는 TypedDict 타입을 구성하기 위해 TD = TypedDict("TD") 또는 TD = TypedDict("TD", None) 을 사용하는 방식이 더 이상 지원되지 않습니다. 대신 class TD(TypedDict): pass 또는 TD = TypedDict("TD", {}) 를 사용하십시오. (Bénédikt Tran이 gh-133823 를 통해 기여함.)

  • 사용 지원 중단된 @typing.no_type_check_decorator 가 제거되었습니다. (Nikita Sobolev가 gh-133601 을 통해 기여함.)

wave

  • 파이썬 3.13부터 사용 지원 중단된 Wave_readWave_write 클래스의 getmark(), setmark(), getmarkers() 메서드를 제거했습니다. (Bénédikt Tran이 gh-133873 를 통해 기여함.)

zipimport

폐지됨

새로운 폐지 사항

  • ast

    • 추상적인 AST 노드(예를 들어 ast.AST 또는 ast.expr)의 인스턴스를 생성하는 것은 폐지되었으며 파이썬 3.20에서 오류를 발생시킵니다.

      (Brian Schubert이 gh-116021 을 통해 기여함.)

  • base64:

    • b64decode()urlsafe_b64decode() 에서 대안 알파벳과 함께 +/ 문자를 허용하는 기능이 더 이상 지원되지 않습니다. 향후 파이썬 버전에서는 엄격 모드(strict mode)에서 오류가 발생하고, 비엄격 모드(non-strict mode)에서 무시될 것입니다. (Serhiy Storchaka가 gh-125346 을 통해 기여함.)

  • CLI:

    • -b-bb 명령 줄 옵션을 사용 지원 중단하고 파이썬 3.17에서 아무 작업도 수행하지 않도록(no-op) 예정했습니다. 이 옵션들은 주로 파이썬 2에서 3으로 전환할 때의 도우미 역할을 했습니다. 파이썬 3.17부터는 이러한 경우에 BytesWarning 을 발생시키지 않으므로, 대신 타입 검사기를 사용하십시오.

      (Nikita Sobolev가 gh-136355 를 통해 기여함.)

  • collections.abc

    • 다음 문구들은 이제 실행 시점에 DeprecationWarning 을 발생시킵니다:

      • from collections.abc import ByteString

      • import collections.abc; collections.abc.ByteString.

      collections.abc.ByteString 이(가) 하위 클래스로 생성되거나 isinstance() 또는 issubclass() 의 두 번째 인자로 사용되는 경우에는 이미 DeprecationWarning 이 발생했으나, 단순히 가져오거나 collections.abc 모듈에서 접근하는 경우에는 이전에 경고가 발생하지 않았습니다.

  • hashlib:

    • new() 과 같은 해시 함수 생성자나 md5(), sha256() 과 같은 직접적인 해시 명칭 생성자의 경우, 선택적 초기 데이터 매개 변수를 다양한 hashlib 구현에서 data= 또는 string= 라는 키워드 인자로 전달할 수도 있습니다.

      string 키워드 인자 이름에 대한 지원이 중단되었으며 파이썬 3.19에서 제거될 예정입니다. 최대의 하위 호환성을 위해 초기 데이터를 위치 인자로 전달하는 것을 권장합니다.

      (Bénédikt Tran이 gh-134978 을 통해 기여함.)

  • http.cookies:

  • imaplib:

    • IMAP4.file 를 변경하는 것은 이제 폐지되었으며 Python 3.19에서 삭제될 예정입니다. 이 속성은 현재 사용되지 않으며, 값을 변경해도 현재 파일이 명시적으로 닫히지 않습니다.

  • re:

    • re.match()re.Pattern.match`는 명확한 이름을 가진 새로운 :func:`re.prefixmatch()re.Pattern.prefixmatch() API를 지원하기 위해 현재 soft deprecated 상태입니다. 이는 파이썬의 철학인 “명시적인 것이 암묵적인 것보다 낫다”라는 원칙에 따라 *match*가 의미하는 바에 대한 혼동을 줄이기 위해 도입되었습니다. 대부분의 다른 언어 정규표현식 라이브러리들은 파이썬이 항상 *search*라고 불러온 것을 의미하기 위해 *match*라는 이름의 API를 사용합니다.

      오래된 match() 이름을 삭제할 계획은 없습니다. 이 이름은 30년 이상 코드에서 사용되어 왔기 때문입니다. 이전 버전의 Python을 지원하는 코드는 계속해서 match() 를 사용해야 하며, 새 코드는 prefixmatch() 를 사용하는 것이 좋습니다. 자세한 내용은 prefixmatch() 대 match() 를 참조하십시오.

      (Gregory P. Smith가 gh-86519 에서, Hugo van Kemenade가 gh-148100 에서 기여함.)

  • struct:

    • 필수 인자 없이 Struct.__new__() 를 호출하는 것은 이제 폐지되었으며 Python 3.20에서 제거될 예정입니다. 초기화된 Struct 객체에 대해 __init__() 메서드를 호출하는 것도 폐지되었으며 Python 3.20에서 제거될 예정입니다.

      (Sergey B Kirpichev와 Serhiy Storchaka가 gh-143715 을 통해 기여하였습니다.)

    • 'F''D' 타입 코드를 사용하는 것은 이제 두 글자 형태인 'Zf''Zd' 를 대신하여 약하게 폐지 되었습니다. (Sergey B Kirpichev가 gh-121249 에서 기여함.)

  • typing:

    • 다음 문구들은 이제 실행 시점에 DeprecationWarning 을 발생시킵니다:

      • from typing import ByteString

      • import typing; typing.ByteString.

      typing.ByteString 이 하위 클래스로 상속되거나 isinstance() 또는 issubclass() 의 두 번째 인자로 사용되는 경우 DeprecationWarning s가 이미 발생했으나, 단순히 typing 모듈에서 임포트되거나 접근될 때는 경고가 발생하지 않았습니다.

  • webbrowser:

    • webbrowser.MacOSXOSAScriptwebbrowser.MacOS 를 대신하여 폐지되었으며 Python 3.17에서 제거될 예정입니다. (Jeff Lyon이 gh-137586 에서 기여함.)

  • __version__

Python 3.16에서 제거 예정

  • 임포트 시스템:

    • __spec__.loader 를 설정하지 않으면서 모듈에 __loader__ 를 설정하는 방식은 이제 폐지되었습니다. 파이썬 3.16부터는 임포트 시스템이나 표준 라이브러리에서 __loader__ 를 설정하거나 고려하지 않습니다.

    • __spec__.parent 를 설정하지 않으면서 모듈에 __package__ 를 설정하는 방식은 이제 폐지되었습니다. 파이썬 3.16부터는 임포트 시스템이나 표준 라이브러리에서 __package__ 를 고려하지 않습니다. (gh-97879)

  • 내장된 libmpdec 복사본.

  • array:

    • 'u' 형식 코드(wchar_t)는 Python 3.3부터 문서에서, Python 3.13부터는 실행 시(runtime) 사용 중단되었습니다. 유니코드 문자의 경우 대신 'w' 형식 코드(Py_UCS4)를 사용하십시오.

  • asyncio:

    • asyncio.iscoroutinefunction() 은 폐지되었으며 파이썬 3.16에서 제거될 예정입니다. 대신 inspect.iscoroutinefunction() 을 사용하십시오. (Jiahao Li와 Kumar Aditya가 gh-122875 를 통해 기능을 구현하였습니다.)

    • asyncio 정책 시스템은 폐지되었으며 파이썬 3.16에서 제거될 예정입니다. 특히 다음 클래스와 함수들이 폐지되었습니다:

      • asyncio.AbstractEventLoopPolicy

      • asyncio.DefaultEventLoopPolicy

      • asyncio.WindowsSelectorEventLoopPolicy

      • asyncio.WindowsProactorEventLoopPolicy

      • asyncio.get_event_loop_policy()

      • asyncio.set_event_loop_policy()

      원하는 이벤트 루프 구현을 사용하려면 loop_factory 가 포함된 asyncio.run() 또는 asyncio.Runner 를 사용해야 합니다.

      예를 들어, 윈도우에서 asyncio.SelectorEventLoop 을 사용하려면:

      import asyncio
      
      async def main():
          ...
      
      asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
      

      (Kumar Aditya가 gh-127949 를 통해 기능을 구현하였습니다.)

  • builtins:

    • 불리언 타입에 대한 비트 반전인 ~True 또는 ~False``는 결과가 직관적이지 않고 놀라운 값(-2`` 및 -1)을 생성하므로 파이썬 3.12부터 폐지되었습니다. 불리언의 논리적 부정은 대신 not x``를 사용하십시오. 기초 정수의 비트 반전이 필요한 드문 경우에는 명시적으로 `int`로 변환(``~int(x))하십시오.

  • functools:

    • 파이썬 3.14부터 functools.reduce() 의 파이썬 구현을 호출할 때 function 또는 sequence 를 키워드 인자로 사용하는 방식이 사용 지원 중단되었습니다.

  • logging:

    • strm 인자를 사용하는 커스텀 로깅 처리자에 대한 지원은 폐지되었으며 파이썬 3.16에서 제거될 예정입니다. 대신 stream 인자를 사용하여 처리기를 정의하십시오. (Mariusz Felisiak가 gh-115032 를 통해 기능을 구현하였습니다.)

  • mimetypes:

    • mimetypes.MimeTypes.add_type() 에서 유효한 확장자는 ‘.’로 시작하거나 비어 있어야 합니다. 점이 없는 확장자는 폐지되었으며 파이썬 3.16에서 ValueError 를 발생시킵니다. (Hugo van Kemenade가 gh-75223 를 통해 기능을 구현하였습니다.)

  • shutil:

    • ExecError 예외는 파이썬 3.14부터 폐지되었습니다. 이는 파이썬 3.4 이후 shutil 의 어떤 함수에서도 사용되지 않았으며, 현재 RuntimeError 의 별칭입니다.

  • symtable:

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

  • sys:

    • _enablelegacywindowsfsencoding() 함수는 파이썬 3.13부터 사용 지원 중단되었습니다. 대신 PYTHONLEGACYWINDOWSFSENCODING 환경 변수를 사용하십시오.

  • sysconfig:

    • sysconfig.expand_makefile_vars() 함수는 파이썬 3.14부터 폐지되었습니다. 대신 sysconfig.get_paths`의 ``vars`() 인수를 사용하십시오.

  • tarfile:

    • 문서화되지 않았고 사용되지도 않는 TarInfo.tarfile 어트리뷰트는 Python 3.13부터 폐지되었습니다.

파이썬 3.17에서 삭제 예정

  • datetime:

    • 연도 정보 없이 %e (월의 일수)를 포함하는 포맷 문자열을 사용하는 strptime() 호출이 파이썬 3.15부터 사용 중단되었습니다. (Stan Ulbrych가 gh-70647 에서 기여)

  • collections.abc:

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

      런타임에 objbuffer protocol 을 구현하는지 확인하려면 isinstance(obj, collections.abc.Buffer) 를 사용하십시오. 타입 어노테이션에 사용할 때는 Buffer 를 사용하거나 코드에서 지원하는 유형을 명시적으로 지정하는 유니온(예: bytes | bytearray | memoryview)을 사용하십시오.

      ByteString 은 원래 bytesbytearray 모두의 상위 타입 역할을 하는 추상 클래스로 설계되었습니다. 하지만 이 ABC에 메서드가 전혀 없었기 때문에, 어떤 객체가 ByteString 의 인스턴스라는 사실이 객체에 대한 유용한 정보를 제공하지 못했습니다. 또한 memoryview 와 같은 다른 일반적인 버퍼 타입들도 런타임이나 정적 타입 검사에서 ByteString 의 하위 유형으로 인식되지 않았습니다.

      자세한 내용은 PEP 688 을 참조하십시오. (Shantanu Jain이 gh-91896 에서 제안함.)

  • encodings:

    • encodings.normalize_encoding() 에 ASCII가 아닌 인코딩 이름을 전달하는 것은 사용 중단되었으며 파이썬 3.17에서 제거될 예정입니다. (Stan Ulbrych가 gh-136702 에서 기여)

  • webbrowser:

    • webbrowser.MacOSXOSAScript`은 :class:!webbrowser.MacOS`로 대체됨에 따라 사용 중단되었습니다. (gh-137586)

  • typing:

    • 파이썬 3.14 이전에는 구식 유니온(union)이 비공개 클래스 typing._UnionGenericAlias 를 사용하여 구현되었습니다. 이 클래스는 구현에 더 이상 필요하지 않지만, 하위 호환성을 위해 유지되고 있으며 파이썬 3.17에서 제거될 예정입니다. 사용자는 비공개 구현 세부 사항에 의존하는 대신 typing.get_origin()typing.get_args() 와 같은 문서화된 인트로스펙션 도우미를 사용해야 합니다.

    • typing.ByteString 은 파이썬 3.9부터 사용 중단되었으며 파이썬 3.17에서 제거될 예정입니다.

      런타임에 objbuffer protocol 을 구현하는지 확인하려면 isinstance(obj, collections.abc.Buffer) 를 사용하십시오. 타입 어노테이션에 사용할 때는 Buffer 를 사용하거나 코드에서 지원하는 유형을 명시적으로 지정하는 유니온(예: bytes | bytearray | memoryview)을 사용하십시오.

      ByteString 은 원래 bytesbytearray 모두의 상위 타입 역할을 하는 추상 클래스로 설계되었습니다. 하지만 이 ABC에 메서드가 전혀 없었기 때문에, 어떤 객체가 ByteString 의 인스턴스라는 사실이 객체에 대한 유용한 정보를 제공하지 못했습니다. 또한 memoryview 와 같은 다른 일반적인 버퍼 타입들도 런타임이나 정적 타입 검사에서 ByteString 의 하위 유형으로 인식되지 않았습니다.

      자세한 내용은 PEP 688 을 참조하십시오. (Shantanu Jain이 gh-91896 에서 제안함.)

  • tkinter:

    • tkinter.Variable`의 메서드인 :meth:!trace_variable`, trace`(:meth:()!trace_variable`의 별칭), trace_vdelete(), 그리고 trace_vinfo`는 Python 3.14부터 폐지되었으며 Python 3.17에서 제거될 예정입니다. 대신 :meth:()!trace_add`, trace_remove(), 및 :meth:`!trace_info`를 사용하십시오. (Serhiy Storchaka가 :gh:`120220`에서 기여함.)

파이썬 3.18에서 제거 예정

  • 파일 디스크립터가 필요한 경우 더 이상 불리언(boolean) 값을 허용하지 않습니다. (Serhiy Storchaka가 gh-82626 을 통해 기여함.)

  • decimal:

    • 표준이 아니며 문서화되지 않은 Decimal 형식 지정자 'N'decimal 모듈의 C 구현에서만 지원되며, 파이썬 3.13부터 사용이 권장되지 않습니다. (Serhiy Storchaka가 gh-89902 를 통해 기여함.)

  • PEP 829 에 의해 정의된 기능 중단 사항:

    • name.pth 파일의 import 라인은 무시됩니다.

    (Barry Warsaw가 gh-148641 을 통해 기여함.)

Python 3.19에서 삭제 예정

  • ctypes:

    • 윈도우가 아닌 플랫폼에서 :attr:`~ctypes.Structure._layout_`은 설정하지 않고 :attr:`~ctypes.Structure._pack_`를 설정하여 MSVC 호환 구조체 레이아웃으로 암시적으로 전환합니다.

  • hashlib:

    • new() 와 같은 해시 함수 생성자나 md5(), sha256() 과 같은 직접적인 해시 명칭을 가진 생성자에서, 선택적 초기 데이터 매개변수로 다양한 hashlib 구현체에 따라 data= 또는 string= 라는 이름의 키워드 인수를 전달할 수 있습니다.

      string 키워드 인자 명칭에 대한 지원은 현재 사용 중단(deprecated)되었으며, Python 3.19에서 삭제될 예정입니다.

      Python 3.13 이전에는 해시 함수 백엔드 구현에 따라 string 키워드 매개변수가 올바르게 지원되지 않았습니다. 최대한의 하위 호환성을 위해 초기 데이터를 위치 인자로 전달하는 것을 권장합니다.

  • http.cookies:

  • imaplib:

    • IMAP4.file 를 변경하는 것은 이제 폐지되었으며 파이썬 3.19에서 제거될 예정입니다. 이 속성은 현재 사용되지 않으며 값을 변경해도 현재 파일이 자동으로 닫히지 않습니다.

      파이썬 3.14 이전에는 이 속성이 IMAP4`의 해당 ``read()`readline() 메서드를 구현하는 데 사용되었으나, 그 이후로는 더 이상 그렇지 않습니다.

Python 3.20에서 삭제 예정

  • format 인자 없이 struct.Struct`의 ``__new__()` 메서드를 호출하는 것은 권장되지 않으며(deprecated), Python 3.20에서 삭제될 예정입니다. 초기화된 Struct 객체에 대해 __init__() 메서드를 호출하는 것도 권장되지 않으며, Python 3.20에서 삭제될 예정입니다.

    (Sergey B Kirpichev와 Serhiy Storchaka가 gh-143715 을 통해 기여하였습니다.)

  • 이 표준 라이브러리 모듈에서 __version__, versionVERSION 속성은 폐지되었으며 파이썬 3.20에서 제거될 예정입니다. 대신 sys.version_info 를 사용하십시오.

    (Hugo van Kemenade와 Stan Ulbrych가 gh-76007 을 통해 기여하였습니다.)

  • PEP 829 에 의해 정의된 기능 중단 사항:

    • name.pth 파일에서 발견된 import 라인에 대해 경고가 생성됩니다.

    • name.pth 파일은 더 이상 기본적으로 로케일 인코딩으로 디코딩되지 않습니다. 이 파일들은 반드시 utf-8-sig 로 인코딩되어야 합니다.

    (Barry Warsaw가 gh-148641 을 통해 기여함.)

  • ast:

    • 추상적인 AST 노드(예를 들어 ast.AST 또는 ast.expr)의 인스턴스를 생성하는 것은 폐지되었으며 파이썬 3.20에서 오류를 발생시킵니다.

Python 3.21에서 삭제 예정

  • abc

  • ast:

    • slice, Index, ExtSlice, Suite, Param, AugLoadAugStore 클래스는 Python 3.21에서 제거됩니다. 이 타입들은 파서에 의해 생성되지 않으며 코드 생성기에서도 수용되지 않습니다.

    • ast.Tuple``의 ``dims 속성은 Python 3.21에서 제거됩니다. 대신 ast.Tuple.elts 속성을 사용하십시오.

향후 버전에서 제거 예정

다음 API는 향후 제거될 예정이나, 현재로서는 구체적인 제거 날짜가 정해지지 않았습니다.

  • argparse:

    • 인수 그룹 중첩 및 상호 배타적인 그룹을 중첩하는 기능은 더 이상 권장되지 않습니다(deprecated).

    • add_argument_group() 에 문서화되지 않은 키워드 인자 prefix_chars 를 전달하는 것은 이제 권장되지 않습니다.

    • argparse.FileType 유형 변환기가 더 이상 권장되지 않습니다.

  • builtins:

    • 제너레이터: throw(type, exc, tb)athrow(type, exc, tb) 시그니처가 더 이상 권장되지 않습니다. 대신 단일 인자 시그니처인 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, isor 중 하나가 오면 구문 경고가 발생합니다. 향후 릴리스에서는 이를 구문 오류로 변경할 예정입니다. (gh-87999)

    • 비정수형(non-int)을 반환하는 __index__()__int__() 메서드에 대한 지원이 중단됩니다. 이 메서드들은 이제 반드시 int 의 엄격한 하위 클래스 인스턴스를 반환해야 합니다.

    • float`의 엄격한 하위 클래스를 반환하는 ``__float__()` 메서드에 대한 지원이 중단됩니다. 이 메서드는 이제 반드시 float 인스턴스를 반환해야 합니다.

    • complex`의 엄격한 하위 클래스를 반환하는 ``__complex__()` 메서드에 대한 지원이 중단됩니다. 이 메서드는 이제 반드시 complex 인스턴스를 반환해야 합니다.

    • complex() 생성자에서 복소수를 real 또는 imag 인자로 전달하는 것은 이제 권장되지 않습니다. 복소수는 단일 위치 인자로만 전달해야 합니다. (Serhiy Storchaka가 gh-109218 을 통해 구현함.)

  • calendar: calendar.Januarycalendar.February 상수는 더 이상 사용되지 않으며(deprecated), 대신 calendar.JANUARYcalendar.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(): 대신 datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC) 를 사용하십시오.

  • gettext: 복수형 값은 정수여야 합니다.

  • importlib:

    • cache_from_source()debug_override 매개 변수가 폐지되었습니다. 대신 optimization 매개 변수를 사용하십시오.

  • importlib.metadata:

    • EntryPoints 튜플 인터페이스.

    • 반환 값에 대한 묵시적 None.

  • logging: warn() 메서드는 Python 3.3부터 폐지되었으며, 대신 warning() 을 사용하십시오.

  • mailbox: StringIO 입력 및 텍스트 모드 사용이 폐지되었으며, 대신 BytesIO 및 바이너리 모드를 사용하십시오.

  • os: 다중 스레드 프로세스에서 :func:`os.register_at_fork`를 호출하는 행위가 폐지되었습니다.

  • os.path: os.path.commonprefix() 는 폐지되었으며, 경로 접두사에는 os.path.commonpath() 를 사용하십시오. os.path.commonprefix() 함수는 이름과 모듈이 오해의 소지가 있어 폐지됩니다. 이 함수는 경로 조작 관련 모듈에 포함되어 있음에도 불구하고 경로 접두사로 사용하는 것이 안전하지 않으며, 이 함수를 사용하면 파이썬 프로그램에 실수로 경로 탐색 취약점이 도입되기 쉽습니다.

  • pydoc.ErrorDuringImport: exc_info 매개 변수에 대한 튜플 값 사용이 폐지되었으며, 예외 인스턴스를 사용하십시오.

  • re: 정규 표현식에서 수치 그룹 참조 및 그룹 이름에 대해 더 엄격한 규칙이 적용됩니다. 이제 숫자 참조로는 ASCII 숫자의 시퀀스만 허용됩니다. 바이트 패턴 및 치환 문자열의 그룹 이름은 이제 ASCII 문자, 숫자, 밑줄(_)만 포함할 수 있습니다. (Serhriy Storchaka가 gh-91760 을 통해 구현함.)

  • shutil: rmtree()onerror 매개 변수가 Python 3.12에서 폐지되었으며, 대신 onexc 매개 변수를 사용하십시오.

  • ssl 옵션 및 프로토콜:

    • 인자 없이 사용되는 ssl.SSLContext 가 폐지되었습니다.

    • ssl.SSLContext: set_npn_protocols()selected_npn_protocol() 이 폐지되었으며, 대신 ALPN을 사용하십시오.

    • ssl.OP_NO_SSL* 옵션

    • ssl.OP_NO_TLS* 옵션

    • 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 메서드:

  • typing.Text (gh-92332).

  • 내부 클래스 typing._UnionGenericAlias 는 더 이상 typing.Union 을 구현하는 데 사용되지 않습니다. 이 비공개 클래스를 사용하는 사용자와의 호환성을 유지하기 위해 최소 Python 3.17까지 호환성 쉼(shim)이 제공됩니다. (Jelle Zijlstra가 gh-105499 에서 기여함.)

  • unittest.IsolatedAsyncioTestCase: 테스트 케이스에서 None 이 아닌 값을 반환하는 기능은 이제 폐지되었습니다.

  • urllib.parse 폐지된 함수: 대신 urlparse() 사용

    • splitattr()

    • splithost()

    • splitnport()

    • splitpasswd()

    • splitport()

    • splitquery()

    • splittag()

    • splittype()

    • splituser()

    • splitvalue()

    • to_bytes()

  • wsgiref: SimpleHandler.stdout.write() 는 부분적인 쓰기(partial write)를 수행해서는 안 됩니다.

  • xml.etree.ElementTree: 대신 명시적인 ``len(elem)` 또는 elem is not None 테스트를 사용하는 것을 권장합니다.

  • sys._clear_type_cache() 는 폐지되었으므로 대신 sys._clear_internal_caches() 를 사용하십시오.

약한 폐지(Soft deprecations)

soft deprecated API를 제거할 계획은 없습니다.

  • re.match()re.Pattern.match`는 명확한 이름을 가진 새로운 :func:`re.prefixmatch()re.Pattern.prefixmatch() API를 지원하기 위해 현재 soft deprecated 상태입니다. 이는 파이썬의 철학인 “명시적인 것이 암묵적인 것보다 낫다”라는 원칙에 따라 *match*가 의미하는 바에 대한 혼동을 줄이기 위해 도입되었습니다. 대부분의 다른 언어 정규표현식 라이브러리들은 파이썬이 항상 *search*라고 불러온 것을 의미하기 위해 *match*라는 이름의 API를 사용합니다.

    오래된 match() 이름을 삭제할 계획은 없습니다. 이 이름은 30년 이상 코드에서 사용되어 왔기 때문입니다. 이전 버전의 Python을 지원하는 코드는 계속해서 match() 를 사용해야 하며, 새 코드는 prefixmatch() 를 사용하는 것이 좋습니다. 자세한 내용은 prefixmatch() 대 match() 를 참조하십시오.

    (Gregory P. Smith가 gh-86519 에서, Hugo van Kemenade가 gh-148100 에서 기여함.)

  • struct 모듈의 'F''D' 포맷 타입 코드를 사용하는 것은 이제 두 글자 형태인 'Zf'``’Zd’``를 대신하여 약하게 폐지 되었습니다. (Sergey B Kirpichev가 :gh:`121249`에서 기여함.)

C API 변경

새 기능

변경된 C API

제거된 C API

  • 더 이상 사용되지 않는 PyUnicode 함수를 제거합니다.

    • PyUnicode_AsDecodedObject(): 대신 PyCodec_Decode() 를 사용하십시오.

    • PyUnicode_AsDecodedUnicode(): 대신 PyCodec_Decode() 를 사용하십시오. 단, 일부 코덱(예: “base64”)은 str 이 아닌 bytes 와 같은 다른 타입을 반환할 수 있음에 유의하십시오.

    • PyUnicode_AsEncodedObject(): 대신 PyCodec_Encode() 를 사용하십시오.

    • PyUnicode_AsEncodedUnicode(): 대신 PyCodec_Encode() 를 사용하십시오. 단, 일부 코덱(예: “base64”)은 bytes 가 아닌 str 과 같은 다른 타입을 반환할 수 있음에 유의하십시오.

    (Stan Ulbrych가 gh-133612 에서 기여하였습니다.)

  • PyImport_ImportModuleNoBlock(): PyImport_ImportModule() 의 더 이상 사용되지 않는 별칭입니다. (Bénédikt Tran이 gh-133644 에서 기여하였습니다.)

  • PyWeakref_GetObject() and PyWeakref_GET_OBJECT: use PyWeakref_GetRef() instead. The pythoncapi-compat project can be used to get PyWeakref_GetRef() on Python 3.12 and older. (Contributed by Bénédikt Tran in gh-133644.)

  • 더 이상 사용되지 않는 PySys_ResetWarnOptions() 를 제거합니다. 대신 sys.warnoptionswarnings.filters 를 초기하십시오.

    (Nikita Sobolev가 gh-138886 에서 기여하였습니다.)

The following functions are removed in favor of PyConfig_Get(). The pythoncapi-compat project can be used to get PyConfig_Get() on Python 3.13 and older.

폐지된 C API

빌드 변경

  • 번들된 libmpdec 라이브러리로의 암시적 폴백을 제거했습니다. 이제 이 기능은 --with-system-libmpdecno 로 설정하거나 --without-system-libmpdec 를 사용하여 명시적으로 활성화해야 합니다. (Sergey B Kirpichev가 gh-115119 에서 기여하였습니다.)

  • The new configure option --with-missing-stdlib-config=FILE allows distributors to pass a JSON configuration file containing custom error messages for standard library modules that are missing or packaged separately. (Contributed by Stan Ulbrych and Petr Viktorin in gh-139707.)

  • 새로운 구성 옵션인 --with-pymalloc-hugepagespymalloc 영역에 대한 큰 페이지(huge page) 지원을 활성화합니다. 이 기능이 활성화되면 영역 크기가 2 MiB로 증가하며, 할당 시 Linux에서는 MAP_HUGETLB 를, Windows에서는 MEM_LARGE_PAGES 를 사용하고 자동으로 일반 페이지로 전환됩니다. Windows에서 사용하려면 build.bat --pymalloc-hugepages 를 실행하십시오. 실행 시에는 PYTHON_PYMALLOC_HUGEPAGES 환경 변수를 1 로 설정하여 큰 페이지를 명시적으로 활성화해야 합니다.

  • Linux 커널이 PR_SET_VMA_ANON_NAME 를 지원하는 경우(Linux 5.17 이상) 익명 mmap 사용에 대한 주석이 지원됩니다. 해당 기능을 지원하는 커널에서 Python 실행 시 -X dev 를 전달하거나, 또는 Python을 디버그 모드 로 빌드한 경우 /proc/<pid>/maps 에서 주석을 확인할 수 있습니다. (Donghee Na가 gh-141770 에서 기여하였습니다.)

  • CPython은 이제 기본적으로 프레임 포인터가 활성화된 상태로 빌드됩니다 (PEP 831). 비활성화하려면 --without-frame-pointers 를 전달하십시오.

    사용자 정의 빌드 시스템으로 구축된 C 확장 및 네이티브 라이브러리의 제작자는 언와인드 체인이 유지되는지 확인해야 합니다. 이는 일반적으로 CFLAGS``에 ``-fno-omit-frame-pointer 및 유사한 플래그를 추가하여 수행됩니다. Python이 사용하는 특정 플래그는 --without-frame-pointers 문서를 참조하십시오.

    (Pablo Galindo Salgado와 Savannah Ostrowski가 gh-149201 에서 기여하였습니다.)

  • 64-bit builds using Visual Studio 2026 (MSVC 18) may now use the new tail-calling interpreter. Results on Visual Studio 18.1.1 report between 15-20% speedup on the geometric mean of pyperformance on Windows x86-64 over the switch-case interpreter on an AMD Ryzen 7 5800X. We have observed speedups ranging from 14% for large pure-Python libraries to 40% for long-running small pure-Python scripts on Windows. This was made possible by a new feature introduced in MSVC 18, which the official Windows 64-bit binaries on python.org now use. (Contributed by Chris Eibl, Ken Jin, and Brandt Bucher in gh-143068. Special thanks to Steve Dower, and the MSVC team including Hulon Jenkins.)

Python 3.15로의 이식

이 섹션은 이전에 설명된 변경 사항과 코드를 수정해야 할 수도 있는 기타 버그 수정을 나열합니다.

  • sqlite3.Connection API가 정리되었습니다.

    (Serhiy Storchaka가 gh-133595 에서 기여하였습니다.)

  • resource.RLIM_INFINITY 는 이제 항상 양수입니다. 이전 값에 해당하는 음의 정수 값(플랫폼에 따라 -1 또는 -3 등)을 resource.setrlimit()resource.prlimit() 에 전달하는 방식은 이제 폐지되었습니다. (Serhiy Storchaka가 gh-137044 에서 기여하였습니다.)

  • mmap.mmap.resize() 가 기초 시스템 호출(syscall)을 지원하지 않는 플랫폼에서 SystemError 를 발생시키는 대신 해당 기능이 제거되었습니다.

  • 파일을 연 후 닫히지 않은 xml.etree.ElementTree.iterparse() 이터레이터에 대해 리소스 경고가 발생합니다. 이를 닫으려면 close() 메서드나 contextlib.closing() 컨텍스트 매니저를 사용하십시오. (Osama Abdelkader와 Serhiy Storchaka가 gh-140601 에서 기여하였습니다.)

  • argparse.ArgumentParser.add_argument() 에 짧은 옵션과 한 개의 대시가 포함된 긴 옵션이 함께 전달되는 경우, dest 는 이제 한 개 대시의 긴 옵션으로부터 추론됩니다. 예를 들어, add_argument('-f', '-foo') 에서 dest 는 이제 'f' 대신 'foo' 가 됩니다. 이전 동작을 유지하려면 명시적인 dest 인자를 전달하십시오. (Serhiy Storchaka가 gh-138697 에서 기여하였습니다.)

  • base64.urlsafe_b64decode() 에서 입력 값에 대한 패딩(padding)이 더 이상 요구되지 않습니다. 패딩을 필수 사항으로 하려면 새 인자인 padded=True 를 전달하거나, (이 방식은 이전 파이썬 버전에서도 작동합니다) altchars=b'-_' 인자와 함께 base64.b64decode() 를 사용하십시오. (Serhiy Storchaka가 gh-73613 에서 기여하였습니다.)

  • unittest.TestCase.assertWarns()unittest.TestCase.assertWarnsRegex() 가 지정된 카테고리나 정규식에 맞지 않는 경고를 더 이상 묵음 처리하지 않으므로, 이전에는 가려졌던 일부 경고가 테스트 중에 노출될 수 있습니다. 이러한 경고를 무시하려면 경고 필터를 사용하거나, 이를 캡처하고 확인하려면 추가적인 assertWarns*() 를 사용하십시오. (Serhiy Storchaka가 gh-143231 에서 기여하였습니다.)

분실물 보관소