파이썬 3.14의 새로운 기능에 대해 알아봅시다¶
- 편집자:
Adam Turner and Hugo van Kemenade
해당하는 문서는 파이썬 3.13과 비교했을 때 파이썬 3.14의 새로운 기능들을 설명합니다. 파이썬 3.14는 2025년 10월 7일에 배포되었습니다. 배포와 관련된 전체 기록을 열람하시려면, 자세한 내용은 변경 로그를 확인해주시기를 부탁드립니다.
더 보기
PEP 745 – 파이썬 3.14 릴리스 일정
요약 – 주요 업데이트¶
파이썬 3.14는 파이썬 프로그래밍 언어의 최신 안정 릴리스로, 언어, 구현, 표준 라이브러리에 걸쳐 다양한 변경 사항을 포함합니다. 가장 큰 변경 사항에는 템플릿 문자열 리터럴, 어노테이션의 지연 평가, 표준 라이브러리에서의 서브인터프리터 지원이 포함됩니다.
라이브러리 변경 사항에는 asyncio에서의 인트로스펙션 기능의 대폭적인 개선, 새로운 compression.zstd 모듈을 통한 Zstandard 지원, REPL에서의 문법 강조, 일반적인 폐지 예정 및 제거, 사용자 친화성과 정확성 개선이 포함됩니다.
해당하는 업데이트 문서는 모든 새로운 기능에 대한 완전한 명세를 제공하려는 것이 아니라, 편리한 개요를 제공합니다. 자세한 내용은 라이브러리 참조 및 언어 참조 같은 설명서를 참조해주시기를 부탁드립니다. 변경 사항의 전체 구현과 설계 근거를 이해하려면 특정 새 기능에 대한 PEP를 참조해주시기를 부탁드립니다. 다만 PEP는 통상적으로 해당하는 기능이 구현되고 난 이후에는 최신 상태로 유지되지 않습니다. 이전 파이썬 버전에서 업그레이드(혹은 이식)하는 방법은 Porting to Python 3.14를 참조해주시기를 부탁드립니다.
인터프리터의 개선:
표준 라이브러리의 중요한 개선 사항들:
기본 대화형 셸의 문법 강조 및 여러 표준 라이브러리 CLI의 색상 출력
C API 개선 사항들:
플랫폼 지원:
PEP 776: Emscripten은 이제 공식 지원 플랫폼이며, 3단계 (Tier 3)에 해당합니다.
릴리스 변경 사항들:
새로운 기능들¶
PEP 649 및 PEP 749: 어노테이션의 지연 평가¶
함수, 클래스, 모듈의 어노테이션은 더 이상 즉시 평가되지 않습니다. 대신 어노테이션은 특수 목적의 어노테이트 함수에 저장되며, 필요한 경우에만 평가됩니다 (from __future__ import annotations가 사용되는 경우는 제외합니다).
해당하는 변경 사항은 대부분의 상황에서 파이썬 어노테이션의 성능과 사용성을 향상시키도록 설계되었습니다. 어노테이션을 정의할 때의 런타임 비용이 최소화되지만, 런타임에 어노테이션을 인트로스펙션하는 것은 여전히 가능합니다. 어노테이션에 전방 참조가 포함된 경우 더 이상 어노테이션을 문자열로 감싸주시지 않으셔도 됩니다.
새로운 annotationlib 모듈은 지연된 어노테이션을 검사하기 위한 도구를 제공합니다. 어노테이션은 (이전 파이썬 버전의 동작과 비슷하게 어노테이션을 런타임 값으로 평가하는) VALUE 형식, (정의되지 않은 이름을 특수 마커로 대체하는) FORWARDREF 형식, (어노테이션을 문자열로 반환하는) STRING 형식으로 평가할 수 있습니다.
다음과 같은 예시는 이러한 형식들이 어떻게 동작하는지 보여줍니다:
>>> from annotationlib import get_annotations, Format
>>> def func(arg: Undefined):
... pass
>>> get_annotations(func, format=Format.VALUE)
Traceback (most recent call last):
...
NameError: name 'Undefined' is not defined
>>> get_annotations(func, format=Format.FORWARDREF)
{'arg': ForwardRef('Undefined', owner=<function func at 0x...>)}
>>> get_annotations(func, format=Format.STRING)
{'arg': 'Undefined'}
이러한 변경으로 인해 필요할 수 있는 수정 사항에 대한 지침은 (코드) 이식 섹션에 포함되어 있습니다. 대부분의 경우에는 코드가 그대로 계속 작동합니다.
(Jelle Zijlstra가 PEP 749 및 gh-119180를 통해 기능을 구현하였습니다. PEP 649는 Larry Hastings가 작성하였습니다.)
PEP 734: 표준 라이브러리의 여러 인터프리터¶
CPython 런타임은 동일한 프로세스에서 여러 파이썬 복사본을 동시에 실행하는 것을 지원하며, 20년 넘게 이를 지원해 왔습니다. 이러한 별도의 복사본 각각을 ‘인터프리터’라고 부릅니다. 그러나 이 기능은 이전까지 C-API를 통해서만 사용할 수 있었습니다.
해당하는 제한 사항은 파이썬 3.14에서 새로운 concurrent.interpreters 모듈을 통해 제거되었습니다.
여러 인터프리터를 사용하는 것이 상당한 이점을 갖는 주목할 만한 이유는 적어도 두 가지가 있습니다:
파이썬에 새로 도입되는, 사람이 다루기 쉬운 동시성 모델을 지원합니다
진정한 다중 코어 병렬성
일부 사용 사례에서는 소프트웨어의 동시성이 효율성을 높이고 고수준에서 설계를 단순화할 수 있습니다. 동시에, 가장 단순한 동시성을 제외한 모든 동시성을 구현하고 유지하는 일은 인간의 두뇌에는 종종 어려운 과제입니다. 이는 모든 메모리가 모든 스레드 사이에서 공유되는 일반 스레드(예를 들어, threading)에 특히 적용됩니다.
여러 격리된 인터프리터를 사용하면 Smalltalk, Erlang, Haskell, Go와 같은 다른 프로그래밍 언어에서 성공을 거둔 통신 순차 프로세스(Communicating Sequential Processes, CSP)나 액터 모델 같은 동시성 모델 부류를 활용할 수 있습니다. 여러 인터프리터는 스레드와 비슷하지만 공유는 선택적으로 활성화하는 방식이라고 생각할 수 있습니다.
다중 코어 병렬성과 관련해서는, 파이썬 3.12부터 인터프리터가 서로 충분히 격리되어 병렬로 사용할 수 있게 되었습니다(PEP 684를 참조해주시기를 부탁드립니다). 이는 GIL로 인해 제한되었던 파이썬의 다양한 CPU 집약적 사용 사례를 열어 줍니다.
여러개의 인터프리터를 사용하는 것은 multiprocessing과 여러 면에서 비슷합니다. 둘 다 기본적으로 공유하지 않으면서 병렬로 실행할 수 있는 격리된 논리적 “프로세스”를 제공하기 때문입니다. 그러나 여러개의 인터프리터를 사용할 때 응용 프로그램은 더 적은 시스템 자원을 사용하고 더 효율적으로 동작합니다(동일한 프로세스 안에 머무르기 때문입니다). 여러개의 인터프리터는 프로세스의 격리성과 스레드의 효율성을 함께 갖는 것으로 생각할 수 있습니다.
해당하는 기능은 수십 년 동안 존재해 왔지만, 낮은 인지도와 표준 라이브러리 모듈의 부재로 인해 여러 인터프리터는 널리 사용되지 않았습니다. 따라서 현재 몇 가지 주목할 만한 제한 사항이 있으며, 이제 해당하는 기능이 주류로 편입되고 있으므로 이와 같은 제한 사항은 크게 개선될 것으로 예상됩니다.
현재의 제한 사항들:
각각의 인터프리터를 시작하는 과정은 아직 최적화되지 않았습니다
각각의 인터프리터가 필요한 것보다 더 많은 메모리를 사용합니다(인터프리터 간 광범위한 내부 공유 작업은 계속 진행 중입니다).
인터프리터 간에 객체나 다른 데이터를 실제로 공유하기 위한 옵션은 (
memoryview를 제외하고) 아직 많지 않습니다PyPI의 많은 제삼자 확장 모듈은 아직 여러 인터프리터와 호환되지 않습니다(모든 표준 라이브러리 확장 모듈은 호환됩니다)
현재로서는 여러 격리된 인터프리터를 사용하는 응용 프로그램을 작성하는 접근 방식이 파이썬 사용자에게 대체로 익숙하지 않습니다
이러한 제한 사항의 영향은 향후 CPython 개선 사항, 인터프리터가 사용되는 방식, 그리고 커뮤니티가 PyPI 패키지를 통해 해결하는 내용에 따라 달라질 것입니다. 사용 사례에 따라서는 제한 사항이 큰 영향을 미치지 않을 수 있으므로, 직접 시도해보시기를 권장드립니다!
또한 향후 CPython 릴리스에서는 오버헤드를 줄이거나 제거하고 PyPI에 두기에는 덜 적절한 유틸리티를 제공할 것입니다. 그동안 대부분의 제한 사항은 확장 모듈을 통해서도 해결할 수 있습니다. 즉, PyPI 패키지는 3.14의 공백을 메울 수 있으며, 인터프리터가 마침내 제대로 격리되어 GIL을 공유하지 않게 된 3.12까지도 지원 범위를 넓힐 수 있습니다. 마찬가지로 인터프리터 위에 고수준 추상화를 제공하는 PyPI 라이브러리들이 등장할 것으로 예상됩니다.
확장 모듈과 관련해서는 일부 PyPI 프로젝트뿐만 아니라 Cython, pybind11, nanobind, PyO3와 같은 도구를 업데이트하는 작업이 진행 중입니다. 확장 모듈을 격리하는 절차는 Isolating Extension Modules에 설명되어 있습니다. 모듈을 격리하는 일은 자유 스레딩을 지원하는 데 필요한 사항과 많은 부분이 겹치므로, 해당 분야에서 커뮤니티가 진행 중인 작업은 여러 인터프리터 지원을 가속화하는 데 도움이 될 것입니다.
3.14에 추가된 또 다른 항목: concurrent.futures.InterpreterPoolExecutor.
(Eric Snow가 gh-134939를 통해 기능을 구현하였습니다.)
더 보기
PEP 750: 템플릿 문자열 리터럴¶
템플릿 문자열은 커스텀 문자열 처리를 위한 새로운 메커니즘입니다. 템플릿 문자열은 f-문자열의 익숙한 문법을 공유하지만, f-문자열과 달리 단순한 str 대신 문자열의 정적 부분과 보간된 부분을 나타내는 객체를 반환합니다.
t-문자열을 작성하려면 ‘f’ 대신 ‘t’ 접두사를 사용합니다:
>>> variety = 'Stilton'
>>> template = t'Try some {variety} cheese!'
>>> type(template)
<class 'string.templatelib.Template'>
Template 객체는 문자열의 정적 부분과 (중괄호 안의) 보간된 부분이 결합되기 전에 그 부분들에 액세스할 수 있도록 합니다. 각 부분에 순서대로 액세스하려면 Template 인스턴스를 이터레이션합니다:
>>> list(template)
['Try some ', Interpolation('Stilton', 'variety', None, ''), ' cheese!']
Template 인스턴스를 처리하는 코드는 작성하거나 호출하기 쉽습니다. 예를 들어, 정적 부분은 소문자로 렌더링하고 Interpolation 인스턴스는 대문자로 렌더링하는 함수는 다음과 같습니다:
from string.templatelib import Interpolation
def lower_upper(template):
"""Render static parts lowercase and interpolations uppercase."""
parts = []
for part in template:
if isinstance(part, Interpolation):
parts.append(str(part.value).upper())
else:
parts.append(part.lower())
return ''.join(parts)
name = 'Wenslydale'
template = t'Mister {name}'
assert lower_upper(template) == 'mister WENSLYDALE'
Template 인스턴스는 런타임에 정적 문자열과 보간을 구분하므로 사용자 입력을 정제하는 데 유용할 수 있습니다. HTML에서 사용자 입력을 이스케이프하는 html() 함수를 작성하는 일은 독자에게 남겨진 연습 과제로 봐주시기를 부탁드립니다! 템플릿 처리 코드는 향상된 유연성을 제공할 수 있습니다. 예를 들어, 더 고급의 html() 함수는 템플릿 안에서 HTML 어트리뷰트가 담긴 dict 객체를 직접 받을 수 있습니다:
attributes = {'src': 'limburger.jpg', 'alt': 'lovely cheese'}
template = t'<img {attributes}>'
assert html(template) == '<img src="limburger.jpg" alt="lovely cheese" />'
물론 템플릿 처리 코드는 문자열과 유사한 결과를 반환할 필요가 없습니다. 훨씬 더 고급의 html() 함수는 DOM과 유사한 구조를 나타내는 커스텀 형을 반환할 수 있습니다.
t-문자열을 사용하면 개발자는 SQL을 정제하고, 안전한 셸 연산을 만들고, 로깅을 개선하고, 웹 개발의 현대적인 아이디어(HTML, CSS 등)를 다루며, 가벼운 커스텀 비즈니스 DSL을 구현하는 시스템을 작성할 수 있습니다.
(Jim Baker, Guido van Rossum, Paul Everitt, Koudai Aono, Lysandros Nikolaou, Dave Peck, Adam Turner, Jelle Zijlstra, Bénédikt Tran, 그리고 Pablo Galindo Salgado가 gh-132661를 통해 기능을 구현하였습니다.)
더 보기
PEP 768: 안전한 외부 디버거 인터페이스¶
파이썬 3.14는 디버거와 프로파일러가 실행 중인 파이썬 프로세스에 중단이나 재시작 없이 안전하게 연결할 수 있는 오버헤드가 없는 디버깅 인터페이스를 도입합니다. 이는 파이썬의 디버깅 기능을 크게 개선한 것으로, 안전하지 않은 대안이 더 이상 필요하지 않다는 의미입니다.
해당하는 새로운 인터페이스는 인터프리터의 정상 실행 경로를 수정하지 않고, 런타임에 어떠한 오버헤드도 추가하지 않으면서 디버거 코드를 연결하기 위한 안전한 실행 지점을 제공합니다. 이를 통해 도구는 이제 파이썬 응용 프로그램을 실시간으로 검사하고 상호 작용할 수 있으며, 해당하는 기능은 고가용성 시스템과 프로덕션 환경에서 중요한 기능입니다.
편의를 위해 해당하는 인터페이스는 sys.remote_exec() 함수로 구현되었습니다. 예를 들어, 다음과 같습니다:
import sys
from tempfile import NamedTemporaryFile
with NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f:
script_path = f.name
f.write(f'import my_debugger; my_debugger.connect({os.getpid()})')
# Execute in process with PID 1234
print('Behold! An offering:')
sys.remote_exec(1234, script_path)
해당하는 함수는 다음 안전한 실행 지점에서 대상 프로세스 안에서 실행될 파이썬 코드를 보낼 수 있게 합니다. 그러나 도구 작성자는 PEP에 설명된 대로 프로토콜을 직접 구현할 수도 있습니다. 해당하는 PEP는 실행 중인 프로세스에 안전하게 연결하는 데 사용되는 기반 메커니즘을 자세히 설명합니다.
디버깅 인터페이스는 보안을 염두에 두고 신중하게 설계되었으며, 액세스를 제어하는 여러 메커니즘을 포함합니다:
PYTHON_DISABLE_REMOTE_DEBUG환경 변수.-X disable-remote-debug명령줄 옵션.빌드 시 해당하는 기능을 완전히 비활성화하기 위한
--without-remote-debug구성 플래그.
(Pablo Galindo Salgado, Matt Wozniski, 그리고 Ivona Stojanovic이 gh-131591를 통해 기능을 구현하였습니다.)
더 보기
새로운 형의 인터프리터¶
CPython에 새로운 형의 인터프리터가 추가되었습니다. 이 인터프리터는 하나의 큰 C case 문장 대신, 개별 파이썬 opcode를 구현하는 작은 C 함수들 사이의 꼬리 호출을 사용합니다. 특정 최신 컴파일러에서는 해당하는 인터프리터가 상당히 더 나은 성능을 제공합니다. 예비 벤치마크에 따르면 플랫폼과 아키텍처에 따라 표준 pyperformance 벤치마크 스위트에서 기하 평균 기준으로 3-5% 더 빠른 것으로 보입니다. 기준선은 이 새로운 인터프리터 없이 Clang 19로 빌드한 파이썬 3.14입니다.
해당하는 인터프리터는 현재 x86-64 및 AArch64 아키텍처에서 Clang 19 이상에서만 동작합니다. 그러나 향후 GCC 릴리스에서도 이를 지원할 것으로 예상됩니다.
This feature is opt-in for now. Enabling profile-guided optimization is highly
recommended when using the new interpreter as it is the only configuration
that has been tested and validated for improved performance.
For further information, see --with-tail-call-interp.
참고
이를 현재 CPython에서 구현되지 않은 파이썬 함수의 꼬리 호출 최적화와 혼동해서는 안 됩니다.
해당하는 새로운 인터프리터 형은 CPython 인터프리터의 내부 구현 세부 사항입니다. 파이썬 프로그램의 외부에 드러나는 동작은 전혀 변경하지 않습니다. 성능을 향상시킬 수는 있지만, 이외의 그 무엇도 변경되지 않습니다.
(Ken Jin이 gh-128563를 통해 기능을 구현하였으며, Mark Shannon, Garrett Gu, Haoran Xu, 그리고 Josh Haberman이 이 기능을 CPython에 구현하는 방법에 대한 아이디어를 제공하였습니다.)
자유 스레딩 모드의 개선 사항들¶
3.13에서 처음 추가된 CPython의 자유 스레딩 모드(PEP 703)는 파이썬 3.14에서 크게 개선되었습니다. C API 변경 사항을 포함하여 PEP 703에 설명된 구현이 완료되었고, 인터프리터의 임시 우회책은 더 영구적인 해결책으로 대체되었습니다. 특수화 적응형 인터프리터(PEP 659)가 이제 자유 스레딩 모드에서 활성화되었으며, 여러 다른 최적화와 함께 해당 모드의 성능을 크게 개선합니다. 자유 스레딩 모드에서 단일 스레드 코드에 발생하는 성능 저하는 이제 사용되는 플랫폼과 C 컴파일러에 따라 대략 5-10%입니다.
파이썬 3.14부터 윈도우에서 CPython 자유 스레딩 빌드용 확장 모듈을 컴파일할 때는 전처리기 변수 Py_GIL_DISABLED를 빌드 백엔드가 지정해야 합니다. 해당하는 값은 더 이상 C 컴파일러가 자동으로 결정하지 않기 때문입니다. 실행 중인 인터프리터에서는 컴파일 시 사용된 설정을 sysconfig.get_config_var()를 사용하여 확인할 수 있습니다.
새로운 -X context_aware_warnings 플래그는 동시성에 안전한 경고 제어가 활성화되는지 여부를 제어합니다. 이 플래그의 기본값은 자유 스레딩 빌드에서는 참이고, GIL이 활성화된 빌드에서는 거짓입니다.
새로운 thread_inherit_context 플래그가 추가되었습니다. 해당하는 플래그가 활성화되면 threading.Thread로 생성된 스레드는 start()를 호출한 호출자의 Context() 복사본으로 시작됩니다. 가장 중요한 점은, catch_warnings로 설정된 경고 필터링 컨텍스트가 해당 컨텍스트 안에서 시작된 스레드(또는 asyncio 태스크)에 “상속”되도록 한다는 것입니다. 또한, decimal 컨텍스트 관리자와 같이 컨텍스트 변수를 사용하는 다른 모듈에도 영향을 미칩니다. 해당하는 플래그의 기본값은 자유 스레딩 빌드에서는 참이고, GIL이 활성화된 빌드에서는 거짓입니다.
(Sam Gross, Matt Page, Neil Schemenauer, Thomas Wouters, Donghee Na, Kirill Podoprigora, Ken Jin, Itamar Oren, Brett Simmers, Dino Viehland, Nathan Goldbaum, Ralf Gommers, Lysandros Nikolaou, Kumar Aditya, Edgar Margffoy, 그리고 그 밖의 많은 분들이 기여하였습니다. 이 기여자들 중 일부는 Meta에 재직하고 있으며, Meta는 이 프로젝트를 지원하기 위해 상당한 엔지니어링 자원을 계속 제공해 왔습니다.)
개선된 에러 메세지¶
인터프리터는 이제 파이썬 키워드의 오타를 감지하면 유용한 제안을 제공합니다. 파이썬 키워드와 매우 비슷한 단어를 만나면 인터프리터는 에러 메세지에서 올바른 키워드를 제안합니다. 해당하는 기능은 프로그래머가 흔한 입력 실수를 빠르게 식별하고 수정하는 데 도움이 됩니다. 예를 들어, 다음과 같습니다:
>>> whille True: ... pass Traceback (most recent call last): File "<stdin>", line 1 whille True: ^^^^^^ SyntaxError: invalid syntax. Did you mean 'while'?
해당하는 기능은 가장 흔한 케이스들에 초점을 맞추지만, 일부 철자 오류의 변형은 여전히 일반적인 문법 에러로 이어질 수 있습니다. (Pablo Galindo가 gh-132449를 통해 기능을 구현하였습니다.)
else블록 뒤에 오는elif문장에는 이제 전용 에러 메세지가 제공됩니다. (Steele Farnsworth가 gh-129902를 통해 기능을 구현하였습니다.)>>> if who == "me": ... print("It's me!") ... else: ... print("It's not me!") ... elif who is None: ... print("Who is it?") File "<stdin>", line 5 elif who is None: ^^^^ SyntaxError: 'elif' block follows an 'else' block
조건 표현식(Conditional expressions)에서
else뒤에 문장이 전달되거나if앞에pass,break,continue중 하나가 전달되면, 에러 메세지는expression이 필요한 위치를 강조 표시합니다. (Sergey Miryanov가 gh-129515를 통해 기능을 구현하였습니다.)>>> x = 1 if True else pass Traceback (most recent call last): File "<string>", line 1 x = 1 if True else pass ^^^^ SyntaxError: expected expression after 'else', but statement is given >>> x = continue if True else break Traceback (most recent call last): File "<string>", line 1 x = continue if True else break ^^^^^^^^ SyntaxError: expected expression before 'if', but statement is given
잘못 닫힌 문자열이 감지되면 에러 메세지는 해당 문자열이 문자열의 일부로 의도되었을 수 있음을 제안합니다. (Pablo Galindo가 gh-88535를 통해 기능을 구현하였습니다.)
>>> "The interesting object "The important object" is very important" Traceback (most recent call last): SyntaxError: invalid syntax. Is this intended to be part of the string?
문자열에 호환되지 않는 접두사가 있는 경우, 이제 에러 메세지는 어떤 접두사가 호환되지 않는지 보여줍니다. (Nikita Sobolev가 gh-133197를 통해 기능을 구현하였습니다.)
>>> ub'abc' File "<python-input-0>", line 1 ub'abc' ^^ SyntaxError: 'u' and 'b' prefixes are incompatible
다음 구문에서 호환되지 않는 대상과 함께 as를 사용할 때의 개선된 에러 메세지:
임포트: import … as …
From 임포트: from … import … as …
예외 처리기: except … as …
패턴 매칭 케이스: case … as …
(Nikita Sobolev가 gh-123539, gh-123562, 그리고 gh-123440를 통해 기능을 구현하였습니다.)
dict또는set에 해시할 수 없는 형의 인스턴스를 추가하려고 할 때의 에러 메세지가 개선되었습니다. (CF Bolz-Tereick와 Victor Stinner가 gh-132828를 통해 기능을 구현하였습니다.)>>> s = set() >>> s.add({'pages': 12, 'grade': 'A'}) Traceback (most recent call last): File "<python-input-1>", line 1, in <module> s.add({'pages': 12, 'grade': 'A'}) ~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: cannot use 'dict' as a set element (unhashable type: 'dict') >>> d = {} >>> l = [1, 2, 3] >>> d[l] = 12 Traceback (most recent call last): File "<python-input-4>", line 1, in <module> d[l] = 12 ~^^^ TypeError: cannot use 'list' as a dict key (unhashable type: 'list')
동기화 컨텍스트 관리자 프로토콜을 지원하는 객체에
with대신async with를 사용하여 진입할 때와, 반대로 비동기 컨텍스트 관리자 프로토콜에 대해 반대의 방식으로 사용할 때의 에러 메세지가 개선되었습니다. (Bénédikt Tran이 gh-128398를 통해 기능을 구현하였습니다.)
PEP 784: 표준 라이브러리의 Zstandard 지원¶
새로운 compression 패키지는 compression.lzma, compression.bz2, compression.gzip, 그리고 compression.zlib 모듈을 포함하며, 해당하는 모듈들은 각각 lzma, bz2, gzip 및 zlib 모듈을 다시 내보냅니다. compression 아래의 새로운 임포트 이름은 파이썬 3.14부터 이러한 압축 모듈을 임포트할 때 권장되는 이름입니다. 그러나, 기존 모듈 이름은 폐지 예정으로 지정되지 않았습니다. 기존 압축 모듈의 폐지 예정으로의 지정이나 제거는 3.14 릴리스 후 적어도 5년이 지난 이후에 이루어질 것입니다.
새로운 compression.zstd 모듈은 Meta의 zstd 라이브러리 바인딩을 통해 Zstandard 형식의 압축 및 압축 해제 API를 제공합니다. Zstandard는 널리 채택된 효율적이고 빠른 압축 형식입니다. compression.zstd에 도입된 API 외에도, tarfile, zipfile, 그리고 shutil 모듈에 Zstandard 압축 아카이브에 대한 읽기 및 쓰기 지원이 추가되었습니다.
새로운 모듈을 사용하여 데이터를 압축하는 예시는 다음과 같습니다:
from compression import zstd
import math
data = str(math.pi).encode() * 20
compressed = zstd.compress(data)
ratio = len(compressed) / len(data)
print(f"Achieved compression ratio of {ratio}")
이와 같이, 해당하는 API는 lzma 및 bz2 모듈의 API와 유사합니다.
(Emma Harper Smith, Adam Turner, Gregory P. Smith, Tomas Roun, Victor Stinner, 그리고 Rogdham이 gh-132983를 통해 기능을 구현하였습니다.)
더 보기
Asyncio의 인트로스펙션 기능¶
비동기 태스크를 사용하는 실행 중인 파이썬 프로세스를 검사하기 위한 새로운 명령줄 인터페이스가 추가되었습니다. 해당하는 인터페이스는 python -m asyncio ps PID 혹은 python -m asyncio pstree PID를 통해 사용할 수 있습니다.
ps 하위 명령은 주어진 프로세스 ID(PID)를 검사하고 현재 실행 중인 asyncio 태스크에 대한 정보를 표시합니다. 해당하는 명령은 모든 태스크, 각 태스크의 이름과 코루틴 스택, 그리고 어떤 태스크가 해당 태스크를 await하고 있는지를 일렬로 나열한 태스크 테이블을 출력합니다.
pstree 하위 명령은 같은 정보를 가져오지만, 대신 코루틴 관계를 계층 형식으로 보여 주는 시각적 비동기 호출 트리를 렌더링합니다. 해당하는 명령은 오래 실행되거나 멈춘 비동기 프로그램을 디버깅하는 데 특히 유용합니다. 개발자가 프로그램이 어디에서 블록되어 있는지, 어떤 태스크가 대기 중인지, 코루틴이 어떻게 서로 연결되어 있는지 빠르게 파악하는 데 도움이 될 수 있습니다.
예를 들어, 다음과 같은 예시를 생각해볼 수 있습니다:
import asyncio
async def play_track(track):
await asyncio.sleep(5)
print(f'🎵 Finished: {track}')
async def play_album(name, tracks):
async with asyncio.TaskGroup() as tg:
for track in tracks:
tg.create_task(play_track(track), name=track)
async def main():
async with asyncio.TaskGroup() as tg:
tg.create_task(
play_album('Sundowning', ['TNDNBTG', 'Levitate']),
name='Sundowning')
tg.create_task(
play_album('TMBTE', ['DYWTYLM', 'Aqua Regia']),
name='TMBTE')
if __name__ == '__main__':
asyncio.run(main())
실행 중인 프로세스에서 해당하는 새로운 도구를 사용하면 다음과 같은 테이블이 출력할 수 있습니다:
python -m asyncio ps 12345
tid task id task name coroutine stack awaiter chain awaiter name awaiter id
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1935500 0x7fc930c18050 Task-1 TaskGroup._aexit -> TaskGroup.__aexit__ -> main 0x0
1935500 0x7fc930c18230 Sundowning TaskGroup._aexit -> TaskGroup.__aexit__ -> album TaskGroup._aexit -> TaskGroup.__aexit__ -> main Task-1 0x7fc930c18050
1935500 0x7fc93173fa50 TMBTE TaskGroup._aexit -> TaskGroup.__aexit__ -> album TaskGroup._aexit -> TaskGroup.__aexit__ -> main Task-1 0x7fc930c18050
1935500 0x7fc93173fdf0 TNDNBTG sleep -> play TaskGroup._aexit -> TaskGroup.__aexit__ -> album Sundowning 0x7fc930c18230
1935500 0x7fc930d32510 Levitate sleep -> play TaskGroup._aexit -> TaskGroup.__aexit__ -> album Sundowning 0x7fc930c18230
1935500 0x7fc930d32890 DYWTYLM sleep -> play TaskGroup._aexit -> TaskGroup.__aexit__ -> album TMBTE 0x7fc93173fa50
1935500 0x7fc93161ec30 Aqua Regia sleep -> play TaskGroup._aexit -> TaskGroup.__aexit__ -> album TMBTE 0x7fc93173fa50
혹은 다음과 같은 트리를 출력할 수 있습니다:
python -m asyncio pstree 12345
└── (T) Task-1
└── main example.py:13
└── TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72
└── TaskGroup._aexit Lib/asyncio/taskgroups.py:121
├── (T) Sundowning
│ └── album example.py:8
│ └── TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72
│ └── TaskGroup._aexit Lib/asyncio/taskgroups.py:121
│ ├── (T) TNDNBTG
│ │ └── play example.py:4
│ │ └── sleep Lib/asyncio/tasks.py:702
│ └── (T) Levitate
│ └── play example.py:4
│ └── sleep Lib/asyncio/tasks.py:702
└── (T) TMBTE
└── album example.py:8
└── TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72
└── TaskGroup._aexit Lib/asyncio/taskgroups.py:121
├── (T) DYWTYLM
│ └── play example.py:4
│ └── sleep Lib/asyncio/tasks.py:702
└── (T) Aqua Regia
└── play example.py:4
└── sleep Lib/asyncio/tasks.py:702
만약 비동기 await 그래프에서 (프로그래밍에 문제가 있다는 점을 드러내는 것으로 해석될 수 있는) 사이클이 감지되면, 해당하는 도구는 에러를 발생시키고 트리 구성을 방해하는 사이클 경로를 나열합니다:
python -m asyncio pstree 12345
ERROR: await-graph contains cycles - cannot print a tree!
cycle: Task-2 → Task-3 → Task-2
(Pablo Galindo, Łukasz Langa, Yury Selivanov, 그리고 Marta Gomez Macias가 gh-91048를 통해 기능을 구현하였습니다.)
동시성 안전 경고 제어¶
warnings.catch_warnings 컨텍스트 관리자는 이제 경고 필터에 컨텍스트 변수를 선택적으로 사용합니다. 해당하는 기능은 -X 명령줄 옵션이나 환경 변수를 사용하여 context_aware_warnings 플래그를 설정하면 활성화됩니다. 이를 통해 catch_warnings를 여러 스레드 또는 비동기 태스크와 함께 사용할 때 예측 가능한 경고 제어가 가능합니다. 해당하는 플래그의 기본값은 자유 스레딩 빌드에서는 참이고, GIL이 활성화된 빌드에서는 거짓입니다.
(Neil Schemenauer와 Kumar Aditya가 gh-130010를 통해 기능을 구현하였습니다.)
이외의 언어 변경 사항¶
윈도우에서는 이제 모든 윈도우 코드 페이지가 ‘cpXXX’ 코덱으로 지원됩니다. (Serhiy Storchaka가 gh-123803를 통해 기능을 구현하였습니다.)
C99 이후의 C 표준에 지정된 대로 실수와 복소수를 결합하는 혼합 모드 산술 규칙이 구현되었습니다. (Sergey B Kirpichev가 gh-69639를 통해 기능을 구현하였습니다.)
최적화 여부 및
-O명령줄 옵션과 관계없이 더 많은 문법 에러가 이제 감지됩니다. 여기에는 __debug__에 쓰기,await의 잘못된 사용, 비동기 함수 밖의 비동기 컴프리헨션이 포함됩니다. 예를 들어, python -O -c ‘assert (__debug__ := 1)’ 혹은 python -O -c ‘assert await 1’는 이제SyntaxError를 발생시킵니다. (Irit Katriel과 Jelle Zijlstra가 gh-122245 및 gh-121637를 통해 기능을 구현하였습니다.)순수한 C 형의 서브클래스를 만들 때, 서브클래스에서 명시적으로 재정의되지 않은 경우 새로운 형의 C 슬롯이 클래스 생성 시 더 이상 감싸여진 버전으로 대체되지 않습니다. (Tomasz Pytel이 gh-132284를 통해 기능을 구현하였습니다.)
내장 함수들¶
bytes.fromhex()및bytearray.fromhex()메서드는 이제 ASCIIbytes및 바이트열류 객체를 받아들입니다. (Daniel Pope가 gh-129349를 통해 기능을 구현하였습니다.)숫자를 각각
float및complex형으로 변환하는 클래스 메서드float.from_number()및complex.from_number()가 추가되었습니다. 인자가 실수가 아니면TypeError를 발생시킵니다. (Serhiy Storchaka가 gh-84978를 통해 기능을 구현하였습니다.)새로운 스타일의 문자열 포맷팅(
format()또는 f-문자열)의 부동 소수점 표시 형식에서 소수부에 밑줄과 쉼표를 천 단위 구분자로 사용할 수 있도록 지원합니다. (Sergey B Kirpichev가 gh-87790를 통해 기능을 구현하였습니다.)int()함수는 더 이상__trunc__()에 위임하지 않습니다.int()로의 변환을 지원하려는 클래스는__int__()혹은__index__()중 하나를 구현해야 합니다. (Mark Dickinson이 gh-119743를 통해 기능을 구현하였습니다.)map()함수에는 이제zip()처럼 모든 이터러블의 길이가 같은지 검사하는 선택적 키워드 전용 strict 플래그가 추가되었습니다. (Wannes Boeykens가 gh-119793를 통해 기능을 구현하였습니다.)memoryview형이 이제 서브스크립션을 지원하여 제네릭 형이 되었습니다. (Brian Schubert가 gh-126012를 통해 기능을 구현하였습니다.)NotImplemented를 불리언 컨텍스트에서 사용하면 이제TypeError가 발생합니다. 해당하는 동작은 파이썬 3.9부터DeprecationWarning를 발생시켜 왔습니다. (Jelle Zijlstra가 gh-118767를 통해 기능을 구현하였습니다.)세 개의 인자를 받는
pow()는 이제 필요할 때__rpow__()호출을 시도합니다. 이전에는 두 개의 인자를 받는pow()와 이항 거듭제곱 연산자에서만 해당하는 메서드가 호출되었습니다. (Serhiy Storchaka가 gh-130104를 통해 기능을 구현하였습니다.)super객체는 이제복사 가능하며피클 가능합니다. (Serhiy Storchaka가 gh-125767를 통해 기능을 구현하였습니다.)
명령줄 및 환경¶
임포트 시간 플래그는 이제 새로운
-X importtime=2를 통해 이미 로드된(‘cached’) 모듈을 추적할 수 있습니다. 이러한 모듈이 임포트되면 self와 cumulative 시간은 문자열 cached로 대체됩니다.-X importtime에서 2를 초과하는 값은 이제 향후 사용을 위해 예약되었습니다.
(Noah Kim과 Adam Turner가 gh-118655를 통해 기능을 구현하였습니다.)
명령줄 옵션
-c는 이제 실행 전에 코드 인자를 자동으로 내어쓰기 처리합니다. 해당하는 자동 내어쓰기 동작은textwrap.dedent()와 같습니다. (Jon Crall과 Steven Sun이 gh-103998를 통해 기능을 구현하였습니다.)-J는 더 이상 Jython 관련 예약 플래그가 아니며, 이제 특별한 의미가 없습니다. (Adam Turner가 gh-133336를 통해 기능을 구현하였습니다.)
PEP 758: 괄호 없는 except 및 except* 표현식 허용¶
여러 예외 형이 있고 as 절을 사용하지 않는 경우, 이제 except 및 except* 표현식에서 괄호를 생략할 수 있습니다. 예를 들어, 다음과 같습니다:
try:
connect_to_server()
except TimeoutError, ConnectionRefusedError:
print('The network has ceased to be!')
(Pablo Galindo와 Brett Cannon이 PEP 758과 gh-131831를 통해 기능을 구현하였습니다.)
PEP 765: finally 블록 내 제어 흐름¶
컴파일러는 이제 return, break 혹은 continue 문이 finally 블록을 벗어나는 효과를 갖는 경우 SyntaxWarning을 발생시킵니다. 해당하는 변경 사항은 PEP 765에 명시되어 있습니다.
해당하는 변경 사항이 불편한 상황(예를 들어, 코드 린팅 때문에 경고가 중복되는 경우)에서는 경고 필터를 사용해 ignore::SyntaxWarning을 필터로 추가함으로써 모든 문법 경고를 끌 수 있습니다. 다른 경고를 에러로 변환하는 필터와 함께 지정할 수 있습니다(예를 들어, CLI 옵션으로 -Werror -Wignore::SyntaxWarning을 전달하거나 PYTHONWARNINGS=error,ignore::SyntaxWarning을 설정하는 방식입니다).
warnings 모듈을 사용하여 런타임에 이러한 필터를 적용하면, 필터가 조정된 후에 컴파일되는 코드에서만 경고가 억제된다는 점에 유의해주시기를 부탁드립니다. 필터 조정 전에 컴파일되는 코드(예를 들어, 모듈이 임포트될 때)는 여전히 문법 경고를 발생시킵니다.
(Irit Katriel이 gh-130080를 통해 기능을 구현하였습니다.)
Garbage collection¶
From Python 3.14.5 onwards:
The garbage collector (GC) has changed in Python 3.14.5.
Python 3.14.0-3.14.4 shipped with a new incremental GC. However, due to a number of reports of significant memory pressure in production environments, it has been reverted back to the generational GC from 3.13. This is the GC now used in Python 3.14.5 and later.
Previously in Python 3.14.0-3.14.4:
순환 가비지 수거기는 이제 점진적인 방식으로 작동합니다. 이는 더 큰 힙에서 최대 일시 중지 시간이 10배 이상 줄어든다는 뜻입니다.
이제 세대는 젊은 세대와 오래된 세대, 두 가지만 있습니다. gc.collect()를 직접 호출하지 않으면 GC는 조금 덜 자주 호출됩니다. 호출될 때에는 하나 이상의 세대를 수거하는 대신 젊은 세대와 오래된 세대의 점진적인 한 증가분 만큼을 수거합니다.
gc.collect()의 동작은 약간 변경됩니다:
gc.collect(1): 1세대를 수거하는 대신 가비지 수거의 한 점진적인 단계를 수행합니다.
그 밖의
gc.collect()호출은 변경되지 않습니다.
(Mark Shannon이 gh-108362를 통해 기능을 구현하였습니다.)
기본 대화형 셸¶
기본 대화형 셸은 이제 파이썬 문법을 강조 표시합니다. 해당하는 기능은
PYTHON_BASIC_REPL혹은 색상을 비활성화하는 다른 환경 변수가 설정된 경우를 제외하고 기본적으로 활성화됩니다. 자세한 내용은 Controlling color를 참조해주시기를 부탁드립니다.문법 강조를 위한 기본 색상 테마는 좋은 대비를 제공하려고 하며, 최대 호환성을 위해 4비트 VGA 표준 ANSI 색상 코드만 사용합니다. 이 테마는 실험적 API인
_colorize.set_theme()함수를 사용하여 커스터마이즈할 수 있습니다. 해당하는 함수는 대화형으로 호출하거나PYTHONSTARTUP스크립트에서 호출할 수 있습니다. 해당하는 함수에는 안정성 보장이 없으며 변경되거나 제거될 수 있음을 유의해주시기를 부탁드립니다.(Łukasz Langa가 gh-131507를 통해 기능을 구현하였습니다.)
기본 대화형 셸은 이제 임포트 자동 완성을 지원합니다. 이는 import co를 입력하고 <Tab>을 누르면 co로 시작하는 모듈을 제안한다는 뜻입니다. 마찬가지로 from concurrent import i를 입력하면 concurrent의 i로 시작하는 하위 모듈을 제안합니다. 현재 모듈 어트리뷰트의 자동 완성은 지원되지 않는다는 점에 유의해주시기를 부탁드립니다. (Tomas Roun이 gh-69605를 통해 기능을 구현하였습니다.)
새로운 모듈들¶
annotationlib: 어노테이션을 인트로스펙션하기 위한 모듈입니다. 보다 자세한 내용은 PEP 749를 참조해주시기를 부탁드립니다. (Jelle Zijlstra가 gh-119180를 통해 기능을 구현하였습니다.)compression(compression.zstd포함): Zstandard 압축 형식을 지원하는 새 모듈을 포함하여, 압축 관련 모듈을 위한 패키지입니다. 보다 자세한 내용은 PEP 784를 참조해주시기를 부탁드립니다. (Emma Harper Smith, Adam Turner, Gregory P. Smith, Tomas Roun, Victor Stinner, 그리고 Rogdham이 gh-132983를 통해 기능을 구현하였습니다.)concurrent.interpreters: 표준 라이브러리의 여러 인터프리터를 지원합니다. 보다 자세한 내용은 PEP 734를 참조해주시기를 부탁드립니다. (Eric Snow가 gh-134939를 통해 기능을 구현하였습니다.)string.templatelib: 템플릿 문자열 리터럴(t-문자열)을 지원합니다. 보다 자세한 내용은 PEP 750를 참조해주시기를 부탁드립니다. (Jim Baker, Guido van Rossum, Paul Everitt, Koudai Aono, Lysandros Nikolaou, Dave Peck, Adam Turner, Jelle Zijlstra, Bénédikt Tran, 그리고 Pablo Galindo Salgado가 gh-132661를 통해 기능을 구현하였습니다.)
개선된 모듈들¶
argparse¶
argparse.ArgumentParser클래스에 대한 프로그램 이름의 기본값은 이제 파이썬 인터프리터가 __main__ 모듈 코드를 찾도록 지시받은 방식을 반영합니다. (Serhiy Storchaka와 Alyssa Coghlan이 gh-66436를 통해 기능을 구현하였습니다.)argparse.ArgumentParser클래스에 선택적 suggest_on_error 매개변수가 도입되었습니다. 해당하는 매개변수는 사용자가 인자 선택지나 하위 파서 이름을 잘못 입력했을 때 제안을 제공할 수 있게 합니다. (Savannah Ostrowski가 gh-124456를 통해 기능을 구현하였습니다.)도움말 텍스트에 색상을 적용합니다. 해당하는 기능은
argparse.ArgumentParser클래스의 선택적 color 매개변수로 비활성화할 수 있습니다. 또한 환경 변수로 제어할 수도 있습니다. (Hugo van Kemenade가 gh-130645를 통해 기능을 구현하였습니다.)
ast¶
두 개의 AST를 비교하는 함수인
compare()를 추가하였습니다. (Batuhan Taskaya와 Jeremy Hylton이 gh-60191를 통해 기능을 구현하였습니다.)AST 노드에 대한
copy.replace()지원이 추가되었습니다. (Bénédikt Tran이 gh-121141를 통해 기능을 구현하였습니다.)최적화 수준 2에서는 이제 최적화된 AST에서 독스트링이 제거됩니다. (Irit Katriel이 gh-123958를 통해 기능을 구현하였습니다.)
repr()출력은 이제 AST 노드에 대해 더 많은 정보를 포함합니다. (Tomas Roun이 gh-116022를 통해 기능을 구현하였습니다.)입력으로 AST가 전달되면,
parse()함수는 이제 루트 노드 형이 적절한지 항상 검증합니다. (Irit Katriel이 gh-130139를 통해 기능을 구현하였습니다.)명령줄 인터페이스에 새로운 옵션
--feature-version,--optimize및--show-empty를 추가하였습니다. (Semyon Moroz가 gh-133367를 통해 기능을 구현하였습니다.)
asyncio¶
create_task()라는 이름의 함수와 메서드는 이제 임의의 키워드 인자 목록을 받습니다. 모든 키워드 인자는Task생성자 혹은 커스텀 태스크 팩토리에 전달됩니다. (보다 자세한 내용은set_task_factory()를 참조해주시기를 부탁드립니다.) name 및 context 키워드 인자는 더 이상 특별하게 취급되지 않습니다. 이제 이름은 팩토리의 name 키워드 인자를 사용해 설정해야 하며, context는 None일 수 있습니다.해당하는 변경 사항은 다음 함수 및 메서드에 영향을 미칩니다:
asyncio.create_task(),asyncio.loop.create_task(),asyncio.TaskGroup.create_task().(Thomas Grainger가 gh-128307를 통해 기능을 구현하였습니다.)
프로그램의 호출 그래프를 인트로스펙션하고 출력하기 위한 두 개의 새로운 유틸리티 함수가 추가되었습니다:
capture_call_graph()및print_call_graph(). 보다 자세한 내용은 asyncio 인트로스펙션 기능을 참조해주시기를 부탁드립니다. (Yury Selivanov, Pablo Galindo Salgado 및 Łukasz Langa가 gh-91048를 통해 기능을 구현하였습니다.)
달력¶
concurrent.futures¶
새로운 실행기 클래스인
InterpreterPoolExecutor를 추가하였습니다. 해당하는 클래스는 동일한 프로세스 안의 여러 파이썬 인터프리터(‘서브인터프리터’)를 파이썬 코드에 드러냅니다. 해당하는 클래스는 독립적인 파이썬 인터프리터 풀을 사용하여 호출을 비동기적으로 실행합니다.이는 PEP 734에서 도입된 새로운
interpreters모듈과는 별개입니다. (Eric Snow가 gh-124548를 통해 기능을 구현하였습니다.)
On Unix platforms other than macOS, ‘forkserver’ is now the default start method for
ProcessPoolExecutor(replacing ‘fork’). This change does not affect Windows or macOS, where ‘spawn’ remains the default start method.스레딩과 호환되지 않는 fork 방법이 필요한 경우,
ProcessPoolExecutor에 멀티프로세싱 컨텍스트인 mp_context를 제공하여 이를 명시적으로 요청해야 합니다.fork 방법과 관련된 정보 및 차이점, 그리고 해당하는 변경 사항이 가변 전역 공유 변수 그리고/혹은 자동으로
pickle처리할 수 없는 공유 객체를 사용하는 기존 코드에 어떤 영향을 줄 수 있는지에 대한 내용은 forkserver 제한 사항을 참조해주시기를 부탁드립니다.(Gregory P. Smith가 gh-84559를 통해 기능을 구현하였습니다.)
ProcessPoolExecutor에 주어진 풀의 살아 있는 모든 워커 프로세스를 종료하거나 강제 종료하는 방법인 새 메서드 두 개,terminate_workers()및kill_workers()를 추가하였습니다. (Charles Machalow가 gh-130849를 통해 기능을 구현하였습니다.)아직 결과가 산출되지 않은 제출된 태스크 수를 제한하기 위해
Executor.map에 선택적 buffersize 매개변수를 추가하였습니다. 버퍼가 가득 차면 버퍼에서 결과가 산출될 때까지 iterables에 대한 이터레이션이 일시 중지됩니다. (Enzo Bonnal과 Josh Rosenberg가 gh-74028를 통해 기능을 구현하였습니다.)
configparser¶
configparser는 보안을 개선하기 위해 읽을 수 없는 설정 파일을 더 이상 작성하지 않습니다. 구분자를 포함하거나 섹션 헤더 패턴으로 시작하는 키를write()메서드로 쓰려고 시도하면InvalidWriteError가 발생합니다. (Jacob Lincoln이 gh-129270를 통해 기능을 구현하였습니다.)
contextvars¶
ctypes¶
Structure및Union객체에서 비트 필드의 레이아웃이 이제 플랫폼 기본값(GCC/Clang 혹은 MSVC)에 더 가깝게 맞춰졌습니다. 특히 필드는 더 이상 겹치지 않습니다. (Matthias Görgens가 gh-97702를 통해 기능을 구현하였습니다.)기본값이 아닌 ABI에 맞추는 데 도움이 되도록
Structure._layout_클래스 어트리뷰트를 이제 설정할 수 있습니다. (Petr Viktorin이 gh-97702를 통해 기능을 구현하였습니다.)Structure/Union필드 디스크립터의 클래스는 이제CField로 사용할 수 있으며, 디버깅과 인트로스펙션을 돕는 새 어트리뷰트를 갖습니다. (Petr Viktorin이 gh-128715를 통해 기능을 구현하였습니다.)윈도우에서
COMError예외가 새롭게 공개되었습니다. (Jun Komoda가 gh-126686를 통해 기능을 구현하였습니다.)윈도우에서
CopyComPointer()함수가 새롭게 공개되었습니다. (Jun Komoda가 gh-127275를 통해 기능을 구현하였습니다.)제공된 포인터와 길이를 참조하는
memoryview객체를 생성하는 함수인memoryview_at()를 추가하였습니다. 해당하는 함수는ctypes.string_at()처럼 동작하지만 버퍼 복사를 피하며, 동적으로 크기가 정해지는 버퍼를 전달받는 순수 파이썬 콜백 함수를 구현할 때 일반적으로 유용합니다. (Rian Hunter가 gh-112018를 통해 기능을 구현하였습니다.)컴파일러와 libffi 라이브러리가 모두 복소 C 형을 지원하는 경우, 복소 형인
c_float_complex,c_double_complex및c_longdouble_complex를 이제 사용할 수 있습니다. (Sergey B Kirpichev가 gh-61103를 통해 기능을 구현하였습니다.)현재 프로세스가 로드한 공유 라이브러리를 나열하기 위한
ctypes.util.dllist()를 추가하였습니다. (Brian Ward가 gh-119349를 통해 기능을 구현하였습니다.)ctypes.POINTER()형 캐시를 전역 내부 캐시(_pointer_type_cache)에서 해당ctypes형의_CData.__pointer_type__어트리뷰트로 이동하였습니다. 이렇게 하면 일부 상황에서 캐시가 제한 없이 증가하는 것을 방지할 수 있습니다. (Sergey Miryanov가 gh-100926를 통해 기능을 구현하였습니다.)py_object형은 이제 서브스크립트 표기법을 지원하여 제네릭 형이 되었습니다. (Brian Schubert가 gh-132168를 통해 기능을 구현하였습니다.)ctypes는 이제 자유 스레딩 빌드를 지원합니다. (Kumar Aditya와 Peter Bierma가 gh-127945를 통해 기능을 구현하였습니다.)
curses¶
색상 쌍 0을 변경할 수 있게 하는
use_default_colors()함수의 개선 버전인assume_default_colors()함수를 추가하였습니다. (Serhiy Storchaka가 gh-133139를 통해 기능을 구현하였습니다.)
datetime¶
datetime.date및datetime.time클래스에strptime()메서드를 추가하였습니다. (Wannes Boeykens가 gh-41431를 통해 기능을 구현하였습니다.)
decimal¶
Decimal의 대체 생성자로Decimal.from_number()를 추가하였습니다. (Serhiy Storchaka가 gh-121798를 통해 기능을 구현하였습니다.)IEEEContext()를 드러내어 IEEE 754 (2008) 십진 소수 교환 형식에 해당하는 컨텍스트 생성을 지원합니다. (Sergey B Kirpichev가 gh-53032를 통해 기능을 구현하였습니다.)
difflib¶
dis¶
줄 번호만이 아니라
명령어의 전체 소스 위치 정보를 렌더링하는 기능을 추가하였습니다. 해당하는 기능은 show_positions 키워드 인자를 통해 다음 인터페이스에 추가되었습니다:해당하는 기능은
dis --show-positions를 통해서도 접근 가능합니다. (Bénédikt Tran이 gh-123165를 통해 기능을 구현하였습니다.)특화된 바이트 코드를 표시하는
dis --specialized명령줄 옵션을 추가하였습니다. (Bénédikt Tran이 gh-127413를 통해 기능을 구현하였습니다.)
errno¶
faulthandler¶
새로운
dump_c_stack()함수 혹은faulthandler.enable()함수의 c_stack 인자를 통해 이를 지원하는 시스템에서 C 스택 트레이스백을 출력하는 기능을 추가하였습니다. (Peter Bierma가 gh-127604를 통해 기능을 구현하였습니다.)
fnmatch¶
주어진 패턴과 일치하는 이름을 거부하는 함수인
filterfalse()를 추가하였습니다. (Bénédikt Tran이 gh-74598를 통해 기능을 구현하였습니다.)
fractions¶
이제
as_integer_ratio()메서드를 가진 모든 객체로부터Fraction객체를 생성할 수 있습니다. (Serhiy Storchaka가 gh-82017를 통해 기능을 구현하였습니다.)Fraction의 대체 생성자로Fraction.from_number()를 추가하였습니다. (Serhiy Storchaka가 gh-121797를 통해 기능을 구현하였습니다.)
functools¶
Placeholder센티널을 추가하였습니다. 반환되는 partial 객체에서 위치 인자를 위한 자리를 예약하기 위해partial()혹은partialmethod()함수와 함께 사용할 수 있습니다. (Dominykas Grigonis가 gh-119127를 통해 기능을 구현하였습니다.)reduce()의 initial 매개변수를 키워드 인자로 전달할 수 있도록 하였습니다. (Sayandip Dutta가 gh-125916를 통해 기능을 구현하였습니다.)
getopt¶
getpass¶
graphlib¶
정렬이 시작되지 않은 한
TopologicalSorter.prepare()를 두 번 이상 호출할 수 있도록 하였습니다. (Daniel Pope가 gh-130914를 통해 기능을 구현하였습니다.)
heapq¶
heapq모듈은 다음 새 함수들을 통해 최대 힙 작업에 대한 지원을 개선하였습니다:
hmac¶
http¶
http.server모듈이 생성하는 디렉터리 목록과 에러 페이지는 브라우저가 기본 다크 모드를 적용할 수 있도록 합니다. (Yorik Hansen이 gh-123430를 통해 기능을 구현하였습니다.)http.server모듈은 이제http.server.HTTPSServer클래스를 사용하여 HTTPS를 통한 서비스를 지원합니다. 해당하는 기능은 명령줄 인터페이스(python -m http.server)에서 다음 옵션을 통해 노출됩니다:--tls-cert <path>: TLS 인증서 파일의 경로입니다.--tls-key <path>: 비공개 키 파일의 선택적 경로입니다.--tls-password-file <path>: 비공개 키의 비밀번호 파일에 대한 선택적 경로입니다.
(Semyon Moroz가 gh-85162를 통해 기능을 구현하였습니다.)
imaplib¶
IMAP4.idle()메서드를 추가하였습니다. 해당하는 메서드는 RFC 2177에 정의된 IMAP4 IDLE 명령을 구현합니다. (Forest가 gh-55454를 통해 기능을 구현하였습니다.)
inspect¶
signature()는 어노테이션을 표현하는 데 사용되는annotationlib.Format를 제어하기 위한 새 인자 annotation_format을 받습니다. (Jelle Zijlstra가 gh-101552를 통해 기능을 구현하였습니다.)Signature.format()은 새 인자 unquote_annotations를 받습니다. 참이면 문자열 어노테이션이 주변 따옴표 없이 표시됩니다. (Jelle Zijlstra가 gh-101552를 통해 기능을 구현하였습니다.)객체가 패키지인지 여부를 판단하는
ispackage()함수를 추가하였습니다. (Zhikang Yan이 gh-125634를 통해 기능을 구현하였습니다.)
io¶
read를 사용하여 비차단 방식의 스트림에서 텍스트를 읽으면, 연산이 즉시 바이트열을 반환할 수 없는 경우 이제
BlockingIOError가 발생할 수 있습니다. (Giovanni Siragusa가 gh-109523를 통해 기능을 구현하였습니다.)Reader및Writer프로토콜을typing.IO,typing.TextIO, 및typing.BinaryIO의사 프로토콜의 더 간단한 대안으로 추가하였습니다. (Sebastian Rittau가 gh-127648를 통해 기능을 구현하였습니다.)
json¶
JSON 직렬화 에러에 대한 예외 노트를 추가하여 에러의 소스를 식별할 수 있도록 합니다. (Serhiy Storchaka가 gh-122163를 통해 기능을 구현하였습니다.)
json모듈을-m스위치를 사용하여 스크립트로 사용할 수 있도록 허용합니다: python -m json. 이제 해당하는 방식은 약하게 폐지된 python -m json.tool보다 선호됩니다. JSON 명령줄 인터페이스 설명서를 참조해주시기를 부탁드립니다. (Trey Hunner가 gh-122873를 통해 기능을 구현하였습니다.)JSON 명령줄 인터페이스의 출력은 기본적으로 색상으로 강조됩니다. 해당하는 동작은 환경 변수를 통해 제어할 수 있습니다. (Tomas Roun이 gh-131952를 통해 기능을 구현하였습니다.)
linecache¶
logging.handlers¶
QueueListener객체는 이제 컨텍스트 관리자 프로토콜을 지원합니다. (Charles Machalow가 gh-132106를 통해 기능을 구현하였습니다.)QueueListener.start메서드는 이제 리스너가 이미 시작된 경우RuntimeError를 발생시킵니다. (Charles Machalow가 gh-132106를 통해 기능을 구현하였습니다.)
math¶
모듈의 도메인 에러에 대해 더 자세한 에러 메세지를 추가하였습니다. (Charlie Zhao와 Sergey B Kirpichev가 gh-101410를 통해 기능을 구현하였습니다.)
mimetypes¶
모듈에 공개 명령줄 인터페이스를 추가하였습니다. 해당하는 인터페이스는 python -m mimetypes를 통해 호출됩니다. (Oleg Iarygin과 Hugo van Kemenade가 gh-93096를 통해 기능을 구현하였습니다.)
RFC와 일반적인 사용 방식들을 기반으로 여러 새로운 MIME 형을 추가하였습니다:
폰트들을 위한, Microsoft 및 RFC 8081 MIME 형
Embedded OpenType:
application/vnd.ms-fontobjectOpenType Layout (OTF)
font/otfTrueType:
font/ttfWOFF 1.0
font/woffWOFF 2.0
font/woff2
RFC 9559 Matroska 시청각 데이터 컨테이너 구조용 MIME 형
비디오가 없는 오디오: audio/matroska (.mka)
비디오: video/matroska (.mkv)
입체 비디오: video/matroska-3d (.mk3d)
RFC들이 있는 이미지
RFC 1494: CCITT 그룹 3 (.g3)
RFC 3362: 실시간 팩시밀리, T.38 (.t38)
RFC 3745: JPEG 2000 (.jp2), 확장 형식 (.jpx) 및 복합 형식 (.jpm)
RFC 3950: Tag Image File Format Fax eXtended, TIFF-FX (.tfx)
RFC 4047: Flexible Image Transport System (.fits)
RFC 7903: 향상된 메타파일 (.emf) 및 윈도우 메타파일 (.wmf)
기타 MIME 형 추가 및 변경 사항
RFC 2361: .avi의 형을 video/vnd.avi로, .wav의 형을 audio/vnd.wave로 변경
RFC 4337: MPEG-4 audio/mp4 (.m4a) 추가
RFC 5334: Ogg 미디어 (.oga, .ogg 및 .ogx) 추가
RFC 6713: gzip application/gzip (.gz) 추가
RFC 9639: FLAC audio/flac (.flac) 추가
RFC 9512 YAML 파일 (.yaml 및 .yml)용 application/yaml MIME 형
7z application/x-7z-compressed (.7z) 추가
엄격하지 않은 경우에 대해 Android 패키지 application/vnd.android.package-archive (.apk) 추가
deb 패키지 application/x-debian-package (.deb) 추가
glTF 바이너리 model/gltf-binary (.glb) 추가
glTF JSON/ASCII model/gltf+json (.gltf) 추가
M4V video/x-m4v (.m4v) 추가
PHP application/x-httpd-php (.php) 추가
RAR application/vnd.rar (.rar) 추가
RPM application/x-rpm (.rpm) 추가
STL model/stl (.stl) 추가
윈도우 미디어 비디오 video/x-ms-wmv (.wmv) 추가
사실상(de facto): WebM audio/webm (.weba) 추가
ECMA-376: .docx, .pptx, 그리고 .xlsx 형 추가
OASIS: OpenDocument .odg, .odp, .ods, 그리고 .odt 형 추가
W3C: EPUB application/epub+zip (.epub) 추가
(Sahil Prajapati와 Hugo van Kemenade가 gh-84852를 통해 기능을 구현하였으며, Sasha “Nelie” Chernykh와 Hugo van Kemenade가 gh-132056를 통해 기능을 구현하였고, Hugo van Kemenade가 gh-89416, gh-85957, 그리고 gh-129965를 통해 기능을 구현하였습니다.)
multiprocessing¶
On Unix platforms other than macOS, ‘forkserver’ is now the default start method (replacing ‘fork’). This change does not affect Windows or macOS, where ‘spawn’ remains the default start method.
스레딩과 호환되지 않는 fork 방법이 필요한 경우,
get_context()에서 얻은 컨텍스트를 통해 명시적으로 요청하거나(권장),set_start_method()를 통해 기본값을 변경해야 합니다.fork 방법과 관련된 정보 및 차이점, 그리고 해당하는 변경 사항이 가변 전역 공유 변수 그리고/혹은 자동으로
pickle처리할 수 없는 공유 객체를 사용하는 기존 코드에 어떤 영향을 줄 수 있는지에 대한 내용은 forkserver 제한 사항을 참조해주시기를 부탁드립니다.(Gregory P. Smith가 gh-84559를 통해 기능을 구현하였습니다.)
multiprocessing의 ‘forkserver’ 시작 메서드는 이제 제어 소켓을 인증하여, 다른 프로세스가 forkserver에 워커 생성 및 코드 실행을 유발할 수 있는지를 제한하는 데 파일시스템 권한에만 의존하지 않도록 합니다. (Gregory P. Smith가 gh-97514를 통해 기능을 구현하였습니다.)list 및 dict 형에 대한 multiprocessing 프록시 객체에 이전에 간과되어 누락되었던 메서드들이 추가되었습니다:
list프록시용clear()및copy()dict프록시용fromkeys(), reversed(d), d | {}, {} | d, 그리고 d |= {‘b’: 2}
(Roy Hyunjin Han이 gh-103134를 통해 기능을 구현하였습니다.)
SyncManager.set()을 통해 공유set객체에 대한 지원을 추가하였습니다.Manager()메서드에서set()을 이제 사용할 수 있습니다. (Mingyu Park이 gh-129949를 통해 기능을 구현하였습니다.)multiprocessing.Process객체에interrupt()를 추가하였습니다. 해당하는 메서드는 자식 프로세스에SIGINT를 보내 자식 프로세스를 종료합니다. 이를 통해finally절이 종료된 프로세스의 스택 트레이스를 출력할 수 있습니다. (Artem Pulkin이 gh-131913를 통해 기능을 구현하였습니다.)
operator¶
is_none()및is_not_none()함수를 한 쌍의 함수로 추가하였습니다. operator.is_none(obj)는 obj is None과 동등하며, operator.is_not_none(obj)는 obj is not None과 동등합니다. (Raymond Hettinger와 Nico Mexis가 gh-115808를 통해 기능을 구현하였습니다.)
os¶
reload_environ()함수를 추가하였습니다. 해당하는 함수는os.putenv()와os.unsetenv()혹은 같은 프로세스 내에서 파이썬 외부에서 이루어진 환경 변경 사항으로os.environ및os.environb를 갱신합니다. (Victor Stinner가 gh-120057를 통해 기능을 구현하였습니다.)os모듈에SCHED_DEADLINE및SCHED_NORMAL상수를 추가하였습니다. (James Roy가 gh-127688를 통해 기능을 구현하였습니다.)readinto()함수를 추가하였습니다. 해당하는 함수는 파일 디스크립터에서 버퍼 객체로 읽어 들입니다. (Cody Maloney가 gh-129205를 통해 기능을 구현하였습니다.)
os.path¶
realpath()의 strict 매개변수는 새로운 값인ALLOW_MISSING을 받아들입니다. 해당하는 값을 사용하면FileNotFoundError를 제외한 에러는 다시 발생하며, 결과 경로는 존재하지 않을 수 있지만 심볼릭 링크는 포함하지 않습니다. (Petr Viktorin이 CVE 2025-4517를 위해 기능을 구현하였습니다.)
pathlib¶
pathlib.Path클래스에 파일과 디렉터리를 재귀적으로 복사하거나 이동하는 메서드를 추가하였습니다:copy()는 파일 혹은 디렉터리 트리를 대상 지점으로 복사합니다.copy_into()는 대상 디렉터리 안으로 복사합니다.move()는 파일 혹은 디렉터리 트리를 대상으로 이동합니다.move_into()는 대상 디렉터리 안으로 이동합니다.
(Barney Gale이 gh-73991를 통해 기능을 구현하였습니다.)
info어트리뷰트를 추가하였습니다. 해당하는 어트리뷰트는 새로운pathlib.types.PathInfo프로토콜을 구현하는 객체를 저장합니다. 해당하는 객체는 파일 형식을 조회하고stat()결과를 내부적으로 캐시하는 기능을 지원합니다.iterdir()가 생성하는 경로 객체는 부모 디렉터리를 스캔하여 얻은 파일 형식 정보로 초기화됩니다. (Barney Gale이 gh-125413를 통해 기능을 구현하였습니다.)
pdb¶
pdb모듈은 이제 새로운-p PID명령줄 옵션을 사용하여 실행 중인 파이썬 프로세스에 원격으로 연결하는 기능을 지원합니다:python -m pdb -p 1234
해당하는 명령은 지정된 PID의 파이썬 프로세스에 연결하여 대화형으로 디버깅할 수 있게 합니다. 파이썬 인터프리터의 동작 방식상, 시스템 호출에서 차단되어 있거나 I/O를 기다리는 원격 프로세스에 연결하는 것은 다음 바이트 코드 명령어가 실행되거나 프로세스가 신호를 수신한 후에야 작동합니다.
해당하는 기능은 PEP 768과 새로운
sys.remote_exec()함수를 사용하여 원격 프로세스에 연결하고 PDB 명령을 그 프로세스로 보냅니다.(Matt Wozniski와 Pablo Galindo가 gh-131591를 통해 기능을 구현하였습니다.)
하드코딩된 중단점(
breakpoint()및set_trace())은 이제 매번 새로운Pdb인스턴스를 생성하는 대신,set_trace()를 호출한 가장 최근의 인스턴스를 재사용합니다. 그 결과display및commands같은 모든 인스턴스별 데이터가 하드코딩된 중단점 간에 유지됩니다. (Tian Gao가 gh-121450를 통해 기능을 구현하였습니다.)pdb.Pdb클래스에 새로운 인자 mode를 추가하였습니다.pdb가 inline 모드일 때 restart 명령을 비활성화하였습니다. (Tian Gao가 gh-123757를 통해 기능을 구현하였습니다.)사용자가 inline 모드에서
pdb를 종료하려고 할 때 확인 프롬프트가 표시됩니다. y, Y, <Enter> 혹은 EOF는bdb.BdbQuit를 발생시키는 대신 종료를 확인하고sys.exit()를 호출합니다. (Tian Gao가 gh-124704를 통해 기능을 구현하였습니다.)breakpoint()혹은pdb.set_trace()같은 인라인 중단점은 skip 패턴이 있더라도 이를 무시하고 항상 호출 프레임에서 프로그램을 중지합니다. (Tian Gao가 gh-130493를 통해 기능을 구현하였습니다.)pdb다중 행 입력에서 줄 시작 부분에 <tab>을 입력하면 이제 t 문자를 삽입하는 대신 4칸 공백 들여쓰기가 채워집니다. (Tian Gao가 gh-130471를 통해 기능을 구현하였습니다.)pdb다중 행 입력에 자동 들여쓰기가 도입되었습니다. 자동 들여쓰기는 마지막 줄의 들여쓰기를 유지하거나, 새로운 코드 블록을 감지하면 4칸 공백 들여쓰기를 삽입합니다. (Tian Gao가 gh-133350를 통해 기능을 구현하였습니다.)해당하는 경우 현재 asyncio 태스크에 액세스할 수 있도록 $_asynctask가 추가되었습니다. (Tian Gao가 gh-124367를 통해 기능을 구현하였습니다.)
asyncio 코루틴 디버깅을 지원하기 위해
pdb.set_trace_async()함수가 추가되었습니다. 해당하는 함수에서는await문장이 지원됩니다. (Tian Gao가 gh-132576를 통해 기능을 구현하였습니다.)pdb에서 표시되는 소스 코드는 문법 강조됩니다. 해당하는 기능은 새로 추가된pdb.Pdb클래스의 colorize 인자뿐만 아니라, 기본 대화형 셸과 동일한 메서드들로도 제어할 수 있습니다. (Tian Gao와 Łukasz Langa가 gh-133355를 통해 기능을 구현하였습니다.)
pickle¶
pickle모듈의 기본 프로토콜 버전을 5로 설정하였습니다. 자세한 내용은 pickle 프로토콜을 참조해주시기를 부탁드립니다.에러의 발생 소스를 식별할 수 있도록 pickle 직렬화 에러에 예외 노트를 추가하였습니다. (Serhiy Storchaka가 gh-122213를 통해 기능을 구현하였습니다.)
platform¶
platform모듈에서 캐시된 결과를 무효화하는 함수인invalidate_caches()를 추가하였습니다. (Bénédikt Tran이 gh-122549를 통해 기능을 구현하였습니다.)
pydoc¶
re¶
socket¶
Bluetooth 소켓 지원을 개선하고 수정하였습니다.
NetBSD 및 DragonFly BSD에서 Bluetooth 소켓 지원을 수정하였습니다. (Serhiy Storchaka가 gh-132429를 통해 기능을 구현하였습니다.)
FreeBSD에서
BTPROTO_HCI지원을 수정하였습니다. (Victor Stinner가 gh-111178를 통해 기능을 구현하였습니다.)FreeBSD에서
BTPROTO_SCO지원을 추가하였습니다. (Serhiy Storchaka가 gh-85302를 통해 기능을 구현하였습니다.)FreeBSD에서
BTPROTO_L2CAP주소의 cid 및 bdaddr_type 지원을 추가하였습니다. (Serhiy Storchaka가 gh-132429를 통해 기능을 구현하였습니다.)Linux에서
BTPROTO_HCI주소의 channel 지원을 추가하였습니다. (Serhiy Storchaka가 gh-70145를 통해 기능을 구현하였습니다.)Linux에서
BTPROTO_HCI의 주소로 정수를 허용합니다. (Serhiy Storchaka가 gh-132099를 통해 기능을 구현하였습니다.)BTPROTO_L2CAP에 대해getsockname()에서 cid를 반환합니다. (Serhiy Storchaka가 gh-132429를 통해 기능을 구현하였습니다.)많은 새로운 상수를 추가하였습니다. (Serhiy Storchaka가 gh-132734를 통해 기능을 구현하였습니다.)
ssl¶
struct¶
symtable¶
sys¶
특수화된 파이썬 빌드에만 존재하는, 이전에는 문서화되지 않았던 특수 함수
sys.getobjects()는 이제 호출된 인터프리터가 아닌 다른 인터프리터의 객체를 반환할 수 있습니다. (Eric Snow가 gh-125286를 통해 기능을 구현하였습니다.)객체가 불멸인지 판별하기 위한
sys._is_immortal()를 추가하였습니다. (Peter Bierma가 gh-128509를 통해 기능을 구현하였습니다.)FreeBSD에서
sys.platform는 더 이상 주된 버전의 번호를 포함하지 않습니다. ‘freebsd13’ 혹은 ‘freebsd14’ 대신 항상 ‘freebsd’입니다. (Michael Osipov가 gh-129393를 통해 기능을 구현하였습니다.)sys._clear_type_cache()함수에 대해DeprecationWarning를 발생시킵니다. 해당하는 함수는 파이썬 3.13에서 폐지되었지만, 런타임 경고를 발생시키지 않았습니다.새로운 외부 디버거 인터페이스를 구현하기 위해
sys.remote_exec()를 추가하였습니다. 자세한 내용은 PEP 768를 참조해주시기를 부탁드립니다. (Pablo Galindo Salgado, Matt Wozniski, 그리고 Ivona Stojanovic이 gh-131591를 통해 기능을 구현하였습니다.)JIT 컴파일을 인트로스펙션하기 위한 유틸리티를 포함하는
sys._jit이름 공간을 추가하였습니다. (Brandt Bucher가 gh-133231를 통해 기능을 구현하였습니다.)
sys.monitoring¶
두 개의 새 모니터링 이벤트
BRANCH_LEFT및BRANCH_RIGHT를 추가하였습니다. 해당하는 이벤트들은BRANCH이벤트를 대체하며, 해당 이벤트는 폐지되었습니다. (Mark Shannon이 gh-122548를 통해 기능을 구현하였습니다.)
sysconfig¶
윈도우에서
get_config_vars()함수에 ABIFLAGS 키를 추가하였습니다. (Xuehai Pan이 gh-131799를 통해 기능을 구현하였습니다.)
tarfile¶
data_filter()는 이제 경로 탐색 공격을 방지하기 위해 심볼릭 링크 대상을 정규화합니다. (Petr Viktorin이 gh-127987 및 CVE 2025-4138를 통해 기능을 구현하였습니다.)extractall()은 디렉터리가 제거되었거나 다른 종류의 파일로 대체된 경우 이제 디렉터리 어트리뷰트 수정을 건너뜁니다. (Petr Viktorin이 gh-127987 및 CVE 2024-12718를 통해 기능을 구현하였습니다.)extract()및extractall()은 이제 링크(하드 링크 혹은 심볼릭 링크)를 다른 아카이브 멤버의 사본으로 대체할 때와 디렉터리 어트리뷰트를 수정할 때 추출 필터를 (재)적용합니다. 전자의 경우 새 예외LinkFallbackError를 발생시킵니다. (Petr Viktorin이 CVE 2025-4330 및 CVE 2024-12718를 위해 기능을 구현하였습니다.)extract()및extractall()은errorlevel()이 0일 때 거부된 멤버를 더 이상 추출하지 않습니다. (Matt Prodani와 Petr Viktorin이 gh-112887 및 CVE 2025-4435를 통해 기능을 구현하였습니다.)
threading¶
threading.Thread.start()는 이제 운영 체제 스레드 이름을threading.Thread.name으로 설정합니다. (Victor Stinner가 gh-59705를 통해 기능을 구현하였습니다.)
tkinter¶
turtle¶
turtle.fill(),turtle.poly(), 그리고turtle.no_animation()에 대한 컨텍스트 관리자를 추가하였습니다. (Marie Roald와 Yngve Mardal Moe가 gh-126350를 통해 기능을 구현하였습니다.)
types¶
types.UnionType은 이제typing.Union의 에일리어스입니다. 자세한 내용은 아래를 참조해주시기를 부탁드립니다. (Jelle Zijlstra가 gh-105499를 통해 기능을 구현하였습니다.)
typing¶
types.UnionType및typing.Union형은 이제 서로의 에일리어스입니다. 즉, 이전 스타일의 유니언(Union[int, str]로 생성됨)과 새로운 스타일의 유니언(int | str)이 모두 이제 같은 런타임 형의 인스턴스를 생성합니다. 이로써 두 문법 사이의 동작은 통합되지만, 런타임에 형을 인트로스펙션하는 사용자에게 영향을 줄 수 있는 몇 가지 동작 차이가 생깁니다:유니언을 생성하는 두 문법은 이제 모두
repr()에서 같은 문자열 표현을 생성합니다. 예를 들어, repr(Union[int, str])는 이제 “typing.Union[int, str]” 대신 “int | str”입니다.이전 문법을 사용해 생성한 유니언은 더 이상 캐시되지 않습니다. 이전에는 Union[int, str]을 여러 번 실행하면 같은 객체가 반환되었습니다. 즉, Union[int, str] is Union[int, str]가 True였습니다. 그러나 이제는 서로 다른 두 객체를 반환합니다. 유니언의 동등성을 비교할 때는 is가 아니라 ==를 사용해주시기를 부탁드립니다. 새로운 스타일의 유니언은 이런 방식으로 캐시된 적이 없습니다. 해당하는 변경으로 인해 typing.Union을 서브스크립팅하여 생성한 많은 수의 유니언을 사용하는 일부 프로그램의 메모리 사용량이 증가할 수 있습니다. 그러나 여러 요인이 이 비용을 상쇄합니다. PEP 649 때문에 파이썬 3.14에서는 어노테이션에 사용된 유니언의 값이 더 이상 기본적으로 구해지지 않으며,
types.UnionType인스턴스 자체는 이전 파이썬 버전에서 Union[]이 반환하던 객체보다 훨씬 작고, 캐시를 제거하면 약간의 공간도 절약됩니다. 따라서 이 변경으로 대부분의 사용자에게 메모리 사용량이 크게 증가할 가능성은 낮습니다.이전에는 이전 스타일의 유니언이 비공개 클래스 typing._UnionGenericAlias를 사용해 구현되었습니다. 해당하는 클래스는 구현에 더 이상 필요하지 않지만, 하위 호환성을 위해 유지되어 왔으며 파이썬 3.17에서 제거될 예정입니다. 사용자는 비공개 구현 세부 사항에 의존하는 대신
get_origin()및typing.get_args()같은 문서화된 인트로스펙션 도우미를 사용해주시기를 부탁드립니다.이제
typing.Union자체를isinstance()검사에 사용할 수 있습니다. 예를 들어, isinstance(int | str, typing.Union)는 True를 반환합니다. 이전에는 해당하는 코드가TypeError를 발생시켰습니다.typing.Union객체의__args__어트리뷰트는 더 이상 쓰기 가능하지 않습니다.Union객체에 더 이상 어떤 어트리뷰트도 설정할 수 없습니다. 해당하는 동작은 이전 버전에서도 던더(dunder) 어트리뷰트에 대해서만 가능했으며, 작동한다고 문서화된 적이 없고, 많은 경우에 미묘하게 깨져 있었습니다.
(Jelle Zijlstra가 gh-105499를 통해 기능을 구현하였습니다.)
TypeAliasType는 이제 스타 언패킹을 지원합니다.
unicodedata¶
유니코드 데이터베이스가 유니코드 16.0.0으로 업데이트되었습니다.
unittest¶
unittest의 출력에는 이제 기본적으로 색상이 적용됩니다. 해당하는 기능은 환경 변수를 통해 제어할 수 있습니다. (Hugo van Kemenade가 gh-127221를 통해 기능을 구현하였습니다.)unittest의 테스트 발견 기능은 이름 공간 패키지를 다시 시작 디렉터리로 지원합니다. 해당 지원은 파이썬 3.11에서 제거되었습니다. (Jacob Walls가 gh-80958를 통해 기능을 구현하였습니다.)
TestCase클래스에 더 특화된 테스트를 제공하는 여러 새로운 메서드가 추가되었습니다.assertHasAttr()와assertNotHasAttr()는 객체에 특정 어트리뷰트가 있는지 검사합니다.assertIsSubclass()와assertNotIsSubclass()는 객체가 특정 클래스나 클래스 튜플에 포함된 클래스 중 하나의 하위 클래스인지 검사합니다.assertStartsWith(),assertNotStartsWith(),assertEndsWith()및assertNotEndsWith()는 유니코드 문자열 혹은 바이트열이 특정 문자열로 시작하거나 끝나는지 검사합니다.
(Serhiy Storchaka가 gh-71339를 통해 기능을 구현하였습니다.)
urllib¶
urllib.request의 HTTP 다이제스트 인증 알고리즘을 RFC 7616에 지정된 SHA-256 다이제스트 인증을 지원하도록 업그레이드하였습니다. (Calvin Bui가 gh-128193를 통해 기능을 구현하였습니다.)file: URL을 파싱하고 내보낼 때 사용 편의성과 표준 준수성을 개선하였습니다.
새로운 require_scheme 인자를 참으로 설정하면 완전한 URL을 허용합니다.
URL 권한이 로컬 호스트명과 일치하면 이를 버립니다.
새로운 resolve_host 인자를 참으로 설정했을 때 URL 권한이 로컬 IP 주소로 해석되면 이를 버립니다.
URL 쿼리 및 프래그먼트 구성 요소를 버립니다.
URL 권한이 로컬이 아니면
URLError를 발생시킵니다. 단, 윈도우에서는 이전처럼 UNC 경로를 반환합니다.
새로운 add_scheme 인자를 참으로 설정하면 완전한 URL을 반환합니다.
경로가 슬래시로 시작하면 빈 URL 권한을 포함합니다. 예를 들어, 경로 /etc/hosts는 URL ///etc/hosts로 변환됩니다.
윈도우에서는 드라이브 문자가 더 이상 대문자로 변환되지 않으며, 드라이브 문자 뒤에 오지 않는 : 문자는 더 이상
OSError예외를 발생시키지 않습니다.(Barney Gale이 gh-125866를 통해 기능을 구현하였습니다.)
uuid¶
RFC 9562에 지정된 대로
uuid6(),uuid7()및uuid8()를 통해 각각 UUID 버전 6, 7 및 8에 대한 지원을 추가하였습니다. (Bénédikt Tran이 gh-89083를 통해 기능을 구현하였습니다.)NIL과MAX는 이제 RFC 9562에 정의된 Nil 및 Max UUID 형식을 나타내는 데 사용할 수 있습니다. (Nick Pope가 gh-128427를 통해 기능을 구현하였습니다.)python -m uuid --count를 통해 명령줄에서 여러 UUID를 동시에 생성할 수 있습니다. (Simon Legner가 gh-131236를 통해 기능을 구현하였습니다.)
webbrowser¶
BROWSER환경 변수에 지정된 이름은 이제 항상 새로운 브라우저 명령을 생성하는 대신webbrowser모듈에 이미 등록된 브라우저를 참조할 수 있습니다.이를 통해 macOS에서
BROWSER를 지원되는 브라우저 중 하나의 값으로 설정할 수 있습니다.
zipfile¶
ZipFile.writestr에서 사용하는ZipInfo객체의 적절한 기본값을 결정하는 메서드인ZipInfo._for_archive가 추가되었습니다. (Bénédikt Tran이 gh-123424를 통해 기능을 구현하였습니다.)ZipFile.writestr()는 이제 재현 가능한 빌드를 더 잘 지원하기 위해SOURCE_DATE_EPOCH환경 변수를 따릅니다. (Jiahao Li가 gh-91279를 통해 기능을 구현하였습니다.)
최적화된 점¶
여러 표준 라이브러리 모듈의 임포트 시간이 개선되었습니다. 여기에는
annotationlib,ast,asyncio,base64,cmd,csv,gettext,importlib.util,locale,mimetypes,optparse,pickle,pprint,pstats,shlex,socket,string,subprocess,threading,tomllib,types, 그리고zipfile가 포함됩니다.(Adam Turner, Bénédikt Tran, Chris Markiewicz, Eli Schwartz, Hugo van Kemenade, Jelle Zijlstra 등이 gh-118761를 통해 기능을 구현하였습니다.)
인터프리터는 이제 안전한 경우 내부적으로 일부 참조 횟수 변경을 피합니다. 이로 인해 이전 버전의 파이썬과 비교했을 때
sys.getrefcount()및Py_REFCNT()에서 반환되는 값이 달라질 수 있습니다. 자세한 내용은 아래를 참조해주시기를 부탁드립니다.
asyncio¶
표준 벤치마크 결과는
네이티브 태스크를 위한 새로운 스레드별 이중 연결 리스트가 구현됨에 따라 10-20% 개선되었고, 메모리 사용량도 줄었습니다. 이를 통해 python -m asyncio pstree와 같은 외부 인트로스펙션 도구가 모든 스레드에서 실행 중인 asyncio 태스크의 호출 그래프를 인트로스펙션할 수 있습니다. (Kumar Aditya가 gh-107803를 통해 기능을 구현하였습니다.)해당하는 모듈은 이제 자유 스레딩 빌드를 첫 번째 우선 순위로 지원합니다. 이를 통해 서로 다른 스레드의 여러 이벤트 루프를 병렬로 실행할 수 있으며, 스레드 수에 따라 선형적으로 확장됩니다. (Kumar Aditya가 gh-128002를 통해 기능을 구현하였습니다.)
base64¶
b16decode()는 이제 최대 6배 빨라졌습니다. (Bénédikt Tran, Chris Markiewicz와 Adam Turner가 gh-118761를 통해 기능을 구현하였습니다.)
bdb¶
기본 디버거에는 이제
sys.monitoring기반 백엔드가 있으며,Bdb클래스의 새로운 backend 매개변수에 ‘monitoring’을 전달하여 이를 선택할 수 있습니다. (Tian Gao가 gh-124533를 통해 기능을 구현하였습니다.)
difflib¶
IS_LINE_JUNK()함수는 이제 최대 2배 빨라졌습니다. (Adam Turner와 Semyon Moroz가 gh-130167를 통해 기능을 구현하였습니다.)
gc¶
From Python 3.14.5 onwards:
Python 3.14.0-3.14.4 shipped with a new incremental garbage collector. However, due to a number of reports of significant memory pressure in production environments, it has been reverted back to the generational GC from 3.13. This is the GC now used in Python 3.14.5 and later.
Previously in Python 3.14.0-3.14.4:
새로운 점진적인 가비지 수거기로 인해 더 큰 힙에서는 최대 일시 중지 시간이 10배 이상 줄어듭니다.
해당하는 최적화로 인해
get_threshold()와set_threshold()의 결과 의미가 변경되었으며,get_count()와get_stats()의 결과 의미도 함께 변경되었습니다.하위 호환성을 위해
get_threshold()는 계속 세 항목 튜플을 반환합니다. 첫 번째 값은 이전과 마찬가지로 젊은 컬렉션의 임계값입니다. 두 번째 값은 오래된 컬렉션이 스캔되는 비율을 결정합니다(기본값은 10이며, 값이 클수록 오래된 컬렉션이 더 천천히 스캔됨을 의미합니다). 세 번째 값은 이제 의미가 없으며 항상 0입니다.set_threshold()는 이제 두 번째 이후의 항목을 모두 무시합니다.get_count()와get_stats()는 계속 같은 형식의 결과를 반환합니다. 유일한 차이점은 결과가 젊은 세대, 노화 세대, 오래된 세대를 가리키는 대신, 젊은 세대와 오래된 세대의 오래된 공간 및 수거 공간을 가리킨다는 점입니다.
요약하면, 순환 가비지 수거의 동작을 조작하려고 한 코드는 의도한 대로 정확히 작동하지 않을 수 있지만, 해로울 가능성은 매우 낮습니다. 그 밖의 모든 코드는 정상적으로 작동합니다.
(Mark Shannon이 gh-108362를 통해 기능을 구현하였습니다.)
io¶
pathlib¶
Path.read_bytes는 이제 버퍼링되지 않는 모드로 파일을 엽니다. 이를 통해, 전체 읽기 속도가 9%에서 17%까지 빨라졌습니다. (Cody Maloney가 gh-120754를 통해 기능을 구현하였습니다.)
pdb¶
pdb는 이제sys.settrace()혹은sys.monitoring기반의 두 백엔드를 지원합니다. pdb CLI 혹은breakpoint()를 사용하면 항상sys.monitoring백엔드가 사용됩니다.pdb.Pdb와 그 파생 클래스를 명시적으로 인스턴스화하면 기본적으로sys.settrace()백엔드를 사용하며, 해당하는 동작은 구성할 수 있습니다. (Tian Gao가 gh-124533를 통해 기능을 구현하였습니다.)
textwrap¶
Optimize the
dedent()function, improving performance by an average of 2.4x, with larger improvements for bigger inputs, and fix a bug with incomplete normalization of blank lines with whitespace characters other than space and tab.
uuid¶
zlib¶
삭제된 항목들¶
argparse¶
BooleanOptionalAction의 type, choices, metavar 매개변수를 제거합니다. 해당하는 매개변수들은 파이썬 3.12부터 폐지되었습니다. (Nikita Sobolev가 gh-118805를 통해 기능을 구현하였습니다.)인자 그룹에서
add_argument_group()를 호출하면 이제ValueError가 발생합니다. 마찬가지로, 상호 배타적 그룹에서add_argument_group()나add_mutually_exclusive_group()를 호출해도 이제 둘 다ValueError가 발생합니다. 해당하는 ‘중첩’은 지원된 적이 없으며, 올바르게 작동하지 않는 경우가 많았고, 상속을 통해 의도치 않게 노출되었습니다. 해당하는 기능은 파이썬 3.11부터 폐지되었습니다. (Savannah Ostrowski가 gh-127186를 통해 기능을 구현하였습니다.)
ast¶
파이썬 3.8부터
Constant의 폐지된 에일리어스였으며 파이썬 3.12부터 폐지 경고를 발생시켜 온 다음 클래스들을 제거합니다:BytesEllipsisNameConstantNumStr
이러한 제거의 결과로, 커스텀
NodeVisitor하위 클래스에 정의된 사용자 정의 visit_Num, visit_Str, visit_Bytes, visit_NameConstant 및 visit_Ellipsis 메서드들은NodeVisitor하위 클래스가 AST를 방문할 때 더 이상 호출되지 않습니다. 대신 visit_Constant 메서드를 정의해주시기를 부탁드립니다.(Alex Waygood이 gh-119562를 통해 기능을 구현하였습니다.)
이제 제거된 AST 클래스와의 호환성을 위해
ast.Constant에 존재했던 다음 폐지된 프로퍼티들을 제거합니다:Constant.nConstant.s
대신
Constant.value를 사용해주시기를 부탁드립니다. (Alex Waygood이 gh-119562를 통해 기능을 구현하였습니다.)
asyncio¶
파이썬 3.12부터 폐지되었던, 다음과 같은 클래스, 메서드, 함수들을 제거합니다:
AbstractChildWatcherFastChildWatcherMultiLoopChildWatcherPidfdChildWatcherSafeChildWatcherThreadedChildWatcherAbstractEventLoopPolicy.get_child_watcher()AbstractEventLoopPolicy.set_child_watcher()get_child_watcher()set_child_watcher()
(Kumar Aditya가 gh-120804를 통해 기능을 구현하였습니다.)
asyncio.get_event_loop()는 이제 현재의 이벤트 루프가 없으면RuntimeError를 발생시키며, 더 이상 묵시적인 방식으로 이벤트 루프를 생성하지 않습니다.(Kumar Aditya가 gh-126353를 통해 기능을 구현하였습니다.)
asyncio.get_event_loop()를 사용하는 몇 가지 패턴이 있으며, 그 대부분은asyncio.run()으로 대체할 수 있습니다.비동기 함수를 실행하는 경우에는 단순히
asyncio.run()를 사용해주시기를 부탁드립니다.이전 방식:
async def main(): ... loop = asyncio.get_event_loop() try: loop.run_until_complete(main()) finally: loop.close()
현재의 방식:
async def main(): ... asyncio.run(main())
예를 들어, 소켓에서 수신 대기하는 서버처럼 무언가를 시작한 다음 계속 실행해야 하는 경우에는
asyncio.run()과asyncio.Event를 사용해주시기를 부탁드립니다.이전 방식:
def start_server(loop): ... loop = asyncio.get_event_loop() try: start_server(loop) loop.run_forever() finally: loop.close()
현재의 방식:
def start_server(loop): ... async def main(): start_server(asyncio.get_running_loop()) await asyncio.Event().wait() asyncio.run(main())
이벤트 루프에서 무언가를 실행한 뒤 그 주변에 차단 코드를 실행해야 하는 경우에는
asyncio.Runner를 사용해주시기를 부탁드립니다.이전 방식:
async def operation_one(): ... def blocking_code(): ... async def operation_two(): ... loop = asyncio.get_event_loop() try: loop.run_until_complete(operation_one()) blocking_code() loop.run_until_complete(operation_two()) finally: loop.close()
현재의 방식:
async def operation_one(): ... def blocking_code(): ... async def operation_two(): ... with asyncio.Runner() as runner: runner.run(operation_one()) blocking_code() runner.run(operation_two())
email¶
파이썬 3.12에서 폐지되었고 그 이후로 무시되어 온
email.utils.localtime()함수의 isdst 매개변수가 제거되었습니다. (Hugo van Kemenade가 gh-118798를 통해 기능을 구현하였습니다.)
importlib.abc¶
폐지된
importlib.abc클래스들이 제거되었습니다:ResourceReader(TraversableResources를 사용해주시기를 부탁드립니다)Traversable(Traversable를 사용해주시기를 부탁드립니다)TraversableResources(TraversableResources를 사용해주시기를 부탁드립니다)
(Jason R. Coombs와 Hugo van Kemenade가 gh-93963를 통해 기능을 구현하였습니다.)
itertools¶
itertools이터레이터에서 copy, deepcopy 및 pickle 연산에 대한 지원이 제거되었습니다. 해당하는 연산은 파이썬 3.12부터DeprecationWarning을 발생시켜 왔습니다. (Raymond Hettinger가 gh-101588를 통해 기능을 구현하였습니다.)
pathlib¶
Path에 추가 키워드 인자를 전달하는 기능 지원이 제거되었습니다. 이전 버전에서는 이러한 인자들이 무시되었습니다. (Barney Gale가 gh-74033를 통해 기능을 구현하였습니다.)PurePath.relative_to()와is_relative_to()에 추가 위치 인자를 전달하는 기능 지원이 제거되었습니다. 이전 버전에서는 이러한 인자들이 other에 이어 붙여졌습니다. (Barney Gale가 gh-78707를 통해 기능을 구현하였습니다.)
pkgutil¶
파이썬 3.12부터 폐지된
get_loader()와find_loader()함수들이 제거되었습니다. (Bénédikt Tran가 gh-97850를 통해 기능을 구현하였습니다.)
pty¶
파이썬 3.12부터 폐지된
master_open()와slave_open()함수들이 제거되었습니다. 대신pty.openpty()를 사용해주시기를 부탁드립니다. (Nikita Sobolev가 gh-118824를 통해 기능을 구현하였습니다.)
sqlite3¶
sqlite3모듈에서version과version_info가 제거되었습니다. 런타임 SQLite 라이브러리의 실제 버전 번호에는sqlite_version과sqlite_version_info를 사용해주시기를 부탁드립니다. (Hugo van Kemenade가 gh-118924를 통해 기능을 구현하였습니다.)이름있는 자리 표시자와 함께 매개변수 시퀀스를 사용하면 이제
ProgrammingError가 발생합니다. 해당하는 방식은 파이썬 3.12부터 폐지되었습니다. (Erlend E. Aasland가 gh-118928와 gh-101693를 통해 기능을 구현하였습니다.)
urllib¶
urllib.parse모듈에서 파이썬 3.11부터 폐지된Quoter클래스가 제거되었습니다. (Nikita Sobolev가 gh-118827를 통해 기능을 구현하였습니다.)urllib.request모듈에서 파이썬 3.3부터 폐지되었던URLopener및FancyURLopener클래스가 제거되었습니다.myopener.open()는urlopen()로 대체될 수 있습니다.myopener.retrieve()은urlretrieve()로 대체될 수 있습니다. 오프너 클래스에 대한 사용자 정의는 사용자 정의 핸들러를build_opener()으로 전달하여 대체될 수 있습니다 (Barney Gale이 gh-84850를 통해 기능을 구현하였습니다).
폐지된 항목들¶
새로운 폐지 사항들¶
complex()생성자의 real 혹은 imag 인자로 복소수를 전달하는 방식은 이제 폐지되었습니다. 복소수는 단일 위치 인자로만 전달해야 합니다. (Serhiy Storchaka가 gh-109218를 통해 기능을 구현하였습니다.)-
add_argument_group()메서드에 문서화되지 않은 키워드 인자 prefix_chars를 전달하는 방식은 이제 폐지되었습니다. (Savannah Ostrowski가 gh-125563를 통해 기능을 구현하였습니다.)argparse.FileType형 변환기가 폐지되었습니다. 리소스 관리와 관련된 모든 것은 인자가 파싱된 후 하위 단계에서 처리되어야 합니다. (Serhiy Storchaka가 gh-58032를 통해 기능을 구현하였습니다.)
-
asyncio.iscoroutinefunction()은 이제 폐지되었으며 파이썬 3.16에서 제거될 예정입니다. 대신inspect.iscoroutinefunction()함수를 사용해주시기를 부탁드립니다. (Jiahao Li와 Kumar Aditya가 gh-122875를 통해 기능을 구현하였습니다.)asyncio정책 시스템은 폐지되었으며 파이썬 3.16에서 제거될 예정입니다. 다음 클래스와 함수들은 폐지되었습니다:원하는 이벤트 루프 구현을 사용하려면 loop_factory 인자와 함께
asyncio.run()함수 혹은asyncio.Runner클래스를 사용해야 합니다.예를 들어, 윈도우에서
asyncio.SelectorEventLoop클래스를 사용하려면:import asyncio async def main(): ... asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
(Kumar Aditya가 gh-127949를 통해 기여하였습니다.)
codecs:codecs.open()함수는 이제 폐지되었으며, 향후 파이썬 버전에서 제거될 예정입니다. 대신open()함수를 사용해주시기를 부탁드립니다. (Inada Naoki가 gh-133036를 통해 기능을 구현하였습니다.)-
윈도우가 아닌 플랫폼에서 MSVC 호환 기본 메모리 레이아웃을 사용하기 위해
Structure._pack_를 설정하는 방식은 이제 폐지되었습니다. 대신Structure._layout_를 ‘ms’로 설정하는 방식을 사용해야 하며, 해당하는 폐지된 방식은 파이썬 3.19에서 제거될 예정입니다. (Petr Viktorin이 gh-131747를 통해 기능을 구현하였습니다.)ctypes.POINTER()함수를 문자열과 함께 호출하는 방식은 이제 폐지되었습니다. 자기 참조 구조에는 미완성 형을 사용해주시기를 부탁드립니다. 또한 내부 ctypes._pointer_type_cache도 폐지되었습니다. 업데이트된 구현 세부 사항은ctypes.POINTER()함수를 참조해주시기를 부탁드립니다. (Sergey Myrianov가 gh-100926를 통해 기능을 구현하였습니다.)
functools:functools.reduce()함수의 파이썬 구현을 호출할 때 function 혹은 sequence를 키워드 인자로 사용하는 방식은 이제 폐지되었습니다. 해당하는 매개변수들은 파이썬 3.16에서 위치 전용 매개변수로 변경될 예정입니다. (Kirill Podoprigora가 gh-121676를 통해 기능을 구현하였습니다.)logging: strm 인자를 받는 커스텀 로깅 처리기의 지원은 이제 폐지되었으며 파이썬 3.16에서 제거될 예정입니다. 대신 stream 인자로 처리기를 정의해주시기를 부탁드립니다. (Mariusz Felisiak가 gh-115032를 통해 기능을 구현하였습니다.)mimetypes:mimetypes.MimeTypes.add_type()메서드에서 유효한 확장자는 빈 문자열이거나 ‘.’로 시작해야 합니다. 점으로 시작하지 않는 확장자는 폐지되었으며 파이썬 3.16에서ValueError를 발생시킵니다. (Hugo van Kemenade가 gh-75223를 통해 기능을 구현하였습니다.)nturl2path: 해당하는 모듈은 이제 폐지되었습니다. 대신urllib.request.url2pathname()및pathname2url()함수를 호출해주시기를 부탁드립니다. (Barney Gale이 gh-125866를 통해 기능을 구현하였습니다.)os:os.popen()및os.spawn*함수는 이제 약하게 폐지된 상태입니다. 해당하는 함수들은 더 이상 새 코드를 작성할 때 사용해서는 안 됩니다. 대신subprocess모듈을 사용하는 것이 권장됩니다. (Victor Stinner가 gh-120743를 통해 기능을 구현하였습니다.)pathlib:pathlib.PurePath.as_uri()는 이제 폐지되었으며 파이썬 3.19에서 제거될 예정입니다. 대신pathlib.Path.as_uri()메서드를 사용해주시기를 부탁드립니다. (Barney Gale가 gh-123599를 통해 기능을 구현하였습니다.)pdb: 문서화되지 않은 pdb.Pdb.curframe_locals 어트리뷰트는 이제 폐지된 읽기 전용 프로퍼티이며, 향후 파이썬 버전에서 제거될 예정입니다. PEP 667에 따라 파이썬 3.13에서 추가된 낮은 오버헤드의 동적 프레임 지역 변수 액세스 덕분에, 이전에 이 어트리뷰트에 저장되던 프레임 지역 변수 캐시 참조는 더 이상 필요하지 않습니다. 파생 디버거는 파이썬 3.13 및 이후 버전에서 pdb.Pdb.curframe.f_locals에 직접 액세스해야 합니다. (Tian Gao가 gh-124369와 gh-125951를 통해 기능을 구현하였습니다.)symtable: 관심 부족으로 인해symtable.Class.get_methods()메서드는 폐지되었으며 파이썬 3.16에서 제거될 예정입니다. (Bénédikt Tran이 gh-119698를 통해 기능을 구현하였습니다.)tkinter:tkinter.Variable클래스의trace_variable(),trace_vdelete(), 그리고trace_vinfo()메서드는 이제 폐지되었습니다. 대신trace_add(),trace_remove(), 그리고trace_info()메서드를 사용해주시기를 부탁드립니다. (Serhiy Storchaka가 gh-120220를 통해 기능을 구현하였습니다.)urllib.parse:parse_qsl()및parse_qs()함수에서 빈 문자열, 바이트열류 객체 및 None을 제외하고 0 및 [] 같은 거짓값을 가진 객체를 허용하는 방식은 이제 폐지되었습니다. (Serhiy Storchaka가 gh-116897를 통해 기능을 구현하였습니다.)
파이썬 3.15에서 제거 예정인 항목들¶
임포트 시스템:
모듈에
__cached__를 설정하면서__spec__.cached를 설정하지 않는 동작은 사용 지원 중단(deprecated)되었습니다. 파이썬 3.15부터는__cached__어트리뷰트가 임포트 시스템이나 표준 라이브러리에서 더 이상 설정 혹은 고려되지 않습니다. (gh-97879를 참고 부탁드립니다.)모듈에
__package__를 설정하는 동시에__spec__.parent를 설정하지 않는 방식의 사용은 사용 지원 중단(deprecated)되었습니다. 파이썬 3.15부터는__package__어트리뷰트가 임포트 시스템이나 표준 라이브러리에서 더 이상 설정 혹은 고려되지 않습니다. (gh-97879를 참고 부탁드립니다.)
-
문서화되지 않았던
ctypes.SetPointerType()함수는 파이썬 3.13부터 사용 지원 중단(deprecated)되었습니다.
-
오랫동안 거의 사용되지 않았던
CGIHTTPRequestHandler클래스는 파이썬 3.13부터 사용 지원 중단(deprecated)되었습니다. 직접적인 대체 수단은 없으나, 그 어떤 종류의 요청 처리를 수행하는 웹 서버 인터페이스도 CGI를 사용하는 것에 비해서는 보다 바람직하다는 점에 대해 유의 부탁드리고자 합니다.python -m http.server 명령줄 인터페이스의
--cgi플래그는 파이썬 3.13부터 사용 지원 중단(deprecated)되었습니다.
-
load_module() 메서드: 대신 exec_module()을 사용해주시기를 부탁드립니다.
-
getdefaultlocale()함수는 파이썬 3.11부터 사용 지원 중단(deprecated)되었습니다. 해당하는 함수는 파이썬 3.13(gh-90817)에서 제거될 예정이었으나, 파이썬 3.15로 제거의 일정이 연기되었습니다. 대신getlocale(),setlocale(), 그리고getencoding()를 사용해주시기를 부탁드립니다. (Hugo van Kemenade가 gh-111187를 통해 기능을 구현하였습니다.)
-
PurePath.is_reserved()는 파이썬 3.13부터 사용 지원 중단(deprecated)되었습니다. 윈도우에서 예약된 경로를 파악하기 위해서는os.path.isreserved()를 사용해주시기를 부탁드립니다.
-
java_ver()는 파이썬 3.13부터 사용 지원 중단(deprecated)되었습니다. 해당하는 함수는 Jython의 지원에만 유용할 수 있고, API가 혼란스럽고, 대부분의 경우에 대해 테스트되지 않았습니다.
-
sysconfig.is_python_build()의 check_home 인자는 파이썬 3.12부터 폐지되었습니다.
-
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.CodeType:co_lnotab에 대한 접근은 PEP 626을 통해 3.10부터 사용 지원 중단(deprecated)되었고 3.12에서 제거될 예정이었습니다만, 3.12에서DeprecationWarning이 추가되었습니다. 3.15에서 제거될 수 있습니다. (Nikita Sobolev가 gh-101866를 통해 기능을 구현하였습니다.)
-
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) 되었습니다.
-
load_module()메서드는 파이썬 3.10부터 사용 지원 중단(deprecated)되었습니다. 대신exec_module()를 사용해주시기를 부탁드립니다. (Jiahao Li가 gh-125746를 통해 기능을 구현하였습니다.)
파이썬 3.16에서 제거 예정인 항목들¶
임포트 시스템:
모듈에
__loader__를 설정하면서__spec__.loader를 설정하지 않는 방식의 사용에 대한 사용 지원이 중단(deprecated)되었습니다. 파이썬 3.16부터는 임포트 시스템과 표준 라이브러리가__loader__를 설정 혹은 참조하지 않습니다.
-
'u'포맷 코드(wchar_t)는 문서에서는 파이썬 3.3부터, 런타임에서는 파이썬 3.13부터 사용 지원이 중단(deprecated)되었습니다. 유니코드 문자에는 대신'w'포맷 코드(Py_UCS4)를 사용해주시기를 부탁드립니다.
-
asyncio.iscoroutinefunction()함수는 사용 지원이 중단(deprecated)되었으며 파이썬 3.16에서 제거될 예정입니다. 대신inspect.iscoroutinefunction()을 사용해주시기를 부탁드립니다. (Jiahao Li와 Kumar Aditya가 gh-122875를 통해 기능을 구현하였습니다.)asyncio정책 시스템은 사용 지원이 중단(deprecated)되었으며 파이썬 3.16에서 제거될 예정입니다. 다음 클래스와 함수의 사용 지원이 중단(deprecated)되었음에 유의해주십사 부탁드립니다:사용자는 원하는 이벤트 루프 구현을 사용하기 위해
asyncio.run()또는asyncio.Runner와 loop_factory를 함께 사용해야 합니다.예를 들어, 윈도우에서
asyncio.SelectorEventLoop을 사용하기 위해:import asyncio async def main(): ... asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
(Kumar Aditya가 gh-127949를 통해 기여하였습니다.)
-
논리(boolean) 타입에서의 비트별 반전 연산인 ~True 또는 ~False는 직관적이지 않은 결과인(-2, -1)를 출력하기 때문에 파이썬 3.12부터 사용 지원이 중단(deprecated)되었습니다. 논리(boolean) 값의 논리적 부정을 위해서는 대신 not x를 사용해주시기를 부탁드립니다. 정수 값의 비트별 반전이 실제로 필요한 몇 안되는 경우에 대한 필요에 있어서는, 명시적으로 int로 변환한 뒤 ~int(x)를 사용해주시기를 부탁드립니다.
-
파이썬 구현인
functools.reduce()함수에서 function 또는 sequence를 키워드 인자로 사용하는 것은 파이썬 3.14부터 사용 지원 중단(deprecated)되었습니다.
-
사용자 정의 로깅 처리기(custom logging handlers)의 strm 인자를 받는 방식의 사용은 사용 지원 중단(deprecated)되었으며 파이썬 3.16에서 제거될 예정입니다. 대신 stream 인자를 사용하여 처리기를 정의하는 방식으로 사용해주시기를 부탁드립니다. (Mariusz Felisiak가 gh-115032를 통해 기능을 구현하였습니다.)
-
mimetypes.MimeTypes.add_type()에서 유효한 확장자는 .으로 시작하거나 빈 문자열이어야 합니다. 점으로 시작하지 않는 확장자는 사용 지원 중단(deprecated)되었으며, 파이썬 3.16에서는ValueError를 발생시킵니다. (Hugo van Kemenade가 gh-75223를 통해 기능을 구현하였습니다.)
-
ExecError예외가 파이썬 3.14부터 사용 지원 중단(deprecated)되었습니다. 파이썬 3.4 이후로는shutil모듈의 어떤 함수에서도 사용되지 않았으며, 이제는RuntimeError의 다른 이름(alias)으로 간주됩니다.
-
Class.get_methods메서드는 파이썬 3.14부터 사용 지원 중단(deprecated)되었습니다.
sys:_enablelegacywindowsfsencoding()함수는 파이썬 3.13부터 사용 지원 중단(deprecated)되었습니다. 대신PYTHONLEGACYWINDOWSFSENCODING환경 변수를 사용해주시기를 부탁드립니다.
-
sysconfig.expand_makefile_vars()함수는 파이썬 3.14부터 사용 지원 중단(deprecated)되었습니다. 대신sysconfig.get_paths()의 vars 인자를 사용해주시기를 부탁드립니다.
-
문서화되지도 사용되지도 않고 있는
TarFile.tarfile어트리뷰트는 파이썬 3.13부터 사용 지원 중단(deprecated)되었습니다.
파이썬 3.17에서 제거 예정인 항목들¶
-
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를 통해 기능을 구현하였습니다.)
-
파이썬 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에서 제거 예정인 항목들¶
파이썬 3.19에서 제거 예정인 항목들¶
향후 보다 상위 버전의 제거 예정 항목들¶
다음의 API들은 향후 버전에서 제거될 예정이지만, 구체적인 제거 시점이 아직 정해지지는 않았습니다.
-
인자 그룹과 상호 배타적 인자 그룹을 중첩해서 사용하는 기능은 사용 지원 중단(deprecated)되었습니다.
문서화되지 않은 키워드 인자 prefix_chars를
add_argument_group()에 전달하는 방식의 사용이 사용 지원 중단(deprecated)되었습니다.argparse.FileType타입 변환기(type converter)가 사용 지원 중단(deprecated)되었습니다.
-
제너레이터에서 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()메서드를 사용해주시기를 부탁드립니다.-
utcnow(): 대신datetime.datetime.now(tz=datetime.UTC)메서드를 사용해주시기를 부탁드립니다.utcfromtimestamp(): usedatetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC).
gettext: 복수형 값(plural value)은 정수여야 합니다.-
cache_from_source()의 debug_override 매개 변수는 사용 지원 중단(deprecated)되었습니다. 대신 optimization 매개 변수를 사용해주시기를 부탁드립니다.
-
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_constantsandsre_parsemodules.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*optionsssl.OP_NO_TLS*optionsssl.PROTOCOL_SSLv3ssl.PROTOCOL_TLSssl.PROTOCOL_TLSv1ssl.PROTOCOL_TLSv1_1ssl.PROTOCOL_TLSv1_2ssl.TLSVersion.SSLv3ssl.TLSVersion.TLSv1ssl.TLSVersion.TLSv1_1
threading메서드:threading.Condition.notifyAll(): 대신notify_all()를 사용해주시기를 부탁드립니다.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._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 바이트 코드 변경 사항¶
BINARY_SUBSCR명령어가 NB_SUBSCR oparg를 사용하는BINARY_OP명령어로 대체되었습니다. (Irit Katriel이 gh-100239를 통해 기능을 구현하였습니다.)새로운
Interpolation및Template인스턴스를 각각 생성하기 위해BUILD_INTERPOLATION및BUILD_TEMPLATE명령어를 추가하였습니다. (Lysandros Nikolaou와 다른 기여자들이 gh-132661를 통해 기능을 구현하였습니다. PEP 750: 템플릿 문자열도 참조해주시기를 부탁드립니다.)BUILD_CONST_KEY_MAP명령어를 제거하였습니다. 대신BUILD_MAP를 사용해주시기를 부탁드립니다. (Mark Shannon이 gh-122160를 통해 기능을 구현하였습니다.)LOAD_ASSERTION_ERROR명령어를LOAD_COMMON_CONSTANT명령어로 대체하고,NotImplementedError를 로드할 수 있도록 지원을 추가하였습니다.인터프리터가 프레임의 참조가 스택에 로드된 참조보다 수명이 더 길다는 것을 증명할 수 있을 때 참조 횟수 추적 오버헤드를 줄이기 위해
LOAD_FAST_BORROW및LOAD_FAST_BORROW_LOAD_FAST_BORROW명령어를 추가하였습니다. (Matt Page가 gh-130704를 통해 기능을 구현하였습니다.)LOAD_SMALL_INT명령어를 추가하였습니다. 해당하는 명령어는 oparg와 같은 작은 정수를 스택에 푸시합니다.RETURN_CONST명령어는 더 이상 사용되지 않으므로 제거되었습니다. (Mark Shannon이 gh-125837를 통해 기능을 구현하였습니다.)새로운
LOAD_SPECIAL명령어를 추가하였습니다. 새로운 명령어를 사용하여with및async with문장의 코드를 생성합니다.BEFORE_WITH및BEFORE_ASYNC_WITH명령어는 제거되었습니다. (Mark Shannon이 gh-120507를 통해 기능을 구현하였습니다.)가상 이터레이터를 지원하기 위해
POP_ITER명령어를 추가하였습니다. (Mark Shannon이 gh-132554를 통해 기능을 구현하였습니다.)
의사 명령어¶
어노테이션의 지연 평가에서 부분적으로 실행되는 모듈 수준 어노테이션을 지원하기 위해
ANNOTATIONS_PLACEHOLDER의사 명령어를 추가하였습니다. (Jelle Zijlstra가 gh-130907를 통해 기능을 구현하였습니다.)인라인 캐시에서 액세스되는 함수 쌍(가드 함수와 특수화 함수)을 실행하는
BINARY_OP_EXTEND의사 명령어를 추가하였습니다. (Irit Katriel이 gh-100239를 통해 기능을 구현하였습니다.)CALL_KW에 대한 세 가지 특수화를 추가하였습니다.CALL_KW_PY는 파이썬 함수 호출에,CALL_KW_BOUND_METHOD는 바인딩된 메서드 호출에,CALL_KW_NON_PY는 그 외 모든 호출에 사용됩니다. (Mark Shannon이 gh-118093를 통해 기능을 구현하였습니다.)JUMP_IF_TRUE및JUMP_IF_FALSE의사 명령어를 추가하였습니다. 이들은 스택에 영향을 주지 않는 조건부 점프입니다. COPY 1, TO_BOOL, POP_JUMP_IF_TRUE/FALSE 시퀀스로 대체됩니다. (Irit Katriel이 gh-124285를 통해 기능을 구현하였습니다.)LOAD_CONST_MORTAL의사 명령어를 추가하였습니다. (Mark Shannon이 gh-128685를 통해 기능을 구현하였습니다.)LOAD_CONST_IMMORTAL의사 명령어를 추가하였습니다. 해당하는 명령어는LOAD_CONST와 같은 일을 하지만, 불멸 객체에 대해 더 효율적입니다. (Mark Shannon이 gh-125837를 통해 기능을 구현하였습니다.)NOT_TAKEN의사 명령어를 추가하였습니다. 해당하는 명령어는sys.monitoring에서 분기 이벤트(예를 들어,BRANCH_LEFT)를 기록하는 데 사용됩니다. (Mark Shannon이 gh-122548를 통해 기능을 구현하였습니다.)
C API의 변경 사항들¶
파이썬 구성 C API¶
C 구조체에 의존하지 않고 파이썬 초기화를 구성할 수 있으며 향후 ABI 호환 변경이 가능하도록 PyInitConfig C API를 추가하였습니다.
내장 확장 모듈을 추가하는 데 사용할 수 있는 PyInitConfig_AddModule()을 추가하여 PEP 587 PyConfig C API를 완성하였습니다. 해당하는 기능은 이전에 “inittab”이라고 불렸습니다.
PyConfig_Get() 및 PyConfig_Set() 함수를 추가하여 현재 런타임 구성을 가져오고 설정할 수 있게 하였습니다.
PEP 587 ‘파이썬 초기화 구성’은 파이썬 초기화를 구성하는 모든 방식을 통합하였습니다. 해당하는 PEP는 파이썬의 사전 초기화 구성과 초기화 구성을 하나의 API로 통합합니다. 또한 해당하는 PEP는 API를 더 단순화하기 위해, 두 가지 ‘Python’ 및 ‘Isolated’ 선택지(PEP 587) 대신 파이썬을 내장하기 위한 단일 선택지만 제공합니다.
더 저수준인 PEP 587 PyConfig API는 CPython 구현 세부 사항에 의도적으로 더 높은 수준으로 결합되어야 하는 사용 사례(예를 들어, 구성 메커니즘을 포함한 CPython CLI의 전체 기능을 에뮬레이트하는 경우)를 위해 계속 사용할 수 있습니다.
(Victor Stinner가 gh-107954를 통해 기능을 구현하였습니다.)
C API의 새로운 기능들¶
파이썬 버전 번호를 비트 패킹(bit-packing)하기 위한 두 개의 새 매크로인
Py_PACK_VERSION()및Py_PACK_FULL_VERSION()을 추가하였습니다. 이는Py_Version혹은PY_VERSION_HEX와 비교할 때 유용합니다. (Petr Viktorin이 gh-128629를 통해 기능을 구현하였습니다.)파이썬의 sep.join(iterable)와 유사한
PyBytes_Join(sep, iterable)함수를 추가하였습니다. (Victor Stinner가 gh-121645를 통해 기능을 구현하였습니다.)현재 런타임 파이썬 인터프리터의 구성을 조작하는 함수들을 추가하였습니다(PEP 741: 파이썬 구성 C API):
(Victor Stinner가 gh-107954를 통해 기능을 구현하였습니다.)
파이썬 초기화를 구성하는 함수들을 추가하였습니다(PEP 741: 파이썬 구성 C API):
(Victor Stinner가 gh-107954를 통해 기능을 구현하였습니다.)
Py_fopen()함수를 추가하였습니다. 해당하는 함수는 표준 Cfopen()함수와 유사하게 동작하지만, path 매개변수로 파이썬 객체를 받고 에러가 발생하면 예외를 설정합니다. 파일을 닫을 때는 이에 대응하는 새Py_fclose()함수를 사용해야 합니다. (Victor Stinner가 gh-127350를 통해 기능을 구현하였습니다.)버퍼의 해시값을 계산하여 반환하는
Py_HashBuffer()를 추가하였습니다. (Antoine Pitrou와 Victor Stinner가 gh-122854를 통해 기능을 구현하였습니다.)모듈을 임포트(import)하고 해당 모듈의 어트리뷰트를 가져오기 위한
PyImport_ImportModuleAttr()및PyImport_ImportModuleAttrString()보조 함수를 추가하였습니다. (Victor Stinner가 gh-128911를 통해 기능을 구현하였습니다.)PyIter_NextItem()함수를 추가하였습니다. 해당하는 함수는 반환값이 모호한PyIter_Next()를 대체합니다. (Irit Katriel과 Erlend Aasland가 gh-105201를 통해 기능을 구현하였습니다.)int객체의 부호를 얻기 위한PyLong_GetSign()함수를 추가하였습니다. (Sergey B Kirpichev가 gh-116560를 통해 기능을 구현하였습니다.)PyLongObject가 양수인지, 음수인지, 혹은 0인지 각각 확인하기 위한PyLong_IsPositive(),PyLong_IsNegative(), 그리고PyLong_IsZero()함수를 추가하였습니다. (James Roy와 Sergey B Kirpichev가 gh-126061를 통해 기능을 구현하였습니다.)C <stdint.h> 숫자를 파이썬
int객체로, 혹은 그 반대로 변환하는 새로운 함수들을 추가하였습니다:(Victor Stinner가 gh-120389를 통해 기능을 구현하였습니다.)
파이썬
int객체를 위한 새로운 임포트(import)와 익스포트 API를 추가하였습니다(PEP 757):(Sergey B Kirpichev와 Victor Stinner가 gh-102471를 통해 기능을 구현하였습니다.)
PyMonitoring_FireBranchLeftEvent()및PyMonitoring_FireBranchRightEvent()함수를 추가하였습니다. 해당 함수들은 각각BRANCH_LEFT및BRANCH_RIGHT이벤트를 생성합니다. (Mark Shannon이 gh-122548를 통해 기능을 구현하였습니다.)형을 불변으로 만들기 위한
PyType_Freeze()함수를 추가하였습니다. (Victor Stinner가 gh-121654를 통해 기능을 구현하였습니다.)슈퍼 클래스를 더 쉽게 식별하기 위한
PyType_GetBaseByToken()및Py_tp_token슬롯을 추가하였습니다. 이는 PEP 630에서 언급된 형 검사 문제를 해결하고자 하는 시도입니다. (gh-124153를 통해 기능이 구현되었습니다.)두 문자열이 같은지 검사하기 위한 새로운
PyUnicode_Equal()함수를 추가하였습니다. 해당하는 함수는 제한된 C API에도 추가되었습니다. (Victor Stinner가 gh-124502를 통해 기능을 구현하였습니다.)다음 함수들을 포함하는, 파이썬
str객체 생성을 위한 새로운PyUnicodeWriterAPI를 추가하였습니다:(Victor Stinner가 gh-119182를 통해 기능을 구현하였습니다.)
PyArg_ParseTuple()및 유사한 함수의 k 및 K 포맷은 이제 다른 모든 정수 포맷과 마찬가지로, 사용 가능한 경우__index__()를 사용합니다. (Serhiy Storchaka가 gh-112068를 통해 기능을 구현하였습니다.)C 정수에서 파이썬
bool객체를 생성하는Py_BuildValue()의 새로운 p 포맷 단위에 대한 지원을 추가하였습니다. (Pablo Galindo가 bpo-45325를 통해 기능을 구현하였습니다.)디버깅을 목적으로 객체가 불멸인지 확인하기 위한
PyUnstable_IsImmortal()을 추가하였습니다. (Peter Bierma가 gh-128509를 통해 기능을 구현하였습니다.)PEP 703에 설명된 대로 지연된 참조 횟수 추적을 활성화하기 위한
PyUnstable_Object_EnableDeferredRefcount()를 추가하였습니다.자유 스레딩 빌드에서 Py_REFCNT(op) == 1을 대체하기 위한
PyUnstable_Object_IsUniquelyReferenced()를 추가하였습니다. (Peter Bierma가 gh-133140를 통해 기능을 구현하였습니다.)PyUnstable_Object_IsUniqueReferencedTemporary()를 추가하였습니다. 해당하는 함수는 인터프리터의 피연산자 스택에 있는 객체가 유일한 임시 객체인지 확인하는 데 사용됩니다. 이는 C API 함수에 인자로 전달된 파이썬 객체에 대해Py_REFCNT()가 1인지 확인하는 작업을 일부 경우에 대체하는 데 사용할 수 있습니다. (Sam Gross가 gh-133164를 통해 기능을 구현하였습니다.)
제한된 C API의 변경 사항들¶
제한된 C API 버전 3.14 이상에서
Py_TYPE()및Py_REFCNT()는 이제 구현 세부 사항을 숨기기 위해 불투명한 함수 호출로 구현됩니다. (Victor Stinner가 gh-120600 및 gh-124127를 통해 기능을 구현하였습니다.)제한된 C API에서 항상 제대로 동작하지 않았기 때문에, 제한된 C API에서
PySequence_Fast_GET_SIZE,PySequence_Fast_GET_ITEM, 그리고PySequence_Fast_ITEMS매크로를 제거하였습니다. (Victor Stinner가 gh-91417를 통해 기능을 구현하였습니다.)
제거된 C API들¶
가변 베이스를 사용하여
불변 형을 만드는 것은 파이썬 3.12에서 폐지되었으며, 이제TypeError를 발생시킵니다. (Nikita Sobolev가 gh-119775를 통해 기능을 구현하였습니다.)파이썬 3.12에서 폐지되었던 PyDictObject.ma_version_tag 멤버를 제거하였습니다. 대신
PyDict_AddWatcher()API를 사용해주시기를 부탁드립니다. (Sam Gross가 gh-124296를 통해 기능을 구현하였습니다.)비공개 _Py_InitializeMain() 함수를 제거하였습니다. 해당하는 함수는 PEP 587을 통해 파이썬 3.8에 추가된 잠정 API였습니다. (Victor Stinner가 gh-129033를 통해 기능을 구현하였습니다.)
문서화되지 않은 API인
Py_C_RECURSION_LIMIT와PyThreadState.c_recursion_remaining을 제거하였습니다. 이들은 3.13에 추가되었으며, 폐지 절차 없이 제거되었습니다. C 코드에서 과도한 재귀 현상을 방지하려면Py_EnterRecursiveCall()을 사용해주시기를 부탁드립니다. (Petr Viktorin이 gh-133079를 통해 제거하였습니다. 또한 gh-130396도 참조해주시기를 부탁드립니다.)
사용 지원 중단(deprecated)된 C API들¶
Py_HUGE_VAL매크로는 이제 약하게 폐지된 상태입니다. 대신Py_INFINITY를 사용해주시기를 부탁드립니다. (Sergey B Kirpichev가 gh-120026를 통해 기능을 구현하였습니다.)Py_IS_NAN,Py_IS_INFINITY, 그리고Py_IS_FINITE매크로는 이제 약하게 폐지된 상태입니다. 대신 C99부터math.h에서 제공되는isnan,isinf, 그리고isfinite를 사용해주시기를 부탁드립니다. (Sergey B Kirpichev가 gh-119613를 통해 기능을 구현하였습니다.)items가 빌린 버퍼 혹은 빌린 참조를 저장하는 포맷 단위를 포함하는 경우, 튜플이 아닌 시퀀스를
PyArg_ParseTuple()및 기타 인자 파싱 함수에서 (items) 포맷 단위의 인자로 사용하는 것이 이제 폐지되었습니다. (Serhiy Storchaka가 gh-50333를 통해 기능을 구현하였습니다.)_PyMonitoring_FireBranchEvent 함수는 이제 폐지되었으며,
PyMonitoring_FireBranchLeftEvent()및PyMonitoring_FireBranchRightEvent()호출로 대체되어야 합니다.이전에 문서화되지 않았던
PySequence_In()함수는 이제 약하게 폐지된 상태입니다. 대신PySequence_Contains()를 사용해주시기를 부탁드립니다. (Yuki Kobayashi가 gh-127896를 통해 기능을 구현하였습니다.)
파이썬 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부터 활용되고 있지 않습니다.
빌드 변경 사항들¶
PEP 776: Emscripten은 이제 3단계 (Tier 3) 플랫폼으로 공식 지원됩니다. 해당하는 작업의 일환으로 Emscripten libc에서 25개가 넘는 버그가 수정되었습니다. Emscripten은 이제
ctypes,termios및fcntl모듈을 지원하며, 새로운 기본 대화형 셸에 대한 실험적 지원도 포함합니다. (R. Hood Chatham이 gh-127146, gh-127683 및 gh-136931를 통해 기능을 구현하였습니다.)공식 Android용 바이너리 릴리스가 이제 python.org에서 제공됩니다.
GNU Autoconf 2.72가 이제
configure를 생성하는 데 필요합니다. (Erlend Aasland가 gh-115765를 통해 기능을 구현하였습니다.)wasm32-unknown-emscripten은 이제 PEP 11에서 규정하는 3단계 (Tier 3) 플랫폼입니다. (R. Hood Chatham이 gh-127146, gh-127683, 그리고 gh-136931를 통해 기능을 구현하였습니다.)
python3*.lib에 대한 #pragma 기반 링킹은 이제 Py_NO_LINK_LIB로 끌 수 있습니다. (Jean-Christophe Fillion-Robin이 gh-82909를 통해 기능을 구현하였습니다.)
CPython은 이제 보안 향상을 위해 권장 컴파일러 옵션 집합을 기본적으로 활성화합니다. 이를 비활성화하려면
--disable-safetyconfigure옵션을 사용해주시기를 부탁드립니다. 성능 비용을 감수하더라도 더 큰 컴파일러 옵션 집합을 사용하려면--enable-slower-safety옵션을 사용해주시기를 부탁드립니다.WITH_FREELISTS 매크로와 –without-freelists
configure옵션이 제거되었습니다.새로운
configure옵션--with-tail-call-interp을 사용하여 실험적인 꼬리 호출 인터프리터를 활성화할 수 있습니다. 자세한 내용은 새로운 형의 인터프리터를 참조해주시기를 부탁드립니다.새로운 원격 디버깅 지원을 비활성화하려면
--without-remote-debugconfigure옵션을 사용해주시기를 부탁드립니다. 이는 보안상의 이유로 유용할 수 있습니다.iOS 및 macOS 앱은 이제 stdout 및 stderr 콘텐츠를 시스템 로그로 리디렉션하도록 구성할 수 있습니다. (Russell Keith-Magee가 gh-127592를 통해 기능을 구현하였습니다.)
iOS 테스트베드는 이제 테스트가 실행되는 동안 테스트 출력을 스트리밍할 수 있습니다. 또한 테스트베드를 CPython 자체가 아닌 다른 프로젝트의 테스트 스위트를 실행하는 데 사용할 수 있습니다. (Russell Keith-Magee가 gh-127592를 통해 기능을 구현하였습니다.)
build-details.json¶
파이썬 설치에는 이제 새 파일 build-details.json이 포함됩니다. 해당하는 파일은 CPython의 빌드 세부 정보를 담은 정적 JSON 문서이며, 코드를 실행하지 않고도 인트로스펙션을 할 수 있게 합니다. 이는 파이썬 런처, 크로스 컴파일 등의 사용 사례에 유용합니다.
build-details.json는 플랫폼 독립적인 표준 라이브러리 디렉터리에 설치되어야 합니다. 이는 ‘stdlib’ sysconfig 설치 경로에 해당하며, sysconfig.get_path(‘stdlib’)를 실행하여 찾을 수 있습니다.
더 보기
PEP 739 – build-details.json 1.0 – 파이썬 빌드 세부 정보를 담은 정적 설명 파일
PGP 서명 중단¶
파이썬 3.14 및 향후 버전의 릴리스에는 PGP(Pretty Good Privacy) 서명이 제공되지 않습니다. CPython 아티팩트를 검증하려면 사용자는 Sigstore 검증 자료를 사용해야 합니다. 릴리스는 파이썬 3.11부터 Sigstore를 사용하여 서명되었습니다.
릴리스 절차의 해당 변경 사항은 PEP 761에 명시되었습니다.
자유 스레딩의 파이썬이 공식적으로 지원됩니다¶
파이썬의 자유 스레딩 빌드는 이제 지원되며 더 이상 실험적이지 않습니다. 이는 자유 스레딩의 파이썬이 공식적으로 지원되지만 여전히 선택 사항인 phase II의 시작입니다.
자유 스레딩 팀은 프로젝트가 올바른 방향으로 나아가고 있다고 확신하며, 자유 스레딩을 파이썬 커뮤니티 전반에서 더 폭넓게 도입할 수 있도록 준비하는 일에 지속적으로 헌신해주시는 모든 분들께 감사드립니다.
이러한 권고와 해당하는 PEP의 수락에 따라, 파이썬 개발자 커뮤니티는 자유 스레딩이 현재와 앞으로도 지원되는 파이썬 빌드 옵션이며 적절한 폐지 일정 없이 제거되지 않을 것임을 널리 알려야 합니다.
자유 스레딩을 파이썬의 기본 혹은 유일한 빌드로 삼는 phase III로 전환할지에 대한 결정은 아직 내려지지 않았으며, CPython 자체와 커뮤니티 양쪽의 많은 요인에 달려 있습니다. 해당하는 결정은 미래에 이루어질 것입니다.
실험적 JIT (just-in-time) 컴파일러용 바이너리 릴리스¶
공식 macOS 및 윈도우 릴리스 바이너리에는 이제 실험적 JIT (just-in-time) 컴파일러가 포함됩니다. 프로덕션 사용은 권장되지 않지만, 환경 변수 PYTHON_JIT=1를 설정하여 테스트할 수 있습니다. 다운스트림 소스 빌드와 재배포자는 비슷한 동작을 위해 --enable-experimental-jit=yes-off 구성 옵션을 사용할 수 있습니다.
JIT는 초기 단계에 있으며 여전히 활발하게 개발 중입니다. 따라서 이를 활성화했을 때의 일반적인 성능 영향은 작업 부하에 따라 10% 느려지는 것부터 20% 빨라지는 것까지 다양할 수 있습니다. 테스트와 평가를 돕기 위해 sys._jit 이름 공간에 인트로스펙션 함수 세트가 제공되었습니다. sys._jit.is_available()를 사용하여 현재 실행 파일이 JIT 컴파일을 지원하는지 확인할 수 있으며, sys._jit.is_enabled()를 사용하여 현재 프로세스에서 JIT 컴파일이 활성화되었는지 알 수 있습니다.
현재 빠져 있는 기능 중 가장 중요한 것은 gdb 및 perf 같은 네이티브 디버거와 프로파일러가 JIT 프레임을 통과하여 언와인드를 수행할 수 없다는 점입니다(pdb 혹은 profile 같은 파이썬 디버거와 프로파일러는 수정 없이 계속 작동합니다). 자유 스레딩 빌드는 JIT 컴파일을 지원하지 않습니다.
발견한 모든 버그나 주요 성능 회귀를 보고해주시기를 부탁드립니다!
더 보기
파이썬 3.14로의 (코드) 이식¶
해당하는 섹션을 통해, 앞서 설명한 변경 사항과, 코드 변경이 필요할 수 있는 기타 버그 수정 사항들을 나열하며 각각에 대한 설명을 드리고자 합니다.
Python API에서 변경된 점¶
macOS 이외의 유닉스 플랫폼에서 이제,
multiprocessing및ProcessPoolExecutor에서 기본 시작 메서드는 fork가 아니라 forkserver입니다.자세한 내용은 (1) 및 (2)를 참조해주시기를 부탁드립니다.
multiprocessing혹은concurrent.futures에서NameError나 피클링 에러가 발생하면, forkserver 제한 사항을 참조해주시기를 부탁드립니다.해당하는 변경 사항은 윈도우나 macOS에는 영향을 미치지 않으며, 해당 플랫폼에서는 ‘spawn’이 기본 시작 방법으로 유지됩니다.
functools.partial은 이제 메서드 디스크립터입니다. 이전 동작을 보존하려면staticmethod()로 감싸주시기를 부탁드립니다. (Serhiy Storchaka와 Dominykas Grigonis가 gh-121027를 통해 기능을 구현하였습니다.)가비지 수거기가 이제 점진적인 방식으로 동작합니다. 이는
gc.collect()의 동작이 약간 변경된다는 뜻입니다:gc.collect(1): 1세대를 수거하는 대신 가비지 수거의 한 점진적인 단계를 수행합니다.
그 밖의
gc.collect()호출은 변경되지 않습니다.
locale.nl_langinfo()함수는 이제 일부 경우에 LC_CTYPE 로케일을 임시로 설정합니다. 해당하는 임시 변경은 다른 스레드에 영향을 미칩니다. (Serhiy Storchaka가 gh-69998를 통해 기능을 구현하였습니다.)types.UnionType은 이제typing.Union의 에일리어스이므로 일부 동작이 변경됩니다. 자세한 내용은 위 내용을 참조해주시기를 부탁드립니다. (Jelle Zijlstra가 gh-105499를 통해 기능을 구현하였습니다.)어노테이션의 런타임 동작은 여러 방식으로 변경되었습니다. 자세한 내용은 위 내용을 참조해주시기를 부탁드립니다. 어노테이션과 상호작용하는 대부분의 코드는 계속 작동하겠지만, 문서화되지 않은 일부 세부 사항은 다르게 동작할 수 있습니다.
mimetypesCLI를 공개하는 작업의 일환으로, 이제 실패 시 0 대신 1로 종료하고 잘못된 명령줄 매개변수가 있을 때는 1 대신 2로 종료합니다. 에러 메세지는 이제 stderr에 출력됩니다.정규 표현식에서 B 패턴은 이제 전체 패턴으로 주어졌을 때 빈 문자열과 일치하며, 이로 인해 동작이 변경될 수 있습니다.
FreeBSD에서
sys.platform은 더 이상 주된 버전의 번호를 포함하지 않습니다.
어노테이션의 변경 사항(PEP 649 및 PEP 749)¶
해당하는 섹션에는 어노테이션의 지연 평가 관련 변경 사항으로 인해 어노테이션 혹은 어노테이션과 상호작용하거나 어노테이션을 인트로스펙션하는 파이썬 코드에 필요할 수 있는 변경 사항에 대한 안내가 포함되어 있습니다.
대부분의 경우, 이전 버전의 파이썬에서 작동하던 코드는 변경이 필요하지 않습니다.
어노테이션이 있는 코드에 미치는 영향¶
코드에 어노테이션을 정의한다면(예를 들어, 정적 형 검사기에서 사용하기 위해), 해당하는 변경 사항의 영향을 받지 않을 가능성이 높습니다. 이전 버전의 파이썬에서 하던 것과 같은 방식으로 어노테이션을 계속 작성할 수 있습니다.
전방 참조에 자주 사용되는, 어노테이션 안의 따옴표로 감싼 문자열을 제거할 수 있을 가능성이 높습니다. 마찬가지로 어노테이션에 문자열을 작성하지 않기 위해 from __future__ import annotations를 사용한다면, 파이썬 3.14 이상만 지원하게 되었을 때 해당 임포트를 제거할 수 있을 가능성이 큽니다. 그러나, 어노테이션을 읽는 제삼자 라이브러리에 의존하는 경우, 그러한 라이브러리가 예상대로 작동하려면 먼저 따옴표로 감싸지 않은 어노테이션을 지원하도록 변경되어야 할 수 있습니다.
__annotations__를 읽는 코드에 미치는 영향¶
코드가 객체의 __annotations__ 어트리뷰트를 읽는 경우, 어노테이션의 지연 평가에 의존하는 코드를 지원하기 위해 변경해야 할 수 있습니다. 예를 들어, 현재 dataclasses 모듈이 그렇게 하는 것처럼 annotationlib.get_annotations()를 FORWARDREF 형식과 함께 사용할 수 있습니다.
외부 typing_extensions 패키지는 annotationlib 모듈 기능 중 일부에 대한 부분 백포트를 제공합니다. 예를 들어, Format 열거형과 get_annotations() 함수가 이에 해당합니다. 이러한 기능은 파이썬 3.14의 새로운 동작을 활용하는 여러 버전 호환 코드를 작성하는 데 사용할 수 있습니다.
from __future__ import annotations¶
파이썬 3.7에서 PEP 563은 모든 어노테이션을 문자열로 바꾸는 from __future__ import annotations future 문을 도입하였습니다.
그러나, 이제 해당하는 구문 활용은 폐지되었으며 향후 파이썬 버전에서 제거될 예정입니다. 해당하는 제거는 어노테이션의 지연 평가를 지원하지 않는 마지막 파이썬 버전인 파이썬 3.13이 2029년에 수명을 종료한 뒤에야 이루어질 것입니다.
파이썬 3.14에서 from __future__ import annotations를 사용하는 코드의 동작은 변경되지 않습니다.
C API에서 변경된 점¶
Py_Finalize()는 이제 모든 인턴된 문자열을 삭제합니다. 이는Py_Finalize()호출 후에도 인턴된 문자열을 계속 보유하고 있다가Py_Initialize()호출 후 다시 사용되는 모든 C 확장 모듈에 대해 하위 호환되지 않는 변경입니다. 해당하는 동작으로 인해 발생하는 문제는 일반적으로 이후의Py_Initialize()호출 실행 중 초기화되지 않은 메모리에 액세스함으로써 충돌을 일으킵니다. 이를 해결하려면 주소 새니타이저(address sanitizer)를 사용하여 인턴된 문자열에서 비롯된 해제 후 사용(use-after-free)을 식별하고 모듈 종료 중에 해당 문자열을 할당 해제해주시기를 부탁드립니다. (Eddie Elizondo가 gh-113601를 통해 기능을 구현하였습니다.)유니코드 예외 객체 C API는 이제 예외 인자가
UnicodeError객체가 아닌 경우TypeError를 발생시킵니다. (Bénédikt Tran이 gh-127691를 통해 기능을 구현하였습니다.)
인터프리터는 내부적으로 객체를 피연산자 스택에 로드할 때 가능한 경우 빌린 참조를 사용하여 일부 참조 횟수 변경을 피합니다. 이로 인해 이전 파이썬 버전과 비교해 참조 횟수 값이 더 작아질 수 있습니다. 함수 인자가 다른 코드에서 참조되지 않는지 판단하기 위해
Py_REFCNT()가 1인지 검사하던 C API 확장 모듈은, 대신 더 안전한 대체 수단인PyUnstable_Object_IsUniqueReferencedTemporary()를 사용해야 합니다.공개 C API로 승격된 비공개 함수들:
_PyBytes_Join():PyBytes_Join()_PyLong_IsNegative():PyLong_IsNegative()_PyLong_IsPositive():PyLong_IsPositive()_PyLong_IsZero():PyLong_IsZero()_PyLong_Sign():PyLong_GetSign()_PyUnicodeWriter_Dealloc():PyUnicodeWriter_Discard()_PyUnicodeWriter_Finish():PyUnicodeWriter_Finish()_PyUnicodeWriter_Init():PyUnicodeWriter_Create()를 사용해주시기를 부탁드립니다._PyUnicodeWriter_Prepare(): (다른 직접적인 대안이 없습니다.)_PyUnicodeWriter_PrepareKind(): (다른 직접적인 대안이 없습니다.)_PyUnicodeWriter_WriteChar():PyUnicodeWriter_WriteChar()_PyUnicodeWriter_WriteStr():PyUnicodeWriter_WriteStr()_PyUnicodeWriter_WriteSubstring():PyUnicodeWriter_WriteSubstring()_PyUnicode_EQ():PyUnicode_Equal()_PyUnicode_Equal():PyUnicode_Equal()_Py_GetConfig():PyConfig_Get()및PyConfig_GetInt()_Py_HashBytes():Py_HashBuffer()_Py_fopen_obj():Py_fopen()PyMutex_IsLocked():PyMutex_IsLocked()
이러한 새로운 함수 대부분은 파이썬 3.13 및 이전 버전에서 pythoncapi-compat project를 통해 사용할 수 있습니다.
Notable changes in 3.14.1¶
Add
PyUnstable_ThreadState_SetStackProtection()andPyUnstable_ThreadState_ResetStackProtection()functions to set the stack protection base address and stack protection size of a Python thread state. (Contributed by Victor Stinner in gh-139653.)
Notable changes in 3.14.5¶
gc¶
The incremental garbage collector shipped in Python 3.14.0-3.14.4 has been reverted back to the generational garbage collector from 3.13, due to a number of reports of significant memory pressure in production environments. See Garbage collection for details.