파이썬 3.13의 새로운 기능에 대해 알아봅시다¶
- 편집자:
Adam Turner and Thomas Wouters
해당하는 문서는 기존의 파이썬 3.12와 비교했을 때 파이썬 3.13의 새로운 기능들에 대해 설명합니다. 파이썬 3.13은 2024년 10월 7일에 배포되었습니다. 배포와 관련된 전체 기록을 열람하시려면, 아래 변경 로그를 확인해주세요.
더 보기
PEP 719 – 파이썬 3.13 릴리스 일정
요약 – 릴리스 하이라이트¶
파이썬 3.13은 가장 최근의 파이썬 프로그래밍 언어에 대한 안정 배포 버전입니다. 언어 전반과 그 구체적인 구현에 있어 업데이트가 있었으며, 표준 라이브러리에도 업데이트가 있었습니다. 가장 큰 업데이트는 대화형 인터프리터, 제한 없는 스레드 모드(free-threaded mode) (PEP 703), 또한 지정 시간 구동 (Just-In-Time) 컴파일러 (PEP 744)에 대한 것이었습니다.
에러 메세지는 계속 개선되고 있습니다. 트레이스백(Traceback)들의 경우 기본적으로 색깔 표시됩니다. locals() 내장 함수의 경우 반환된 매핑을 변화시키기 위해 정의된 의미 구조를 활용하고, 또한 타입 매개변수들은 기본 값의 설정을 지원합니다.
표준 라이브러리의 업데이트는, 오래되어 더 이상 지원되지 않는 API들과 모듈들의 업데이트(혹은 제거)를 포함합니다. 또한, 보다 사용자 친화적이거나 보다 정확한 라이브러리가 되기 위한 통상적인 업데이트들을 포함합니다. 몇몇의 오래된 레거시 표준 라이브러리 모듈들은, 파이썬 3.11 버전에서의 사용 지원 중단(deprecate)된 이후에, 현 버전에서 제거되었습니다.
해당하는 업데이트 문서는 새로운 기능 전체에 대해서 설명을 제공해주는 것을 목적으로 삼지 않습니다. 다만, 보다 편리하게 한눈에 볼 수 있을 개괄 설명을 제공하려는 것입니다. 보다 자세한 정보를 원하신다면, 공식 문서를 참고해주세요; 예를 들어, 라이브러리 색인 혹은 언어 색인 등을 참고하실 수 있습니다. 보다 구체적인 구현 원리 혹은 디자인 원칙에 대해 이해하시고 싶으신 분들께서는, 해당하는 새로운 기능과 관련된 PEP 문서를 열람해주시기를 부탁드립니다. 다만, PEP 문서들의 경우 통상적으로 해당하는 기능이 구현되고 난 이후에는 추가적으로 업데이트되지 않아 최신화되지 않은 부분이 있을 수 있음을 양해 부탁드립니다. 과거 버전의 파이썬을 사용하는 시스템을 파이썬 3.13으로 업그레이드(혹은 이식)하기 위한 안내의 경우 Porting to Python 3.13을 참고 부탁드립니다.
인터프리터의 개선:
대화형 인터프리터와 개선된 에러 메세지에 있어 커다란 개선이 있었습니다.
PEP 667: 기존의
locals()내장 함수의 경우 새롭게 정의된 의미 구조를 지원하며, 이러한 지원은 반환되는 매핑 구조의 변환이 필요한 경우에 대한 것입니다. 파이썬 디버거들 혹은 유사한 디버깅 도구들의 경우, 이러한 지원을 통해 지역 변수에 대한 보다 안정적인 업데이트 반영을 보다 최적화된 범위에 대해 수행할 수 있으며, 동시적인 코드 작동 중에서도 마찬가지로 이러한 최적화가 가능해졌습니다.PEP 703: 파이썬 3.13은 전역 인터프리터 잠금(global interpreter lock)의 해제를 실험적으로 지원합니다. 보다 자세한 내용의 경우 제한 없는 스레드 모드(free-threaded mode)을 참고 부탁드립니다.
PEP 744: 기본적인 지정 시간 구동 (Just-In-Time) 컴파일러가 추가되었습니다. 현재는 기본적으로 사용하지 않으며(향후 활성화될 수 있습니다) 성능 개선 효과는 크지 않습니다. 향후의 릴리스들을 통해 더욱 개선될 예정입니다.
대화형 인터프리터에서 색상 지원을 추가하고, 트레이스백 및 doctest출력에도 적용되었습니다. 이 기능은
PYTHON_COLORS와NO_COLOR환경 변수를 통해 비활성화할 수 있습니다.
파이썬 데이터 모델의 개선 사항들
__static_attributes__는 클래스 본문 내 함수에서self.X형태로 액세스되는 속성의 이름을 저장합니다.__firstlineno__는 클래스 정의의 첫 번째 줄 번호를 기록합니다.
표준 라이브러리의 중요한 개선 사항들:
새로운
PythonFinalizationError예외를 추가했으며, 종료 시기 동안 작업이 차단(block)될 때 이 예외가 발생합니다.argparse모듈은 명령줄 옵션, 위치 인자와 하위 명령에 대한 사용 지원 중단(deprecating) 표시를 지원합니다.새로운 함수
base64.z85encode()와base64.z85decode()는 Z85 data의 인코딩과 디코딩을 지원합니다.copy모듈에copy.replace()함수가 추가되었으며, 여러 내장 타입들과__replace__()메서드를 정의하는 모든 클래스를 지원합니다.새로운
dbm.sqlite3모듈이 기본dbm백엔드가 되었습니다.
보안 개선 사항들:
ssl.create_default_context()가 기본 플래그로ssl.VERIFY_X509_PARTIAL_CHAIN과ssl.VERIFY_X509_STRICT를 설정합니다.
C API 개선 사항들:
Py_mod_gil슬롯은 확장 모듈이 GIL을 비활성화한 상태에서 실행을 지원한다는 것을 나타내기 위해 사용됩니다.시스템 시계에 액세스를 제공하는 PyTime C API가 추가되었습니다.
PyMutex는 1바이트만 차지하는 새로운 경량 뮤텍스(Mutex)입니다.
새로운 타이핑 기능들:
PEP 696: 타입 매개변수(
typing.TypeVar,typing.ParamSpec,typing.TypeVarTuple)에 기본값을 지정할 수 있도록 하는 기능을 새롭게 지원합니다.PEP 702: 새로운
warnings.deprecated()데코레이터는 타입 시스템과 런타임에서 사용 지원 중단(deprecate) 예정 표시를 지원합니다.PEP 705:
typing.ReadOnly는typing.TypedDict의 항목을 타입 검사기에서 읽기 전용으로 표시하는 데 사용할 수 있습니다.PEP 742:
typing.TypeIs는typing.TypeGuard의 대안으로 더 직관적인 타입 축소(type narrowing) 동작을 제공합니다.
플랫폼 지원:
PEP 730: 애플의 iOS가 공식적으로 지원되는 플랫폼으로 3단계 (Tier 3) 수준에서 지원됩니다.
PEP 738: Android는 공식적으로 지원되는 플랫폼으로 3단계 (Tier 3) 수준에서 지원됩니다.
wasm32-wasi는 2단계 (Tier 2) 수준에서 지원됩니다.wasm32-emscripten은 더 이상 공식적으로 지원되는 플랫폼이 아닙니다.
중요한 제거 사항들:
PEP 594: 표준 라이브러리에서 ‘죽은 배터리(dead batteries)’로 분류된 레거시 모듈 19개가 제거되었습니다:
aifc,audioop,cgi,cgitb,chunk,crypt,imghdr,mailcap,msilib,nis,nntplib,ossaudiodev,pipes,sndhdr,spwd,sunau,telnetlib,uu,xdrlib.(파이썬 3.11에서 사용 지원 중단되었던) 2to3 도구와
lib2to3모듈이 제거되었습니다.(파이썬 3.6에서 사용 지원 중단되었던)
tkinter.tix모듈이 제거되었습니다.locale.resetlocale()함수가 제거되었습니다.typing.io및typing.re네임스페이스들이 제거되었습니다.연쇄
classmethod설명자(descriptors)가 제거되었습니다.
릴리스 일정 변경 사항들:
PEP 602 (“Annual Release Cycle for Python”)는 새로운 릴리스의 완전 지원(‘버그 수정’) 기간을 2년으로 연장하도록 업데이트되었습니다. 이는 다음을 의미합니다:
Python 3.9부터 3.12 버전까지는 완전 지원 기간이 1년 반이며, 이후 3년 반 동안은 보안 수정만 제공됩니다.
Python 3.13 및 이후 버전은 완전 지원 기간이 2년이며, 그 후 3년간은 보안 수정만 제공합니다.
새로운 기능들¶
개선된 대화형 인터프리터¶
파이썬 3.13은 기본적으로 PyPy project의 코드를 기반으로 한 새로운 대화형 (interactive) 셸을 사용합니다. 사용자가 대화형 터미널에서 REPL을 시작하면 다음과 같은 새 기능이 지원됩니다:
여러개의 줄을 편집할 때에도 기록을 보존할 수 있습니다.
help, exit, quit 같은 REPL 전용 명령을 직접 지원합니다. 또한, 함수로 호출할 필요 없이 사용할 수 있습니다.
프롬프트와 트레이스백에서 기본적으로 색상이 활성화됩니다.
F1으로 대화형 도움말을 탐색할 수 있으며, 별도로 명령 기록이 제공됩니다.
F3의 “붙여넣기 모드”는 큰 코드 블록을 붙여넣기 쉽게 해 줍니다(F3를 다시 누르면 일반 프롬프트로 다시 돌아갑니다).
새 대화형 셸을 비활성화하려면 PYTHON_BASIC_REPL 환경 변수를 설정하면 됩니다. 대화형 모드에 대한 자세한 내용은 대화형 모드을 참조 부탁드립니다.
(PyPy 프로젝트의 코드를 기반으로, Pablo Galindo Salgado, Łukasz Langa, Lysandros Nikolaou가 gh-111201을 통해 기능을 구현하였습니다. Dino Viehland와 Anthony Shaw가 Windows 지원에 기여하였습니다.)
개선된 에러 메세지¶
인터프리터는 터미널에서 트레이스백을 표시할 때 기본적으로 색상을 사용합니다. 이러한 색상 적용을 변경하기 위해
PYTHON_COLORS환경 변수 및NO_COLOR및FORCE_COLOR환경 변수를 활용할 수 있으며, 이러한 활용을 통해 색상 적용을 제어할 수 있습니다. (Pablo Galindo Salgado가 gh-112730를 통해 기능을 구현하였습니다.)표준 라이브러리 모듈과 동일한 이름의 스크립트를 작성하는 실수는 (여러 사용자에 의해) 흔히 발생합니다. 표준 라이브러리 모듈과 동일한 이름의 스크립트로 인해 오류가 발생하는 경우에 보다 자세한 에러 메세지 제공함을 통해 보다 도움이 될 수 있도록 하였습니다:
$ python random.py Traceback (most recent call last): File "/home/me/random.py", line 1, in <module> import random File "/home/me/random.py", line 3, in <module> print(random.randint(5)) ^^^^^^^^^^^^^^ AttributeError: module 'random' has no attribute 'randint' (consider renaming '/home/me/random.py' since it has the same name as the standard library module named 'random' and prevents importing that standard library module)
또한, 스크립트가 임포트(import)하려는 제삼자(third-party) 모듈과 이름이 같아서 오류가 발생하는 경우에도 보다 자세한 에러 메세지 제공함을 통해 보다 도움이 될 수 있도록 하였습니다:
$ python numpy.py Traceback (most recent call last): File "/home/me/numpy.py", line 1, in <module> import numpy as np File "/home/me/numpy.py", line 3, in <module> np.array([1, 2, 3]) ^^^^^^^^ AttributeError: module 'numpy' has no attribute 'array' (consider renaming '/home/me/numpy.py' if it has the same name as a library you intended to import)
(Shantanu Jain이 gh-95754을 통해 기능을 구현하였습니다.)
함수에 잘못된 키워드 인자가 전달되는 경우, 올바른 키워드 인자가 에러 메세지 안에서 제안되도록 하였습니다.
>>> "Better error messages!".split(max_split=1) Traceback (most recent call last): File "<python-input-0>", line 1, in <module> "Better error messages!".split(max_split=1) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^ TypeError: split() got an unexpected keyword argument 'max_split'. Did you mean 'maxsplit'?
(Pablo Galindo Salgado와 Shantanu Jain이 gh-107944를 통해 기능을 구현하였습니다.)
제한 없는 스레드를 사용하는 파이썬(CPython)¶
CPython은 전역 인터프리터 잠금 (GIL)을 비활성화한 제한 없는 스레드 모드(free-threaded mode)에서 실행을 실험적으로 지원합니다. 이는 실험적 기능이므로 기본 설정으로 활성화되어 있지는 않습니다. 제한 없는 스레드 모드를 실행시키기 위해서는 python3.13t 또는 python3.13t.exe라는 별도의 실행 파일이 필요합니다. free-threaded로 표시된 미리 빌드된 바이너리는 공식 Windows 및 macOS 설치 프로그램의 일부로 설치할 수 있으며, 또는 --disable-gil 옵션을 사용하여 소스 코드로부터 CPython을 빌드할 수 있습니다.
제한 없는 스레드 실행은 사용 가능한 CPU 코어에서 스레드를 병렬로 실행하여 가용 처리 능력을 온전히 활용할 수 있게 합니다. 모든 소프트웨어가 자동적으로 이를 통해 이점을 갖게 되는 것은 아니지만, 스레딩을 염두에 두고 설계된 프로그램은 다중 코어 하드웨어에서 보다 더 빠르게 실행됩니다. 제한 없는 스레드 모드는 실험적이며 개선 작업이 진행 중이므로, 버그가 있을 수 있으며, 단일 스레드를 통한 실행의 성능이 저하될 수 있습니다. 제한 없는 스레드를 사용하는 파이썬(CPython) 빌드는 실행 시 환경 변수 PYTHON_GIL 또는 명령줄 옵션 -X gil=1을 사용해 GIL을 활성화하여 선택적으로 실행할 수 있습니다.
사용 중인 인터프리터가 제한 없는 스레드의 사용을 지원하는지 확인하려면 python -VV 및 sys.version에서 “experimental free-threading build”를 통해 확인할 수 있습니다. 새 sys._is_gil_enabled() 함수를 사용하면 실행 중인 프로세스에서 GIL이 실제로 비활성화되어 있는지 확인할 수 있습니다.
C-API 확장 모듈은 제한 없는 스레드(free-threaded)를 사용하는 빌드용으로 따로 빌드해야 합니다. 전역 인터프리터 잠금(Global Interpreter Lock; GIL) 비활성 실행을 지원하는 확장 모듈은 Py_mod_gil 슬롯을 사용해야 합니다. 개별 단계 초기화(single-phase init)를 사용하는 확장 모듈은 GIL 비활성 실행 지원 여부를 표시하기 위해 PyUnstable_Module_SetGIL()을 사용해야 합니다. 이러한 메커니즘을 사용하지 않는 C 확장을 임포트하면 GIL이 자동으로 활성화됩니다. PYTHON_GIL 환경 변수나 -X gil=0 옵션으로 GIL을 명시적으로 비활성화한 경우는 예외입니다. 제한 없는 스레드를 사용하는 빌드에서 C 확장이 포함된 패키지를 설치하려면 pip 24.1 이상이 필요합니다.
이러한 개선 작업은 많은 개인과 조직, 그리고 제한 없는 스레드(free-threading) 사용 지원을 테스트하고 활성화하는 데 기여한 파이썬 및 다양한 제삼자(third-parth) 프로젝트 커뮤니티들 덕분이었습니다. 주목할 만한 기여자로는 Sam Gross, Ken Jin, Donghee Na, Itamar Oren, Matt Page, Brett Simmers, Dino Viehland, Carl Meyer, Nathan Goldbaum, Ralf Gommers, Lysandros Nikolaou 등이 있으며, 이외에도 많은 분들이 있습니다. 이 기여자들 중 많은 분들이 Meta에 재직하고 있으며, Meta는 이 프로젝트를 지원하기 위해 상당한 엔지니어링 자원을 제공하였습니다.
더 보기
이러한 개선 작업의 배경과 근거에 대한 보다 구체적인 정보를 위해서는 PEP 703 “Making the Global Interpreter Lock Optional in CPython”를 열람 부탁드립니다.
제한 없는 스레드 사용을 지원하기 위한 확장 모듈 이식: 커뮤니티에 의해 지원되는 제한 없는 스레드 사용 지원에 대한 이식 가이드로, 확장 모듈 작성자를 위한 가이드입니다.
실험적인 지정 시간 구동 (Just-In-Time; JIT) 컴파일러¶
--enable-experimental-jit 옵션을 사용하여 CPython을 구성하고 빌드하면 일부 파이썬 프로그램의 속도를 높일 수 있는 JIT 컴파일러가 추가됩니다. 윈도우에서 JIT를 활성화하려면 PCbuild/build.bat --experimental-jit을 사용하고, 2단계 (Tier 2) 인터프리터를 활성화하려면 --experimental-jit-interpreter를 사용하세요. 빌드 요구 사항과 추가 지원 정보는 Tools/jit/README.md를 확인 부탁드립니다.
--enable-experimental-jit 옵션은 다음과 같은 특정 값들을 받을 수 있습니다. 특정 값을 지정하지 않으면 기본값은 yes입니다.
no: 2단계 (Tier 2) 인터프리터 및 JIT 파이프라인을 모두 비활성화합니다.yes: JIT (Just-In-Time; 지정 시간 구동) 컴파일러를 활성화합니다. 런타임에 JIT를 비활성화하려면 환경 변수PYTHON_JIT=0을 설정할 수 있습니다.yes-off: JIT를 빌드하되 기본값으로 비활성화합니다. 런타임에 JIT를 활성화하려면 환경 변수PYTHON_JIT=1을 설정할 수 있습니다.interpreter: 2단계 (Tier 2) 인터프리터를 활성화하지만 JIT는 비활성화합니다. 이 인터프리터는 환경 변수PYTHON_JIT=0을 설정하여 비활성화할 수 있습니다.
내부 아키텍처는 대략적으로 다음과 같습니다:
시작 지점은 최적화된 1단계(Tier 1) 바이트 코드입니다. 관련된 보다 구체적인 정보를 위해서는 3.11 버전의 새로운 기능를 열람 부탁드립니다.
1단계(Tier 1) 바이트 코드가 빈번하게 실행되는 경우, 완전히 내부용인 새로운 중간 표현(IR)인 2단계 IR(Tier 2 IR)로 변환됩니다. 변환된 이러한 중간 표현은 마이크로 연산(uops)으로 명명되기도 합니다.
2단계 IR도 1단계와 같은 스택 기반 가상 머신을 사용하지만, 명령어 형식의 경우 기계어로 변환하기에 보다 더 적합합니다.
2단계 IR에는 여러개의 최적화 패스가 있으며, 이는 인터프리터에 의해 처리되어 실행되거나 기계어로 변환되기 전에 적용됩니다.
2단계(Tier 2) 인터프리터가 있지만, 주로 앞서 서술한 최적화 파이프라인의 초기 단계를 디버깅하기 위해 만들어진 것입니다. 2단계 인터프리터는 파이썬에서
--enable-experimental-jit=interpreter옵션을 설정함을 통해 활성화할 수 있습니다.지정 시간 구동 (JIT; Just-In-Time) 컴파일러가 활성화되면, 최적화된 2단계(Tier 2) IR이 기계어로 변환되어 실행됩니다.
기계어 변환 과정에서는 복사-후-패치 (copy-and-patch)라는 기법을 사용합니다. 런타임 의존성은 없지만, 빌드의 경우 LLVM에 대한 새로운 의존성이 추가되었습니다.
더 보기
(JIT은 Brandt Bucher에 의해, Haoran Xu와 Fredrik Kjolstad의 논문에 영감을 받아 개발되었습니다. 2단계 IR의 경우 Mark Shannon과 Guido van Rossum에 의해 개발되었습니다. 2단계 IR의 최적화의 경우 Ken Jin에 의해 개발되었습니다.)
locals()의 변형에 대한 의미 구조 정의¶
지금까지 locals()의 반환값을 변경했을 때에 예상되는 결과는 개별적인 파이썬 구현에 맡겨져 있었습니다. Python 3.13부터는 PEP 667이 대부분의 코드 실행 스코프에 대해 CPython의 기존 동작을 표준화하고, 최적화된 스코프(함수, 제너레이터, 코루틴, 컴프리헨션, 제너레이터 표현식)에서는 현재 할당되어 있는 지역 변수들에 대한 서로 독립적인 스냅샷으로 명시적으로 반환하도록 변경합니다. 이는 지역적으로 참조된 비지역 변수들이 종료 시점에서 확인되는 경우을 포함합니다.
앞서 서술한 것과 같이 최적화된 스코프에서 locals()의 의미 구조가 바뀌면서, 명시적인 네임 스페이스를 제공하지 않는 경우, 암시적으로 locals()을 대상으로 실행되는 코드 실행 함수들(예: exec(), eval())의 기본 동작도 영향을 받았습니다. 이전 버전에서는 코드 실행 함수를 호출한 뒤 locals()을 호출하여 변경 사항에 액세스할 수 있는지가 구체적인 개별 구현에 따라 달라졌었습니다. 구체적으로, CPython에서 대부분의 경우 이러한 방식은 무리 없이 잘 동작하였지만, 종종 같은 스코프의 공유 스냅샷이 다른 코드(디버거나 코드 실행 추적 도구 등)에 의해 재설정될 수 있기 때문에 최적화된 스코프에서 실패하는 경우도 있었습니다. Python 3.13에서는 해당 코드를 항상 최적화된 스코프의 지역 변수에 대한 독립적인 스냅샷에 대해서만 실행하므로, 그 변경 사항은 이후의 locals() 호출에서 절대로 보이지 않습니다. 이러한 경우들에서 변경 내용을 확인하기 위해서는 관련 함수에 명시적인 네임 스페이스를 전달해야 합니다. 또는 디스크에서 파이썬 파일을 실행할 때처럼 실행 결과의 네임 스페이스를 반환하는 상위 수준의 코드 실행 API(예를 들어, runpy.run_path())로 코드를 변경하는 것이 보다 바람직할 수 있습니다.
디버거와 유사 도구들이 (앞서 서술한 변화의 영향을 받는 스코프에서) 지역 변수를 안정적으로 업데이트할 수 있도록, FrameType.f_locals는 해당 스코프의 지역 변수와 그 스코프에서 참조되는 비지역 변수에 대한 이어쓰기(write-through) 프록시를 반환합니다. 런타임 의미가 불분명하고 일관성 없이 업데이트되던 (공유된) dict 인스턴스를 반환하지 않습니다.
관련된 C API 변경 사항과 사용 지원 중단 등에 대한 보다 구체적인 정보를 위해서는 PEP 667을 열람 부탁드립니다. 또한 관련된 (코드) 이식에 대한 가이드의 경우 Python API 및 C API을 열람 부탁드립니다.
(Mark Shannon과 Tian Gao가 PEP을 작성하였고 gh-74929를 통해 기능을 구현하였습니다. Guido van Rossum과 Alyssa Coghlan이 설명서를 최신화하였습니다.)
모바일 플랫폼들에 대한 지원¶
PEP 730: iOS가 PEP 11에서 지원하는 플랫폼으로, arm64-apple-ios (2013년 이후 출시된 iPhone 및 iPad 기기)와 arm64-apple-ios-simulator (Apple 실리콘 하드웨어에서 실행되는 Xcode iOS 시뮬레이터)는 3단계 (Tier 3)로 지정되었습니다. x86_64-apple-ios-simulator (구형 x86_64 하드웨어에서 실행되는 Xcode iOS 시뮬레이터)는 3단계 지원 플랫폼은 아니지만, 최선의 노력(best-effort)으로 지원됩니다. (Russell Keith-Magee PEP을 작성하였고 gh-114099를 통해 기능을 구현하였습니다.)
PEP 738: Android가 PEP 11에서 지원하는 플랫폼으로, aarch64-linux-android와 x86_64-linux-android은 3단계 (Tier 3)로 지정되었습니다. 32비트 arm-linux-androideabi와 i686-linux-android는 3단계 지원 플랫폼은 아니지만, 최선의 노력(best-effort)으로 지원됩니다. (Malcolm Smith가 PEP을 작성하였고 gh-116622을 통해 기능을 구현하였습니다.)
기타 언어 변경¶
컴파일러는 이제 독스트링의 각 줄에서 공통된 선행 공백을 제거합니다. 이 변경으로 바이트 코드 캐시 (예를 들어, .pyc 파일)의 크기가 줄어듭니다. 예를 들어 SQLAlchemy 2.0의
sqlalchemy.orm.session모듈에서는 파일 크기가 약 5% 감소합니다. 이 변경 사항은 독스트링을 사용하는 도구들에 영향을 줍니다. 예를 들어,doctest와 같은 도구가 영향을 받습니다.> 선행 공백을 포함하는 독스트링입니다. > 여러개의 문단을 포함하고 있는 경우입니다.
Inada Naoki가 gh-81283을 통해 기능을 구현하였습니다.
클래스 스코프 안에 있는 어노테이션 스코프는 이제 람다와 컴프리헨션을 포함할 수 있습니다. 클래스 스코프 안에 있는 컴프리헨션은 부모 스코프에 인라인되지 않습니다.
class C[T]: type Alias = lambda: T
퓨처 문은 이제
__future__모듈의 상대 임포트로는 더 이상 활성화되지 않습니다. 이에, from .__future__ import … 형식의 구문은 이제, 특별한 기능이 없는 일반적인 상대 임포트로만 처리됩니다. (Jeremiah Gabriel Pascual이 gh-118216을 통해 기능을 구현하였습니다.)else블록에서 사용되는 전역 변수의 경우, 이제except블록 안에서도 해당 이름을global문으로 선언할 수 있습니다. 이전버전들에서는 오류로 볼 수 있는SyntaxError가 발생했습니다. (Irit Katriel이 gh-111123를 통해 기능을 구현하였습니다.)동결된 모듈을 임포트 과정에서 무시할지 여부를 제어하는 새로운 환경 변수
PYTHON_FROZEN_MODULES가 추가되었습니다. 이 변수는-X frozen_modules명령줄 옵션과 동일한 방식으로 작동합니다. (Yilei Yang이 gh-111374를 통해 기능을 구현하였습니다.)새 환경 변수
PYTHON_PERF_JIT_SUPPORT와 명령줄 옵션-X perf_jit를 통해, 프레임 포인터 없이도 동작하는 perf 프로파일러 지원이 추가되었습니다. (Pablo Galindo가 gh-118518를 통해 기능을 구현하였습니다.)새 환경 변수
PYTHON_HISTORY를 사용하여.python_history파일의 위치를 변경할 수 있습니다. (Levi Sabah, Zackery Spytz, 그리고 Hugo van Kemenade가 gh-73965를 통해 기능을 구현하였습니다.)클래스에 새로운
__static_attributes__속성이 추가되었습니다. 해당하는 어트리뷰트는 컴파일러가 클래스 본문 안의 어떤 함수에서든 self.<name> 형식으로 대입되는 어트리뷰트 이름들을 튜플로 채워넣습니다. (Irit Katriel이 gh-115775을 통해 기능을 구현하였습니다.)컴파일러는 이제 클래스 정의의 첫 번째 줄 번호를 담은
__firstlineno__어트리뷰트를 클래스에 생성합니다. (Serhiy Storchaka가 gh-118465를 통해 기능을 구현하였습니다.)exec()와eval()내장 함수는 이제 globals 와 locals 인자를 키워드 인자로도 받을 수 있습니다. (Raphael Gaschignard가 gh-105879를 통해 기능을 구현하였습니다.)내장 함수
compile()이 이제는ast.PyCF_OPTIMIZED_AST라는 새로운 플래그를 받아들입니다. 이 플래그는ast.PyCF_ONLY_AST와 비슷하지만, 반환되는 AST가 optimize 인자의 값에 따라 최적화된다는 점이 다릅니다. (Irit Katriel가 gh-108113를 통해 기능을 구현하였습니다.)property객체에__name__어트리뷰트를 추가했습니다. (Eugene Toder가 gh-101860를 통해 기능을 구현하였습니다.)새로운
PythonFinalizationError예외가 추가되었습니다. 해당하는 예외는RuntimeError로부터 파생되었으며, 종료 시기 동안 어떤 특정한 작업이 차단될 때에 이를 알리기 위해 사용됩니다. 다음의 호출 가능한 객체(callable)는 이제PythonFinalizationError를 발생시킵니다. 이전에는RuntimeError를 발생시켰었습니다.(Victor Stinner가 gh-114570를 통해 기능을 구현하였습니다.)
이제
str.replace()메서드의 count 인자를 키워드 인자로 전달할 수 있습니다. (Hugo van Kemenade가 gh-106487를 통해 기능을 구현하였습니다.)이제 많은 함수에서 파일 디스크립터 인자(file descriptor argument)로 논리(boolean) 값이 전달되면 경고를 발생시킵니다. 해당하는 업데이트를 통해 몇몇 오류를 보다 더 이른 시점에 발견할 수 있습니다. (Serhiy Storchaka가 gh-82626를 통해 기능을 구현하였습니다.)
bz2,lzma,tarfile,zipfile모듈의 압축되거나 아카이브된 파일 종류의 객체에name과mode어트리뷰트를 추가했습니다. (Serhiy Storchaka가 gh-115961를 통해 기능을 구현하였습니다.)
새로운 모듈들¶
dbm.sqlite3:dbm`용 SQLite 백엔드입니다. (Raymond Hettinger와 Erlend E. Aasland가 :gh:`100414를 통해 기능을 구현하였습니다.)
개선된 모듈들¶
argparse¶
add_argument()및add_parser()메서드에 deprecated 매개 변수가 추가되어, 명령줄 옵션과 위치 인자, 하위 명령에 대해 사용 지원 중단을 표시할 수 있습니다. (Serhiy Storchaka가 gh-83648를 통해 기능을 구현하였습니다.)
array¶
유니코드 문자를 위한 ‘w’ 타입 코드(Py_UCS4)가 추가되었습니다. 사용 지원 중단된 ‘u’ 타입 코드 대신 이 타입 코드를 사용해야 합니다. (Inada Naoki가 gh-80480를 통해 기능을 구현하였습니다.)
clear()메서드를 구현해array.array클래스를MutableSequence타입으로 등록했습니다. (Mike Zimin가 gh-114894를 통해 기능을 구현하였습니다.)
ast¶
ast모듈의 노드 타입 생성자는 이제 받아들이는 인자에 대해 더 엄격해졌으며, 인자를 생략했을 때의 동작도 더 직관적으로 바뀌었습니다.AST 노드 인스턴스를 생성할 때 선택적 필드를 인자로 넘기지 않으면, 그 필드는 이제 None`으로 설정됩니다. 또한, 마찬가지로, 리스트 필드를 생략하면 해당 필드는 이제 빈 리스트로 설정되며, :class:!expr_context` 필드를 생략하면 기본값은
Load()가 됩니다. (이전에는 모든 경우 새로 생성한 AST 노드 인스턴스에 해당 어트리뷰트가 없었습니다.)그 밖의 모든 경우에 필수 인자를 생략하면 노드 생성자가
DeprecationWarning을 발생시킵니다. 파이썬 3.15에서는 예외를 발생시킵니다. 마찬가지로 AST 노드의 필드로 매핑되지 않는 키워드 인자를 생성자에 전달하는 것은 이제 사용 지원 중단되었으며, 파이썬 3.15에서는 예외를 발생시킵니다.해당하는 변경 사항은, 클래스가
AST._field_types매핑을 정의해 새로운 동작을 사용하도록 선택(opt-in)하지 않는 한,ast.AST의 사용자 정의 하위 클래스에는 적용되지 않습니다.(Jelle Zijlstra가 gh-105858, gh-117486, 그리고 gh-118851를 통해 기능을 구현하였습니다.)
ast.parse()는 이제 optimize를 선택적 인자로 받아들여, 이를compile()함수에 전달합니다. 이를 통해 최적화된 AST를 얻을 수 있습니다. (Irit Katriel이 gh-108113을 통해 기능을 구현하였습니다.)
asyncio¶
asyncio.as_completed()은 이제 비동기 이터레이터 이면서 동시에 어웨이터블 을 담는 일반 이터레이터인 객체를 반환합니다. 비동기 이터레이션에서 일드되는 어웨이터블에는 전달한 원래 태스크나 퓨처 객체가 그대로 포함되므로, 완료되는 태스크와 결과를 서로 연결하기가 더 쉬워집니다. (Justin Arthur이 gh-77714을 통해 기능을 구현하였습니다.)asyncio.loop.create_unix_server()는 이제 서버가 닫히면 Unix 소켓을 자동으로 제거합니다. (Pierre Ossman가 gh-111246를 통해 기능을 구현하였습니다.)DatagramTransport.sendto()는 빈 바이트열 객체로 호출되면 길이가 0인 데이터그램을 전송합니다. 트랜스포트의 흐름 제어는 이제 버퍼 크기를 계산할 때 데이터그램 헤더까지 고려합니다. (Jamie Phan이 gh-115199을 통해 기능을 구현하였습니다.)큐의 종료를 관리하기 위해
Queue.shutdown메서드와QueueShutDown예외가 추가되었습니다. (Laurie Opperman과 Yves Duprat이 gh-104228를 통해 기능을 구현하였습니다.)asyncio 서버를 보다 강제적으로 종료할 수 있도록
Server.close_clients()와Server.abort_clients()메서드가 추가되었습니다. (Pierre Ossman이 gh-113538을 통해 기능을 구현하였습니다.)StreamReader.readuntil()에서 여러 구분자로 이루어진 튜플을 인자로 받을 수 있으며, 그중 하나를 만나면 읽기를 중단합니다. (Bruce Merry이 gh-81322을 통해 기능을 구현하였습니다.)외부 취소와 내부 취소가 충돌하는 경우
TaskGroup의 동작을 개선했습니다. 예를 들어, 두 개의 태스크 그룹이 중첩된 상태에서 둘 다 자식 태스크에서 동시에 예외가 발생하면, 내부 태스크 그룹이 내부 취소를 삼켜 버려 바깥쪽 태스크 그룹이 멈춰 버릴 수 있었습니다.태스크 그룹이 외부에서 취소되었으면서 동시에
ExceptionGroup을 발생시켜야 하는 경우, 이제 부모 태스크의cancel()메서드를 호출합니다. 이렇게 하면 다음await에서CancelledError가 발생하도록 보장하여, 취소가 사라지지 않게 됩니다.이번 변경의 또 다른 이점은 태스크 그룹이 이제 (
cancelling()) 로 노출되는 취소 횟수를 그대로 유지한다는 점입니다.일부 코너 케이스를 처리하기 위해, 취소 횟수가 0에 도달하면 문서화되지 않은 _must_cancel 플래그를 재설정하도록
uncancel()이 동작할 수 있게 되었습니다.(Arthur Tacca에 의해 보고된 이슈에 의해 영감을 받아 gh-116720를 통해 기능이 구현되었습니다.)
TaskGroup.create_task()가 비활성 상태인TaskGroup에서 호출되면, 주어진 코루틴은 닫힙니다. 이렇게 하면 해당 코루틴이 한 번도 기다려지지(awaited) 않았다는 내용의RuntimeWarning이 발생하지 않습니다.create_task`라는 이름의 함수와 메서드에는 태스크 생성자로 전달되는 새로운 `**kwargs 인자가 추가되었습니다. 이 변경은 3.13.3에 실수로 인해 포함되었고, 사용자 정의 태스크 팩토리에 대한 API 계약을 깨뜨렸습니다. 여러 제삼자 태스크 팩토리들이 이에 대한 우회 방법을 구현했습니다. 3.13.4 및 이후 릴리스에서는 이전 팩토리 계약이 다시 지켜집니다(3.14까지). 기존 우회 방법이 계속 동작하도록, 추가 **kwargs 인자는 여전히
Task와 사용자 정의 태스크 팩토리에 추가 키워드 인자를 전달할 수 있게 합니다.이는 다음 함수와 메서드에 영향을 줍니다:
asyncio.create_task(),asyncio.loop.create_task(),asyncio.TaskGroup.create_task(). (Thomas Grainger가 gh-128307를 통해 기능을 구현하였습니다.)
base64¶
z85encode()와z85decode()함수를 추가하여bytes를 Z85 data로 인코딩하고, Z85로 인코딩된 데이터를bytes`로 디코딩할 수 있습니다. (Matan Perelman이 :gh:`75299를 통해 기능을 구현하였습니다.)
compileall¶
작업자 스레드와 프로세스의 기본 개수는 이제
os.cpu_count()대신os.process_cpu_count`를 사용해 결정됩니다. (Victor Stinner가 :gh:`109649()를 통해 기능을 구현하였습니다.)
concurrent.futures¶
작업자 스레드와 프로세스의 기본 개수는 이제
os.cpu_count()대신os.process_cpu_count`를 사용해 결정됩니다. (Victor Stinner가 :gh:`109649()를 통해 기능을 구현하였습니다.)
configparser¶
ConfigParser는 이제 이름 없는 섹션을 지원하여 최상위 수준의 키-값 쌍을 허용합니다. 해당하는 허용은 새로운 allow_unnamed_section 매개 변수를 통해 활성화될 수 있습니다. (Pedro Sousa Lacerda가 gh-66449를 통해 기능을 구현하였습니다.)
copy¶
새로운
replace()함수와치환 프로토콜은 객체의 수정된 사본을 더 쉽게 만들 수 있게 해 줍니다. 이는 특히 변형 가능하지 않은 객체들(immutable objects)를 다룰 때 유용합니다. 다음 타입들은replace()함수를 지원하며 치환 프로토콜을 구현합니다:사용자 정의 클래스는
copy.replace()를 지원하도록__replace__()메서드를 정의할 수 있습니다. (Serhiy Storchaka가 gh-108751를 통해 기능을 구현하였습니다.)
ctypes¶
중요한 내부 리팩터링의 결과로, 내부 메타클래스의 초기화는 이제 __new__ 가 아니라 __init__ 에서 수행됩니다. 해당하는 내부 메타클래스를 상속하여 사용자 정의 초기화를 제공하는 프로젝트에 영향을 줍니다. 일반적으로 다음과 같습니다:
__new__ 에서 super().__new__() 을 호출한 뒤 수행되던 사용자 정의 로직은 __init__ 으로 옮겨야 합니다.
클래스를 생성하려면 메타클래스를 직접 호출해야 합니다. 메타클래스의 __new__ 메서드만 호출하면 안 됩니다.
관련된 논의와 관련된 변경 사항들에 대해서는 gh-124520를 참고 부탁드립니다.
ctypes.Structure객체에는 메모리로부터/메모리로 패킹되는 구조체의 정렬을 명시적으로 지정할 수 있는 새_align_어트리뷰트가 추가되었습니다. (Matt Sanderson가 gh-112433를 통해 기능을 구현하였습니다.)
dbm¶
SQLite 백엔드를 구현하는 새로운
dbm.sqlite3모듈을 추가하고, 이를 기본dbm백엔드로 지정합니다. (Raymond Hettinger와 Erlend E. Aasland가 gh-100414를 통해 기능을 구현하였습니다.)GDBM 및 NDBM 데이터베이스 객체에 새로 추가된
clear()메서드를 통해 데이터베이스에서 모든 항목을 제거할 수 있습니다. (Donghee Na가 gh-107122를 통해 기능을 구현하였습니다.)
dis¶
dis모듈 함수의 출력이 오프셋이 아니라 점프 대상과 예외 처리기를 나타내는 논리적 라벨들을 표시하도록 변경되었습니다. 오프셋을 함께 표시하려면 새-O명령 줄 옵션이나 show_offsets 인수를 사용하면 됩니다. (Irit Katriel이 gh-112137를 통해 기능을 구현하였습니다.)get_instructions()는 캐시 항목을 별도의 명령어로 더 이상 나타내지 않습니다. 대신, 새 cache_info 필드에 포함된Instruction의 일부로 반환합니다.(Irit Katriel가 :gh:`112962()를 통해 기능을 구현하였습니다.)
doctest¶
doctest의 출력에는 이제 기본적으로 색상이 적용됩니다. 이 기능은 새PYTHON_COLORS환경 변수와 표준NO_COLOR및FORCE_COLOR환경 변수를 통해 제어할 수 있습니다. 보다 자세한 내용의 경우 Controlling color를 참고 부탁드립니다. (Hugo van Kemenade가 gh-117225를 통해 기능을 구현하였습니다.)DocTestRunner.run()메서드는 이제 건너뛴 테스트의 개수를 집계합니다.DocTestRunner.skips와TestResults.skipped어트리뷰트를 추가했습니다. (Victor Stinner가 gh-108794를 통해 기능을 구현하였습니다.)
email¶
줄 바꿈 문자를 포함하는 헤더는 이제 출력될 때 인용(quoted)됩니다.
generator모듈은 이제 잘못 접히거나 구분된 헤더가 여러 헤더로 파싱되거나 인접한 데이터와 합쳐질 수 있는 경우, 해당하는 헤더를 직렬화하지 (혹은 쓰지) 않습니다. 해당하는 안전 장치를 비활성화하려면verify_generated_headers을 설정할 수 있습니다. (Bas Bloemsaat와 Petr Viktorin가 gh-121650를 통해 기능을 구현하였습니다.)getaddresses()와parseaddr()함수는 이제 잘못된 이메일 주소를 만났을 때, 이전처럼 부정확한 값을 반환하는 대신 더 많은 경우에 (‘’, ‘’) 쌍을 반환합니다. 이 두 함수에는 strict 라는 새로운 선택적 매개 변수가 추가되었습니다(기본값은 True`입니다). (잘못된 형태의 입력을 허용하는) 이전의 작동 방식을 사용하려면 `strict=False`를 지정하면 됩니다. *strict* 매개 변수를 사용할 수 있는지 확인하기 위해 `getattr(email.utils, ‘supports_strict_parsing’, False)`를 사용할 수 있습니다. (Thomas Dwyer와 Victor Stinner가 :gh:`102988를 통해 CVE 2023-27043를 고치기 위해 기능을 구현하였습니다.)
enum¶
fractions¶
Fraction객체는 이제 채움, 정렬, 부호 처리, 최소 너비 및 그룹화에 대해 표준 포맷 명세 미니 언어 규칙을 지원합니다. (Mark Dickinson이 gh-111320를 통해 기능을 구현하였습니다.)
glob¶
셸 스타일 와일드카드를 사용하는 경로 지정 문자열을 정규식으로 변환하는 함수인
(Barney Gale가 :gh:`72904()를 통해 기능을 구현하였습니다.)
importlib¶
importlib.resources모듈의 다음 함수들은 이제 여러 개의 위치 인자를 사용해 리소스 디렉터리(혹은 트리)에 액세스할 수 있습니다. 텍스트를 읽는 함수에서는 encoding 과 errors 인자가 이제 키워드 전용 인자입니다:해당하는 함수들은 더 이상 사용 지원이 중단된 것으로 간주되지 않으며, 제거할 계획도 없습니다. (Petr Viktorin가 gh-116608를 통해 기능을 구현하였습니다.)
contents()는 완전한 기능을 갖춘TraversableAPI 사용이 권장되며, 여전히 사용 지원 중단된 상태입니다. 하지만, 이를 제거할 계획은 현재 없습니다. (Petr Viktorin가 gh-116608를 통해 기능을 구현하였습니다.)
io¶
ipaddress¶
IPv4Address.ipv6_mapped프로퍼티가 추가되었습니다. 이 프로퍼티는 IPv4 에 매핑된 IPv6 주소를 반환합니다. (Charles Machalow가 gh-109466를 통해 기능을 구현하였습니다.)IPv4Address,IPv6Address,IPv4Network, 그리고IPv6Network에의is_global그리고is_private방식의 동작이 수정 개선되었습니다. (Jakub Stasiak가 gh-113171를 통해 기능을 구현하였습니다.)
itertools¶
batched()에는 최종 배치가 지정된 배치 크기보다 짧으면ValueError를 발생시키는 새로운 strict 매개 변수가 추가되었습니다. (Raymond Hettinger가 gh-113202를 통해 기능을 구현하였습니다.)
marshal¶
allow_code 매개변수가 모듈 함수들에 추가되었습니다. allow_code=False를 전달하면 파이썬 버전 간에 호환되지 않는 코드 객체는 직렬화(serialization)하거나 역-직렬화(de-serialization)할 수 없습니다. (Serhiy Storchaka가 gh-113626를 통해 기능을 구현하였습니다.)
math¶
mimetypes¶
파일 시스템 경로에서 MIME 형식을 추측하는
guess_file_type()함수가 추가되었습니다. 파일 경로와 함께guess_type()을 사용하는 것은 이제 소프트 사용 지원 중단된(soft deprecated) 상태입니다. (Serhiy Storchaka가 gh-66543를 통해 기능을 구현하였습니다.)
mmap¶
mmap클래스는 파일 시스템 오류나 액세스 위반으로 인해 매핑된 메모리에 액세스할 수 없을 때 윈도우에서 충돌이 발생하지 않도록 보호됩니다. (Jannis Weigend가 gh-118209를 통해 기능을 구현하였습니다.)mmap클래스에는 이제 읽기 위치를 이동할 수 있는 파일류 객체가 필요한 경우에 사용할 수 있는 새로운seekable()메서드가 추가되었습니다.seek()메서드는 이제 새로운 절대 위치를 반환합니다. (Donghee Na와 Sylvie Liberman가 gh-111835를 통해 기능을 구현하였습니다.)유닉스에서만 사용할 수 있는 새로운 trackfd 매개변수는
mmap에서 파일 디스크립터(file descriptor) 복제를 제어합니다. trackfd가 False`이면 *fileno*로 지정된 파일 기술자는 복제되지 않습니다. (Zackery Spytz와 Petr Viktorin가 :gh:`78502를 통해 기능을 구현하였습니다.)
multiprocessing¶
작업자 스레드와 프로세스의 기본 개수는 이제
os.cpu_count()대신os.process_cpu_count`를 사용해 결정됩니다. (Victor Stinner가 :gh:`109649()를 통해 기능을 구현하였습니다.)
os¶
현재 프로세스의 호출 스레드에서 사용할 수 있는 논리 CPU 코어 수를 얻기 위한
process_cpu_count()함수를 추가했습니다. (Victor Stinner 가 gh-109649를 통해 기능을 구현하였습니다.)cpu_count()와process_cpu_count()는 새 환경 변수PYTHON_CPU_COUNT또는 새 명령줄 옵션-X cpu_count을 통해 재정의할 수 있습니다. 해당하는 옵션은 애플리케이션 코드나 컨테이너 자체를 수정하지 않고 컨테이너 시스템의 CPU 자원을 제한하고자 하는 사용자에게 유용합니다. (Donghee Na가 gh-109595를 통해 기능을 구현하였습니다.)리눅스의 타이머 파일 디스크립터(file descriptor)에 대한 저수준 인터페이스를 추가했으며,
timerfd_create(),timerfd_settime(),timerfd_settime_ns(),timerfd_gettime(),timerfd_gettime_ns(),TFD_NONBLOCK,TFD_CLOEXEC,TFD_TIMER_ABSTIME,TFD_TIMER_CANCEL_ON_SET를 제공합니다. (Masaru Tsuchiyama가 gh-108277를 통해 기능을 구현하였습니다.)lchmod()과chmod()의 follow_symlinks 인자는 이제 윈도우에서도 사용할 수 있습니다. 윈도우에서는lchmod()함수에서 follow_symlinks의 기본값이 False입니다. (Serhiy Storchaka가 gh-59616를 통해 기능을 구현하였습니다.)이제 윈도우에서도
fchmod()와chmod()의 파일 디스크립터(file descriptor) 지원을 사용할 수 있습니다. (Serhiy Storchaka가 gh-113191를 통해 기능을 구현하였습니다.)윈도우에서
mkdir()및makedirs()는 이제 새 디렉터리에 액세스 제어를 적용하기 위해 mode 값 0o700을 전달하는 것을 지원합니다. 이는tempfile.mkdtemp()와 관련되며, CVE 2024-4030의 완화된 해결안입니다. 다른 mode 값은 지금과 같이 무시됩니다. (Steve Dower가 gh-118486를 통해 기능을 구현하였습니다.)이제
posix_spawn`에서 *env* 인자로 `None()을 전달할 수 있으며, 이 경우 새로 생성된 프로세스는 현재 프로세스의 환경을 사용합니다. (Jakub Kulik가 gh-113119를 통해 기능을 구현하였습니다.)posix_spawn_file_actions_addclosefrom_np()를 지원하는 플랫폼에서는 이제posix_spawn()의 file_actions 매개 변수에서POSIX_SPAWN_CLOSEFROM속성을 사용할 수 있습니다. (Jakub Kulik가 gh-113117를 통해 기능을 구현하였습니다.)
os.path¶
현재의 시스템에서 경로가 예약된 것인지 확인하기 위한
isreserved()함수를 추가했습니다. 해당하는 함수는 윈도우에서만 사용할 수 있습니다. (Barney Gale가 gh-88569를 통해 기능을 구현하였습니다.)윈도우에서
isabs()는 이제 정확히 슬래시(\\또는/) 하나로 시작하는 경로를 절대 경로로 간주하지 않습니다. (Barney Gale와 Jon Foster가 gh-44626를 통해 기능을 구현하였습니다.)realpath()는 이제 파일에 접근할 수 없는 경우에도 MS-DOS 스타일 파일 이름을 해석할 수 있습니다. (Moonsik Park이 gh-82367를 통해 기능을 구현하였습니다.)
pathlib¶
지원되지 않는 경로 연산에 대해
NotImplementedError대신 발생하는UnsupportedOperation예외가 추가되었습니다. (Barney Gale이 gh-89812를 통해 기능을 구현하였습니다.)‘file’ URI(
file:///)에서Path객체를 생성하는 새로운 생성자Path.from_uri()가 추가되었습니다. (Barney Gale이 gh-107465를 통해 기능을 구현하였습니다.)셸 스타일의 와일드카드를 통해 경로를 일치시키기 위한
PurePath.full_match()가 추가되었으며, 재귀적 와일드카드인**도 지원합니다. (Barney Gale이 gh-73435를 통해 기능을 구현하였습니다.)저수준 경로 파싱과 결합에 사용되는
os.path구현을 저장하기 위한PurePath.parser클래스 어트리뷰트가 추가되었습니다.posixpath또는ntpath둘 중 하나입니다.Path.glob()과rglob()에 키워드 전용 인자 recurse_symlinks를 추가했습니다. (Barney Gale이 gh-77609를 통해 기능을 구현하였습니다.)Path.glob()과rglob()는 패턴이 "**"로 끝날 때 이제 파일과 디렉터리를 모두 반환합니다. 이전에는 디렉터리만 반환되었습니다. (Barney Gale이 gh-70303를 통해 기능을 구현하였습니다.)Path.is_file,Path.is_dir,Path.owner(), 그리고Path.group()에 follow_symlinks 키워드 전용 인자를 추가하였습니다. (Barney Gale과 Kamil Turek이 각각 gh-105793과 gh-107962를 통해 기능을 구현하였습니다.)
pdb¶
이제 내장 함수
breakpoint()와set_trace()는 다음에 실행될 코드 줄에서가 아니라 바로 디버거에 진입합니다. 이를 통해,breakpoint()가 컨텍스트의 끝에 위치할 때 디버거가 컨텍스트 바깥에서 중단되던 문제가 발생하지 않도록 합니다. (Tian Gao가 gh-118579를 통해 기능을 구현하였습니다.)이제
sys.flags.safe_path가 설정되어 있어도sys.path[0]는 디버깅 중인 스크립트의 디렉터리로 대체되지 않습니다. (Tian Gao와 Christian Walther가 gh-111762를 통해 기능을 구현하였습니다.)zipapp이 이제 디버깅 가능 대상으로서 지원됩니다. (Tian Gao가 gh-118501를 통해 기능을 구현하였습니다.)Pdb에 새로운
exceptions [exc_number]명령을 추가하여,pm()의 사후 디버깅 중에 연쇄(chained)된 예외들 사이를 이동할 수 있도록 하였습니다. (Matthias Bussonnier가 gh-106676를 통해 기능을 구현하였습니다.)앞부분이 pdb 명령인 표현식과 문장들이 이제 올바르게 인식되어 실행됩니다. (Tian Gao가 gh-108464를 통해 기능을 구현하였습니다.)
queue¶
Queue.shutdown과ShutDown을 추가하여 큐의 종료를 관리할 수 있도록 하였습니다. (Laurie Opperman과 Yves Duprat가 gh-104750를 통해 기능을 구현하였습니다.)
random¶
re¶
보다 더 명확한 전달을 위해
re.error를PatternError로 이름을 바꾸었습니다.re.error는 이전 버전과의 호환성을 위해 계속 유지됩니다.
shutil¶
site¶
sqlite3¶
Connection객체를close()메서드로 명시적으로 닫지 않으면 이제ResourceWarning경고가 발생합니다. (Erlend E. Aasland가 gh-105539를 통해 기능을 구현하였습니다.)데이터베이스 객체를 덤프할 때 필터링할 수 있도록
Connection.iterdump()에 filter 키워드 전용 매개변수를 추가했습니다. (Mariusz Felisiak가 gh-91602를 통해 기능을 구현하였습니다.)
ssl¶
create_default_context()API는 이제 기본 플래그로VERIFY_X509_PARTIAL_CHAIN과VERIFY_X509_STRICT를 포함합니다.참고
VERIFY_X509_STRICT를 사용하면, 하부 OpenSSL 구현에서는 원래 허용했을 수도 있는 RFC 5280 이전 형식의 인증서나 잘못된 인증서를 거부할 수 있습니다. 이 동작을 비활성화하는 것은 권장되지 않지만, 필요한 경우에는 다음과 같이 비활성화할 수 있습니다:import ssl ctx = ssl.create_default_context() ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT
(William Woodruff가 gh-112389를 통해 기능을 구현하였습니다.)
statistics¶
커널 밀도 추정을 위해
kde()함수를 추가했습니다. 해당 함수를 통해 고정된 개수의 이산 표본들로부터 연속 확률 밀도 함수를 추정할 수 있습니다. (Raymond Hettinger가 gh-115863를 통해 기능을 구현하였습니다.)kde()가 생성한 추정 확률 밀도 함수에서의 표본 샘플링을 위한kde_random()함수가 추가되었습니다. (Raymond Hettinger가 gh-115863를 통해 기능을 구현하였습니다.)
subprocess¶
subprocess모듈은 이제 더 많은 종류의 상황 및 경우에서posix_spawn()함수를 사용합니다.close_fds가 True`(기본값)일 때, C 라이브러리가 :c:func:!posix_spawn_file_actions_addclosefrom_np`을 제공하는 경우,
posix_spawn()이 사용됩니다. 최신 버전의 리눅스, FreeBSD, 솔라리스가 이에 포함됩니다. 리눅스에서는 이 동작이 기존 리눅스의vfork()기반 코드와 비슷한 성능을 보일 것입니다.비공개(private) 제어 설정인
subprocess._USE_POSIX_SPAWN을 False로 설정하면subprocess모듈이posix_spawn()을 절대로 사용하지 않도록 강제할 수 있습니다. 구체적인 현실 상황에서의 활용에 있어 실제로 이 값을 이렇게 설정해야 했던 경우가 있다면, 그러한 이유와 사용 중인 플랫폼 정보를 추적기에 보고해 주시면 모든 사용자를 위해 API 선택 로직을 개선하는 데 도움이 됩니다.
sys¶
문자열이 인턴(intern)되었는지 테스트할 수 있는
_is_interned()함수가 추가되었습니다. 일부 파이썬 구현에서는 해당하는 함수가 구현되어 있지 않을 수 있음에 유의해주십사 부탁드립니다. (Serhiy Storchaka가 gh-78573를 통해 기능을 구현하였습니다.)
tempfile¶
윈도우에서는
tempfile.mkdtemp()에서 사용하는 기본 모드 0o700이os.mkdir()의 변경으로 인해 새 디렉터리에 대한 접근을 제한하도록 변경되었습니다. CVE 2024-4030의 해결을 위해 제안되었습니다. (Steve Dower가 gh-118486를 통해 기능을 구현하였습니다.)
time¶
윈도우에서는
monotonic()이 이제 해상도 15.6 밀리초인GetTickCount64()시계 대신 해상도 1 마이크로초인QueryPerformanceCounter()시계를 사용합니다. (Victor Stinner가 gh-88494를 통해 기능을 구현하였습니다.)윈도우에서
time()은 이제 해상도가 15.6밀리초인GetSystemTimeAsFileTime()시계 대신, 해상도가 1마이크로초인GetSystemTimePreciseAsFileTime()시계를 사용합니다. (Victor Stinner가 gh-63207를 통해 기능을 구현하였습니다.)
tkinter¶
tkinter위젯에tk_busy_hold(),tk_busy_configure(),tk_busy_cget(),tk_busy_forget(),tk_busy_current(),tk_busy_status()메서드를 추가되었습니다.tkinter위젯 메서드wm_attributes()는 이제 창 어트리뷰트를 가져올 때 접두사 하이픈 없이 속성 이름만 전달할 수 있습니다. 예를 들어,w.wm_attributes('alpha')가 가능합니다. 또한,w.wm_attributes(alpha=0.5)와 같이, 설정할 어트리뷰트와 값을 키워드 인자로 지정할 수 있습니다. (Serhiy Storchaka가 gh-43457를 통해 기능을 구현하였습니다.)새로운 선택적 키워드 전용 매개변수 return_python_dict를 사용하면
wm_attributes()가 어트리뷰트를dict로 반환하도록 할 수 있습니다. (Serhiy Storchaka가 gh-43457를 통해 기능을 구현하였습니다.)새로운 선택적 키워드 전용 매개변수 return_ints를 사용하면
Text.count()가 단순한int값을 반환할 수 있습니다. 그 밖의 경우에는 1-튜플 또는 None으로 반환합니다. (Serhiy Storchaka가 gh-97928를 통해 기능을 구현하였습니다.)tkinter.ttk.Style의element_create()메서드에서 vsapi 엘리먼트 타입을 지원합니다. (Serhiy Storchaka가 gh-68166를 통해 기능을 구현하였습니다.)Tkinter 위젯에
after_info()메서드를 추가했습니다. (Cheryl Sabella가 gh-77020를 통해 기능을 구현하였습니다.)한 이미지의 영역을 다른 이미지로 복사할 수 있도록
PhotoImage클래스에 새 메서드copy_replace()를 추가했습니다. 이때 픽셀 확대(zooming), 서브샘플링(subsampling) 또는 둘 다를 함께 적용할 수 있습니다. (Serhiy Storchaka가 gh-118225를 통해 기능을 구현하였습니다.)PhotoImage클래스의copy(),zoom(),subsample()메서드에 from_coords 매개 변수가 추가되었습니다.PhotoImage클래스의copy()메서드에 zoom*과 *subsample 매개 변수가 추가되었습니다. (Serhiy Storchaka가 gh-118225를 통해 기능을 구현하였습니다.)파일에서 이미지를 읽기 위한
read()메서드와 이미지 데이터를 가져오기 위한data()메서드가PhotoImage클래스에 추가되었습니다.write()메서드에 background 및 grayscale 매개변수가 추가되었습니다. (Serhiy Storchaka가 gh-118271를 통해 기능을 구현하였습니다.)
traceback¶
TracebackException에exc_type_str어트리뷰트가 추가되었습니다. 이 어트리뷰트에는 exc_type의 문자열 표현이 저장됩니다. 타입 객체 자체를 담고 있는exc_type어트리뷰트의 사용 지원이 중단(deprecate)되었습니다.exc_type을 저장할지 여부를 나타내기 위해 기본값이True인 매개 변수 save_exc_type이 추가되었습니다. (Irit Katriel이 gh-112332을 통해 기능을 구현하였습니다.)BaseExceptionGroup인스턴스의 중첩된 예외를 재귀적으로 서식을 지정할 수 있도록TracebackException.format_exception_only()메서드에 새 키워드 전용(keyword-only) 매개 변수 show_group 이 추가되었습니다. (Irit Katriel가 gh-105292를 통해 기능을 구현하였습니다.)
types¶
SimpleNamespace는 이제 네임스페이스의 속성을 초기화하기 위해 단일 위치 인자를 받을 수 있습니다. 해당하는 매개 변수는 매핑 (mapping)이거나 키/값 쌍의 이터러블이어야 합니다. (Serhiy Storchaka가 gh-108191를 통해 기능을 구현하였습니다.)
typing¶
PEP 705: 정적 타입 검사기(type checker)에서
TypedDict항목을 읽기 전용으로 표시하기 위한 특수 타이핑 구조물인ReadOnly를 추가했습니다.PEP 742: 타입 축소(type narrowing) 방법을 타입 검사기에 알려 주는 타이핑 구조물인
TypeIs를 추가했습니다.typing모듈에서 일부 매개변수의 기본값을 나타내는 데 사용되는 센티넬 객체NoDefault가 추가되었습니다. (Jelle Zijlstra가 gh-116126을 통해 기능을 구현하였습니다.)typing.Protocol을 정의하는 멤버들의 집합을 반환하는get_protocol_members()함수가 추가되었습니다. (Jelle Zijlstra가 gh-104873를 통해 기능을 구현하였습니다.)클래스가
Protocol인지 확인할 수 있도록is_protocol()함수를 추가했습니다. (Jelle Zijlstra가 gh-104873를 통해 기능을 구현하였습니다.)이제
ClassVar를Final안에 중첩해 사용할 수 있고, 그 반대의 중첩 역시 가능합니다. (Mehdi Drissi가 gh-89547를 통해 기능을 구현하였습니다.)
unicodedata¶
venv¶
가상 환경 디렉터리 안에서 소스 제어 관리(SCM)용 무시(ignore) 파일들을 생성하는 기능이 추가되었습니다. Git이 기본적으로 지원됩니다.
EnvBuilder,create()와 같은 API를 통해 옵트인(opt-in) 방식으로 제공되며, 이를 확장해 다른 SCM도 지원할 수 있습니다. 또한 CLI에서는--without-scm-ignore-files옵션을 사용하여 이 동작을 옵트아웃(opt-out)할 수 있습니다. (Brett Cannon이 gh-108125를 통해 기능을 구현하였습니다.)
warnings¶
PEP 702: 새
warnings.deprecated()데코레이터는 사용 지원 중단(deprecate) 정보를 정적 타입 검사기에 전달하고, 사용이 중단된 클래스와 함수의 사용 시 경고를 발생시키는 방법을 제공합니다. 이와 같이 데코레이터가 함수나 클래스와 함께 사용되는 경우에는 또한 런타임 때에DeprecationWarning이 발생합니다. (Jelle Zijlstra가 gh-104003를 통해 기능을 구현하였습니다.)
xml¶
다섯 개의 새 메서드를 추가하여 Expat >=2.6.0의 구문 재분석 연기(reparse deferral) (CVE 2023-52425)를 제어할 수 있도록 합니다:
xml.sax.expatreader.ExpatParser.flush()
(Sebastian Pipping이 gh-115623을 통해 기능을 구현하였습니다.)
명시적인 클린업를 위해
iterparse()가 반환하는 이터레이터에close()메서드가 추가되었습니다. (Serhiy Storchaka가 gh-69893을 통해 기능을 구현하였습니다.)
zipimport¶
최적화 관련 사항들¶
몇몇 표준 라이브러리 모듈의 임포트 시간이 크게 개선되었습니다. 예를 들어,
typing모듈의 임포트 시간은re및contextlib에 대한 의존성을 제거함을 통해 약 3분의 1만큼 단축되었습니다. 임포트 시간이 단축된 다른 모듈들은email.utils,enum,functools,importlib.metadata,threading등 입니다. (Alex Waygood, Shantanu Jain, Adam Turner, Daniel Hollas 등이 gh-109653을 통해 기능을 구현하였습니다.)textwrap.indent()는 이제 대규모 입력에 대해 예전보다 약 30% 더 빠르게 동작합니다. (Inada Naoki가 gh-107369를 통해 기능을 구현하였습니다.)subprocess모듈은 이제 많은 최신 플랫폼에서, close_fds가 기본값인True인 경우를 포함하는 방식으로, 더 많은 상황에서posix_spawn()함수를 사용합니다. 해당하는 방식은 FreeBSD와 솔라리스에서 프로세스를 시작할 때 눈에 띄는 성능 향상을 제공할 것으로 보입니다. 보다 자세한 내용의 경우 위의 subprocess를 참고 부탁드립니다. (Jakub Kulik이 gh-113117를 통해 기능을 구현하였습니다.)
제거된 모듈들과 API들¶
PEP 594: 표준 라이브러리에서 "죽은 배터리들(dead batteries)" 제거하기¶
PEP 594는 파이썬의 역사와 관련된 이유로 남아 있거나, 구식으로 간주되고 있거나, 보안에 문제가 있어 일명 ‘죽은 배터리(dead batteries)’로 불리는 모듈 19개를 표준 라이브러리에서 제거할 것을 제안했습니다. 다음의 해당하는 모듈들은 파이썬 3.11에서 사용 지원이 중단(deprecate)되었으며, 이제는 완전히 제거되었습니다:
aifcstandard-aifc: PyPI에 재배포된 aifc 라이브러리를 사용해주시기를 부탁드립니다.
audioopaudioop-lts: PyPI의 audioop-lts 라이브러리를 사용해주시기를 부탁드립니다.
chunkstandard-chunk: PyPI에 재배포된 chunk 라이브러리를 사용해주시기를 부탁드립니다.
cgiandcgitbcgi.FieldStorage는 통상 GET 및 HEAD 요청에서는urllib.parse.parse_qsl`로 대체할 수 있고, `POST()및 PUT 요청에서는email.message모듈이나 multipart 라이브러리를 사용하면 대체할 수 있습니다.입력이 multipart/form-data인 경우를 제외하면, 원하는 쿼리 문자열에 대해
urllib.parse.parse_qs()를 직접 호출하는 방식으로cgi.parse()를 대체할 수 있습니다. 다만 입력이 multipart/form-data인 경우에는 아래에 설명된 대로cgi.parse_multipart()를 사용하는 방식으로 대체해야 합니다.cgi.parse_header()함수는 동일한 MIME RFC들을 구현하는email패키지의 기능으로 대체할 수 있습니다. 예를 들어,email.message.EmailMessage를 사용하는 경우는 다음과 같습니다:from email.message import EmailMessage msg = EmailMessage() msg['content-type'] = 'application/json; charset="utf8"' main, params = msg.get_content_type(), msg['content-type'].params
cgi.parse_multipart()는 동일한 MIME RFC들을 구현하는email패키지의 기능으로 대체되거나 multipart 라이브러리로 대체될 수 있습니다. 예를 들어,email.message.EmailMessage및email.message.Message클래스를 활용함을 통해 대체할 수 있습니다.“standard-cgi: & standard-cgitb: PyPI에 재배포된
cgi&cgitb라이브러리를 사용해주시기를 부탁드립니다.
crypt및 비공개(private)_crypt확장 모듈.hashlib모듈은 단순히 값을 해싱해야 할 때 사용할 수 있는 가능한 하나의 대안입니다. 또한, PyPI에는 다양한 제삼자 라이브러리가 준비되어 있습니다.bcrypt: 소프트웨어와 서버에서 사용할 수 있는 보다 현대적인 암호 해싱 라이브러리입니다.
argon2-cffi: 안전한 Argon2 암호 해싱 알고리즘입니다.
legacycrypt: POSIX crypt 라이브러리 호출과 관련 기능을 위한
ctypes래퍼(wrapper)입니다.crypt_r:
crypt모듈의 포크(fork)로, crypt_r(3) 라이브러리 호출과 관련 기능을 감싸는 래퍼(wrapper)입니다.standard-crypt 및 deprecated-crypt-alternative: PyPI에서 배포되는 crypt 라이브러리 재배포판과 _crypt 라이브러리 재구현을 사용하십시오.
imghdr: 대체 라이브러리로 filetype, puremagic, 그리고 python-magic를 사용해야 합니다. 예를 들어,puremagic.what()함수를 사용하여imghdr가 지원하던 모든 파일 형식에 대해imghdr.what()함수를 대체할 수 있습니다.standard-imghdr: PyPI에서 배포되는 imghdr 라이브러리 재배포판을 사용해주시기를 부탁드립니다.
mailcap: 대신mimetypes모듈을 사용해주시기를 부탁드립니다.standard-mailcap: PyPI에서 배포되는 mailcap 라이브러리 재배포판을 사용해주시기를 부탁드립니다.
msilibnisnntplib: 대신 PyPI의 pynntp 라이브러리를 사용하십시오.standard-nntplib: PyPI에서 배포되는 nntplib 라이브러리 재배포판을 사용하십시오.
ossaudiodev: 오디오 재생에 있어 해당 라이브러리 대신 PyPI의 pygame 라이브러리를 사용해주시기를 부탁드립니다.pipes: 대신subprocess모듈을 사용해주시기를 부탁드립니다. 문서화되지 않은pipes.quote함수를 대신하여shlex.quote()를 사용해주시기를 부탁드립니다.standard-pipes: PyPI에서 재배포되는 pipes 라이브러리를 사용해주시기를 부탁드립니다.
sndhdr: filetype, puremagic 혹은 python-magic 라이브러리를 대신 사용해주시기를 부탁드립니다.standard-sndhdr: PyPI에서 재배포되는 sndhdr 라이브러리를 사용해주시기를 부탁드립니다.
spwd: PyPI에서 제공되는 python-pam 라이브러리를 대신 사용해주시기를 부탁드립니다.sunaustandard-sunau: PyPI에서 재배포되는 sunau 라이브러리를 사용해주시기를 부탁드립니다.
telnetlib: PyPI에서 제공되는 telnetlib3 또는 Exscript 라이브러리를 대신 사용해주시기를 부탁드립니다.standard-telnetlib: PyPI에서 재배포되는 telnetlib 라이브러리를 사용해주시기를 부탁드립니다.
uu: 보다 현대적인 대안으로,base64모듈을 대신 사용해주시기를 부탁드립니다.standard-uu: PyPI에서 재배포되는
uu라이브러리를 사용해주시기를 부탁드립니다.
xdrlibstandard-xdrlib: PyPI에서 재배포되는
xdrlib라이브러리를 사용해주시기를 부탁드립니다.
(Victor Stinner와 Zachary Ware가 gh-104773와 gh-104780를 통해 기능을 구현하였습니다.)
2to3¶
파이썬 3.11에서 사용 지원 중단되었던 2to3과
lib2to3모듈이 제거되었습니다.
builtins¶
연쇄(chained)
classmethod설명자(descriptors)에 대한 지원이 중단되었습니다(gh-63272를 통해 도입된 기능입니다). 이제property와 같은 다른 디스크립터를 감싸기(wrap) 위해 사용할 수 없습니다. 이 기능의 핵심 설계에 결함이 있었고, 여러 문제를 발생시켰었습니다.classmethod를 전달(pass-through)하기 위해서는, Python 3.10에서 추가된__wrapped__어트리뷰트를 사용하는 것이 보다 바람직합니다. (Raymond Hettinger가 gh-89519를 통해 기능을 구현하였습니다.)일시 중지된 프레임에서
frame.clear()를 호출하면 (실행 중인 프레임에서와 마찬가지로)RuntimeError가 발생합니다. (Irit Katriel이 gh-79932를 통해 기능을 구현하였습니다.)
configparser¶
문서화되지 않은
LegacyInterpolation클래스를 제거했습니다. 이 클래스는 문서 문자열(docstring)에서는 파이썬 3.2부터 사용 지원 중단(deprecated)으로 표시되어 있었습니다. 런타임에서는 파이썬 3.11부터 사용 지원 중단(deprecated)으로 표시되어 있었습니다. (Hugo van Kemenade가 gh-104886를 통해 기능을 구현하였습니다.)
importlib.metadata¶
EntryPoint 객체에 대해 더는 사용 지원되지 않는(deprecated) 서브스크립트(
__getitem__()) 방식의 액세스를 제거했습니다. (Jason R. Coombs가 gh-113175를 통해 기능을 구현하였습니다.)
locale¶
파이썬 3.11에서 사용 지원 중단(deprecated)되었던
locale.resetlocale()함수를 제거했습니다. 대신locale.setlocale(locale.LC_ALL, \"\")을 사용해주시기를 부탁드립니다.
opcode¶
opcode.ENABLE_SPECIALIZATION를_opcode.ENABLE_SPECIALIZATION로 옮겼습니다. 이 필드는 3.12에서 추가되었지만 문서화된 적이 없으며, 외부에서 사용하도록 의도되었던 것이 아니었습니다. (Irit Katriel이 gh-105481를 통해 기능을 구현하였습니다.)opcode.is_pseudo(),opcode.MIN_PSEUDO_OPCODE,opcode.MAX_PSEUDO_OPCODE를 제거했습니다. 해당하는 어트리뷰트는 파이썬 3.12에서 추가되었지만 문서화되지 않았었고,dis를 통해 노출되지도 않았으며, 외부에서 사용하도록 의도되었던 것이 아니었습니다. (Irit Katriel이 gh-105481를 통해 기능을 구현하였습니다.)
optparse¶
해당하는 모듈은 이제 소프트 사용 지원 중단(soft deprecated) 상태로 간주되지 않습니다. 제삼자(third-party) 명령행 인자 처리 라이브러리를 사용하지 않는 새로운 프로젝트에서는 여전히
argparse가 우선적으로 권장됩니다. argparse의 동작 방식에는 보다 저수준인 optparse 모듈이 인자 처리 라이브러리를 작성할 때나 C언어의getopt()함수의 동작에서 유래한 다양한 유닉스 명령행 처리 규약을 argparse보다 더 엄격하게 따르는 명령행 어플리케이션을 구현할 때 더 나은 기반을 제공할 수 있는 측면들도 고려되어야 합니다. (Alyssa Coghlan와 Serhiy Storchaka가 gh-126180를 통해 기능을 구현하였습니다.)
pathlib¶
re¶
re.template()를 (re.TEMPLATE및re.T플래그와 함께) 제거하였습니다. 해당하는 함수는 문서화되어 있지 않았으며, 사용 지원 중단(deprecated)되어 있었으며, 정상적으로 작동하지 않았었습니다. (Serhiy Storchaka와 Nikita Sobolev가 gh-105687를 통해 기능을 구현하였습니다.)
tkinter.tix¶
파이썬 3.6에서 사용 지원이 중단(deprecated)되었던
tkinter.tix모듈이 제거되었습니다. 해당하는 모듈이 감싸고(wrapped) 있던 Tix 제삼자 라이브러리는 더 이상 유지 보수되지 않습니다. (Zachary Ware가 gh-75552를 통해 기능을 구현하였습니다.)
turtle¶
(문서에서는 파이썬 3.1부터, 런타임에서는 파이썬 3.11부터) 사용 지원이 중단(deprecated)되었던
RawTurtle.settiltangle()메서드가 제거되었습니다. (Hugo van Kemenade가 gh-104876를 통해 기능을 구현하였습니다.)
typing¶
unittest¶
다음의
unittest함수들은 파이썬 3.11에서 사용 지원이 중단(deprecated)되었으며 제거되었습니다:unittest.findTestCases()unittest.makeSuite()unittest.getTestCaseNames()
대신
TestLoader메서드를 사용해주시기를 부탁드립니다.(Hugo van Kemenade가 gh-104835를 통해 기능을 구현하였습니다.)
테스트되지 않았으며 문서화되지 않았던
TestProgram.usageExit()메서드가 제거되었습니다. 해당하는 메서드는 파이썬 3.11에서 사용 지원 중단(deprecated)되었었습니다.
urllib¶
파이썬 3.6에서 사용 지원 중단(deprecated)되었던
urllib.request.urlopen()함수의 cafile, capath, cadefault 매개 변수가 제거되었습니다. 대신SSLContext인스턴스와 함께 context 매개 변수를 사용해주시기를 부탁드립니다.ssl.SSLContext.load_cert_chain()함수를 사용함을 통해 특정 인증서를 로드하거나,ssl.create_default_context()가 운영 체제의 신뢰할 수 있는 인증 기관(CA) 인증서를 선택하도록 할 수 있습니다. (Victor Stinner가 gh-105382를 통해 기능을 구현하였습니다.)
webbrowser¶
테스트되지 않았고 문서화되지 않았던
MacOSX클래스가 제거되었습니다. 해당하는 클래스는 파이썬 3.11에서 사용 지원 중단(deprecated)되었었습니다. 대신 파이썬 3.2에서 도입된MacOSXOSAScript클래스를 사용해주시기를 부탁드립니다. (Hugo van Kemenade가 gh-104804를 통해 기능을 구현하였습니다.)사용 지원이 중단(deprecated)된
MacOSXOSAScript._name어트리뷰트가 제거되었습니다. 대신MacOSXOSAScript.name어트리뷰트를 사용해주시기를 부탁드립니다. (Nikita Sobolev가 gh-105546를 통해 기능을 구현하였습니다.)
New Deprecations¶
-
파이썬 3.15에서 제거될 예정인, 문서화되지 않은
SetPointerType()함수에 대한 사용 지원을 중단(deprecate)합니다. (Victor Stinner가 gh-105733를 통해 기능을 구현하였습니다.)type * length 곱셈 사용을 권장하기 위해
ARRAY()함수를 소프트 사용 지원 중단 상태로 표시합니다. (Victor Stinner가 gh-105733를 통해 기능을 구현하였습니다.)
dis:-
gettext모듈에서 복수형을 고려하는 함수와 메서드에 정수가 아닌 수를 인수로 사용하는 경우에 대한 사용 지원을 중단(deprecate)합니다. (Serhiy Storchaka가 gh-88434를 통해 기능을 구현하였습니다.)
glob:-
CGIHTTPRequestHandler클래스는 사용 지원 중단(deprecate)되었으며, Python 3.15에서 제거될 예정입니다. 프로세스 기반 CGI HTTP 서버는 오래전부터 사실상 사용되지 않고 있었습니다. 관련된 코드들은 오래되었을 뿐 아니라 더 이상 유지 보수되고 있지 않으며, 실제로 거의 사용되고 있지 않은 것으로 보입니다. 보안과 기능 모두에 있어 문제가 있으며 버그 발생 가능성이 매우 높습니다. (Gregory P. Smith가 gh-109096를 통해 기능을 구현하였습니다.)python -m http.server 명령 줄 인터페이스의
--cgi플래그는 사용 지원 중단(deprecate)되었으며, Python 3.15에서 제거될 예정입니다. (Gregory P. Smith가 gh-109096를 통해 기능을 구현하였습니다.)
-
파일 경로 인수를 받는
guess_type()호출은 소프트 사용 지원 중단 처리되었습니다. 대신(Serhiy Storchaka가 :gh:`66543()를 통해 기능을 구현하였습니다.)
re:-
PurePath.is_reserved()는 사용 지원 중단(deprecated)되었으며, 파이썬 3.15에서 제거될 것입니다. 윈도우에서 예약된 경로를 감지하려면os.path.isreserved()를 사용해주시기를 부탁드립니다. (Barney Gale이 gh-88569를 통해 기능을 구현하였습니다.)
-
java_ver()는 사용 지원 중단(deprecated)되었으며, 파이썬 3.15에서 제거될 것입니다. 해당하는 함수는 Jython 지원에만 유용할 수 있는 것으로 보이며, API가 혼란스럽고, 대부분의 경우 테스트되지 않았습니다. (Nikita Sobolev가 gh-116349를 통해 기능을 구현하였습니다.)
-
문서화되지 않은
ispackage()함수는 이제 사용 지원 중단(deprecated)되었습니다.
-
connect()함수와Connection생성자에 두 개 이상의 위치 인자를 전달하는 방식이 이제 사용 지원 중단(deprecated)되었습니다. 이외의 매개변수들은 파이썬 3.15부터 키워드 전용 매개변수로 사용 가능합니다. (Erlend E. Aasland가 gh-107948를 통해 기능을 구현하였습니다.)Connection.create_function()과Connection.create_aggregate()에 이름, 인자의 개수, 호출 가능한 객체(callable)을 키워드 인자로 전달하는 방식이 이제 사용 지원 중단(deprecated)되었습니다. 해당하는 매개변수들은 파이썬 3.15부터 위치 전용 매개변수로 사용 가능합니다. (Erlend E. Aasland가 gh-108278를 통해 기능을 구현하였습니다.)Connection의set_authorizer(),set_progress_handler(),set_trace_callback()메서드에서 콜백 호출 가능한 객체(callback callable)들을 키워드 인자로 전달하는 동작이 사용 지원 중단(deprecated)되었습니다. 콜백 호출 가능한 객체(callback callable)의 경우 파이썬 3.15부터는 위치 전용 인자로만 전달할 수 있습니다. (Erlend E. Aasland가 gh-108278를 통해 기능을 구현하였습니다.)
sys:_enablelegacywindowsfsencoding()함수를 사용 지원 중단(deprecate)하였습니다. 파이썬 3.16에서 제거될 예정입니다. 대신PYTHONLEGACYWINDOWSFSENCODING환경 변수를 사용해주시기를 부탁드립니다. (Inada Naoki가 gh-73427을 통해 기능을 구현하였습니다.)
-
문서화되지 않았으며 사용되지 않고 있는
TarFile.tarfile속성을 사용 지원 중단(deprecate)하고 파이썬 3.16에서 제거할 예정입니다. (gh-115256를 통해 기능이 구현되었습니다.)
-
TracebackException.exc_type속성을 사용 지원 중단(deprecate)합니다. 대신TracebackException.exc_type_str을 사용해주시기를 부탁드립니다. (Irit Katriel이 gh-112332를 통해 기능을 구현하였습니다.)
-
문서화되지 않은,
NamedTuple클래스를 만들 때에 사용되는 키워드 인자에 대한 구문 문법(syntax)을 사용 지원 중단(deprecate)합니다. 예를 들어,Point = NamedTuple(\"Point"\, x=int, y=int)같은 구문은 파이썬 3.15에서 제거될 예정입니다. 대신 관련된 클래스에 대한 혹은 관련된 함수형 구문 문법(syntax)을 사용해주시기를 부탁드립니다. (Alex Waygood가 gh-105566를 통해 기능을 구현하였습니다.)NamedTuple또는typing.TypedDict클래스를 만들 때 fields 매개변수를 생략하는 것과, 두 가지의 타입 모두에 있어 fields 매개변수에None을 전달하는 방식의 사용이 사용 지원 중단(deprecate)되었습니다. 파이썬 3.15에서는 fields 매개 변수에 유효한 시퀀스를 반드시 지정해주셔야 합니다. 필드가 없는(zero field의) NamedTuple 클래스를 만들려면class NT(NamedTuple): pass이나NT = NamedTuple(\"NT\", ())을 사용하십시오. 필드가 없는 TypedDict 클래스를 만들려면class TD(TypedDict): pass또는TD = TypedDict(\"TD\", {})를 사용해주시기를 부탁드립니다. (Alex Waygood가 gh-105566와 gh-105570를 통해 기능을 구현하였습니다.)typing.no_type_check_decorator()데코레이터 함수를 사용 지원 중단(deprecate)하였으며, 파이썬 3.15에서 제거할 예정입니다.typing모듈에 도입된 지 8년이 지났지만, 여전히 여러 인지도 있는 주요 정적 타입 검사기(type checker)도 이를 지원하지 않고 있습니다. (Alex Waygood이 gh-106309를 통해 기능을 구현하였습니다.)typing.AnyStr의 사용 지원이 중단되었습니다. 파이썬 3.16에서는typing.__all__에 더 이상 포함되지 않도록 제거될 것입니다. 해당하는 코드를 임포트(import)하거나 액세스하면 런타임에DeprecationWarning이 발생하게 될 것입니다. 파이썬 3.18에서 완전히 제거될 예정입니다. 대신 새로운 타입 매개변수 구문을 사용해주시기를 부탁드립니다. (Michael The가 gh-107116를 통해 기능을 구현하였습니다.)
wave:Wave_read및Wave_write클래스에 있는getmark(),setmark(),getmarkers()메서드의 사용 지원이 중단(deprecated)되었으며, 파이썬 3.15에서 제거될 예정입니다. (Victor Stinner가 gh-105096를 통해 기능을 구현하였습니다.)
파이썬 3.14에서 제거 예정인 항목들¶
argparse:argparse.BooleanOptionalAction의 type, choices, metavar 매개변수의 사용 지원이 중단(deprecated)되었으며, 파이썬 3.14에서 제거될 예정입니다. (Nikita Sobolev가 gh-92248을 통해 기능을 구현하였습니다.)ast: 다음 기능들은 파이썬 3.8부터 문서상에서 사용 지원이 중단(deprecated)된 것으로 표시되었었습니다. 이제 실행 중에 접근하거나 사용하면 런타임에DeprecationWarning이 발생합니다. 파이썬 3.14에서 제거될 예정입니다:ast.Numast.Strast.Bytesast.NameConstantast.Ellipsis
대신
ast.Constant을 사용해주시기를 부탁드립니다. (Serhiy Storchaka가 gh-90953을 통해 기능을 구현하였습니다.)-
자식 관찰자 클래스(child watcher class)인
asyncio.MultiLoopChildWatcher,asyncio.FastChildWatcher,asyncio.AbstractChildWatcher, 그리고asyncio.SafeChildWatcher는 사용 지원 중단(deprecated)되었으며 파이썬 3.14에서 제거될 예정입니다. (Kumar Aditya가 gh-94597를 통해 기능을 구현하였습니다.)asyncio.set_child_watcher(),asyncio.get_child_watcher(),asyncio.AbstractEventLoopPolicy.set_child_watcher(), 그리고asyncio.AbstractEventLoopPolicy.get_child_watcher()는 사용 지원 중단(deprecated)되었으며 파이썬 3.14에서 제거될 예정입니다. (Kumar Aditya가 gh-94597를 통해 기능을 구현하였습니다.)이제, 기본 이벤트 루프 정책의
get_event_loop()메서드는 이벤트 루프가 설정되어 있지 않아 새 루프를 생성하는 경우DeprecationWarning경고를 발생시킵니다. (Serhiy Storchaka가 gh-100160를 통해 기능을 구현하였습니다.)
email:email.utils.localtime()의 isdst 매개 변수 사용이 사용 지원 중단(deprecated)되었습니다. (Alan Williams가 gh-72346를 통해 기능을 구현하였습니다.)importlib.abc사용 지원 중단(deprecated)된 클래스들:importlib.abc.ResourceReaderimportlib.abc.Traversableimportlib.abc.TraversableResources
대신 다음과 같은
importlib.resources.abc모듈의 클래스를 사용해주시기를 부탁드립니다:(Jason R. Coombs와 Hugo van Kemenade가 gh-93963를 통해 기능을 구현하였습니다.)
itertools모듈은 copy, deepcopy, pickle 연산에 대해 문서화되지 않았었습니다. 또한, 과거로부터 계속, 비효율적이며, 버그가 많이 발견되며, 일관되지 않은 방식으로만 지원되어왔었습니다. 해당하는 모듈은 파이썬 3.14에서 제거될 예정이며, 이를 통해 많은 양의 코드 분량이 삭제될 것이며 유지 관리 부담이 크게 줄어들 것입니다. (Raymond Hettinger가 gh-101588를 통해 기능을 구현하였습니다.)multiprocessing: 현재 기본값이 ‘fork’인 리눅스, BSD 및 그 밖의 macOS 이외의 POSIX 플랫폼에서는 더 안전한 기본 시작 방법으로 변경될 예정입니다 (gh-84559를 참고 부탁드립니다). 대부분의 코드 베이스 및 구성 요소들은 이와 관련 없을 것으로 예상욉니다. 때문에 실행 시간 경고를 추가하는 것은 불필요할 수 있다고 생각되었습니다. 코드에서 ‘fork’가 필요한 경우에만get_context()혹은set_start_method()API를 통해 명시적으로 지정해주시기를 부탁드립니다. 보다 자세한 내용의 경우 컨텍스트 및 시작 방법를 참고 부탁드립니다.pathlib:is_relative_to()및relative_to()에 추가 인자를 전달하는 것은 사용 지원 중단(deprecated) 되었습니다.pkgutil:pkgutil.find_loader()및pkgutil.get_loader()는 이제DeprecationWarning을 발생시킵니다. 대신importlib.util.find_spec()를 사용해주시기를 부탁드립니다. (Nikita Sobolev가 gh-97850을 통해 기능을 구현하였습니다.)pty:master_open()대신
pty.openpty()를 사용해주시기를 부탁드립니다.slave_open()대신
pty.openpty()를 사용해주시기를 부탁드립니다.
-
version그리고version_info.execute()및executemany()에서 이름있는 자리 표시자(named placeholders)를 사용하고 매개변수 가dict가 아니라 시퀀스인 경우.
urllib:urllib.parse.Quoter클래스는 사용 지원 중단(deprecated)되었습니다. 해당하는 클래스는 공개 API로 제공할 의도로 작성된 것이 아니었습니다. (Gregory P. Smith가 gh-88168를 통해 기능을 구현하였습니다.)
파이썬 3.15에서 제거 예정인 항목들¶
임포트 시스템:
모듈에
__cached__를 설정하면서__spec__.cached를 설정하지 않는 동작은 사용 지원 중단(deprecated)되었습니다. 파이썬 3.15부터는__cached__어트리뷰트가 임포트 시스템이나 표준 라이브러리에서 더 이상 설정 혹은 고려되지 않습니다. (gh-97879를 참고 부탁드립니다.)모듈에
__package__를 설정하는 동시에__spec__.parent를 설정하지 않는 방식의 사용은 사용 지원 중단(deprecated)되었습니다. 파이썬 3.15부터는__package__어트리뷰트가 임포트 시스템이나 표준 라이브러리에서 더 이상 설정 혹은 고려되지 않습니다. (gh-97879를 참고 부탁드립니다.)
-
문서화되지 않았던
ctypes.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()는 파이썬 3.15부터 인자를 받는 것이 허용되지 않습니다. 파이썬 3.14부터 인자를 받는 것이 사용 지원 중단(deprecatated)되었습니다. 파이썬 버전은 인자를 허용하지 않지만, C 언어 버전은 위치 인자나 키워드 인자를 임의의 개수만큼 허용하는 동시에 모든 종류의 인자를 무시하기 때문입니다.
-
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에서 제거 예정인 항목들¶
Pending removal in Python 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인스턴스를 반환하는 방식으로 사용해주시기를 부탁드립니다.int()의 __trunc__() 메서드로의 위임(delegation).
복소수를
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(): 대신threading.current_thread()를 사용해주시기를 부탁드립니다.threading.Event.isSet(): 대신is_set()를 사용해주시기를 부탁드립니다.threading.Thread.isDaemon()와threading.Thread.setDaemon(): 대신threading.Thread.daemon어트리뷰트를 사용해주시기를 부탁드립니다.threading.Thread.getName()와threading.Thread.setName(): 대신threading.Thread.name어트리뷰트를 사용해주시기를 부탁드립니다.threading.currentThread(): 대신threading.current_thread()를 사용해주시기를 부탁드립니다.threading.activeCount(): 대신threading.active_count()를 사용해주시기를 부탁드립니다.
내부 클래스 typing._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 바이트 코드 변경 사항¶
C API의 변경 사항들¶
새로운 기능들¶
PEP 669 모니터링 이벤트 생성을 위한 PyMonitoring C API가 추가되었습니다:
PyMonitoring_FireBranchEvent
(Irit Katriel이 gh-111997를 통해 기능을 구현하였습니다.)
1바이트만 차지하는 경량 뮤텍스인
PyMutex와 새로운PyMutex_Lock()및PyMutex_Unlock()함수를 추가했습니다. 연산을 수행하기 위해 블록이 필요하면, 현재 GIL을 보유 중인 경우PyMutex_Lock()는 전역 인터프리터 잠금(GIL)을 해제합니다. (Sam Gross이 gh-108724를 통해 기능을 구현하였습니다.)시스템 시계에 액세스할 수 있도록 PyTime C API를 추가했습니다.
PyTime_MIN그리고PyTime_MAX.
(Victor Stinner과 Petr Viktorin이 gh-110850를 통해 기능을 구현하였습니다.)
PyDict_Contains()와 동일하게 동작하지만, key를 PyObject* 대신 const char* 형식의 UTF-8 인코딩된 바이트 문자열로 지정하는PyDict_ContainsString()함수를 추가했습니다. (Victor Stinner가 gh-108314를 통해 기능을 구현하였습니다.)PyDict_GetItemWithError()와 유사하게 동작하지만 빌린 참조(borrowed reference) 대신 강한 참조(strong reference)를 반환하는PyDict_GetItemRef()및PyDict_GetItemStringRef()함수를 추가했습니다. 해당하는 함수는 오류가 발생하면 -1을 반환하므로PyErr_Occurred()를 별도로 확인할 필요가 없습니다. (Victor Stinner가 gh-106004를 통해 기능을 구현하였습니다.)PyDict_SetDefault()와 유사하게 동작하지만 빌린 참조(borrowed reference) 대신 강한 참조(strong reference)를 반환하는PyDict_SetDefaultRef()함수를 추가했습니다. 이 함수는 오류가 발생하면 -1을, 새 항목을 삽입한 경우 0을, 키가 딕셔너리에 이미 존재하는 경우 1을 반환합니다. (Sam Gross가 gh-112066를 통해 기능을 구현하였습니다.)딕셔너리에서 키를 제거하고 필요에 따라 제거된 값을 반환하는
PyDict_Pop()및PyDict_PopString()함수를 추가했습니다. 이는dict.pop()메서드와 비슷하지만, 기본값 인자가 없으며 존재하지 않는 키에 대해서도KeyError를 발생시키지 않습니다. (Stefan Behnel과 Victor Stinner가 gh-111262를 통해 기능을 구현하였습니다.)PyObject_GetItem()및PyMapping_GetItemString()의 대안으로, 각각PyMapping_GetOptionalItem()및PyMapping_GetOptionalItemString()함수를 추가하였습니다. 해당하는 새로운 함수들은 요청된 키가 기존 매핑에 없더라도KeyError를 발생시키지 않습니다. 해당하는 변형은 누락된 키를 오류 사례(failure)로 취급하지 않아야 하는 경우에 보다 더 편리하고 빠른 작동에 도움이 됩니다. (Serhiy Storchaka가 gh-106307를 통해 기능을 구현하였습니다.)PyObject_GetOptionalAttr()및PyObject_GetOptionalAttrString()의 대안으로, 각각PyObject_GetAttr()및PyObject_GetAttrString()함수를 추가하였습니다. 새로운 함수는 요청된 어트리뷰트를 객체에서 찾을 수 없더라도AttributeError를 발생시키지 않습니다. 해당하는 변형은 누락된 어트리뷰트를 오류 사례(failure)로 취급하지 않아야 하는 경우에 보다 더 편리하고 빠른 작동에 도움이 됩니다. (Serhiy Storchaka가 gh-106521를 통해 기능을 구현하였습니다.)경고 메시지를 사용자 지정할 수 있도록
PyErr_WriteUnraisable()함수의 확장으로PyErr_FormatUnraisable()함수를 추가했습니다. (Serhiy Storchaka가 gh-108082를 통해 기능을 구현하였습니다.)프레임의 locals, globals, 빌트인에 대해 빌린 참조(borrowed reference) 대신 강한 참조(strong reference)를 반환하는 새로운 함수들을 추가했습니다. 해당하는 업데이트들은 PEP 667의 일환입니다:
PyEval_GetBuiltins()대신PyEval_GetFrameBuiltins()를 사용해주시기를 부탁드립니다.PyEval_GetGlobals()대신PyEval_GetFrameGlobals()를 사용해주시기를 부탁드립니다.PyEval_GetLocals()대신PyEval_GetFrameLocals()를 사용해주시기를 부탁드립니다.
(Mark Shannon과 Tian Gao가 gh-74929를 통해 기능을 구현하였습니다.)
상수에 대한 강한 참조(strong reference) 또는 빌린 참조(borrowed reference)를 얻을 수 있도록
Py_GetConstant()및Py_GetConstantBorrowed()함수를 추가했습니다. 예를 들어, Py_GetConstant(Py_CONSTANT_ZERO)는 상수 0에 대한 강한 참조(strong reference)를 반환합니다. (Victor Stinner가 gh-115754를 통해 기능을 구현하였습니다.)PyImport_AddModule()함수의 대체로PyImport_AddModuleRef()함수를 추가했습니다. 이 함수는 빌린 참조(borrowed reference) 대신 강한 참조(strong reference)를 반환합니다. (Victor Stinner가 gh-105922를 통해 기능을 구현하였습니다.)메인 파이썬 인터프리터가 종료 중(interpreter shutdown) 상태에 해당하는지 확인할 수 있도록
Py_IsFinalizing()함수를 추가했습니다. (Victor Stinner가 gh-108014를 통해 기능을 구현하였습니다.)빌린 참조(borrowed reference) 대신 강한 참조(strong reference)를 반환하는
PyList_GetItem()의 대체 함수로PyList_GetItemRef()함수를 추가합니다. (Sam Gross가 gh-114329를 통해 기능을 구현하였습니다.)PyList_Extend()및PyList_Clear()함수를 추가하였습니다. 해당하는 함수들은 기존 파이썬의list.extend()및list.clear()메서드를 그대로 반영한 것입니다. (Victor Stinner가 gh-111138를 통해 기능을 구현하였습니다.)새로운
PyLong_AsInt()함수를 추가했습니다. 해당하는 함수는PyLong_AsLong()과 유사하게 동작하지만, 결과를 C의 long 대신 C의 int에 저장합니다. (Victor Stinner가 gh-108014를 통해 기능을 구현하였습니다.)네이티브 정수형과 파이썬
int객체 사이의 변환을 단순화하기 위해PyLong_AsNativeBytes(),PyLong_FromNativeBytes(),PyLong_FromUnsignedNativeBytes()함수를 추가했습니다. (Steve Dower가 gh-111140를 통해 기능을 구현하였습니다.)PyModule_AddObjectRef()그리고PyModule_AddObject()와 유사하지만 항상 값에 대한 참조를 가져가는(steal)PyModule_Add()함수를 추가했습니다. (Serhiy Storchaka가 gh-86493를 통해 기능을 구현하였습니다.)파이썬 객체의 기본 해싱 함수를 구현하는
PyObject_GenericHash()함수를 추가했습니다. (Serhiy Storchaka가 gh-113024를 통해 기능을 구현하였습니다.)가공되지 않은(raw) 포인터를 해싱하기 위한
Py_HashPointer()함수를 추가했습니다. (Victor Stinner가 gh-111545를 통해 기능을 구현하였습니다.)PyObject_VisitManagedDict()그리고PyObject_ClearManagedDict()함수를 추가하였습니다. 해당하는 함수들은Py_TPFLAGS_MANAGED_DICT플래그를 사용하는 타입의 traverse 및 clear 함수를 통해 호출되어야 합니다. pythoncapi-compat 프로젝트를 통해 해당하는 함수들을 Python 3.11 및 3.12에서 사용할 수 있습니다. (Victor Stinner가 gh-107073를 통해 기능을 구현하였습니다.)tracemalloc모듈과 같은 방식으로 객체의 생성(creation)과 파기(destruction)를 추적할 수 있도록PyRefTracer_SetTracer()그리고PyRefTracer_GetTracer()함수를 추가했습니다. (Pablo Galindo가 gh-93502를 통해 기능을 구현하였습니다.)이벤트 인자를 파이썬
tuple객체로 받는PySys_Audit()의 대안으로PySys_AuditTuple()함수를 추가했습니다. (Victor Stinner가 gh-85283를 통해 기능을 구현하였습니다.)NULL인 경우에 치명적인(fatal) 에러로 프로세스를 종료하지 않는PyThreadState_Get()의 대안으로PyThreadState_GetUnchecked()함수를 추가했습니다. 결과가NULL인지 여부를 확인하는 역할을 호출자가 수행합니다.타입의 완전히 정규화된 이름을 얻기 위한
PyType_GetFullyQualifiedName()함수를 추가했습니다.type.__module__가 문자열이고 그 값이 ‘builtins’ 또는 ‘__main__’이 아닌 경우, 모듈 이름이 앞에 붙습니다. (Victor Stinner가 gh-111696를 통해 기능을 구현하였습니다.)특정 타입의 모듈 이름을 가져오는
PyType_GetModuleName()함수를 추가했습니다. 해당하는 함수의 이런 동작은type.__module__어트리뷰트를 가져오는 것과 동일합니다. (Eric Snow와 Victor Stinner가 gh-111696를 통해 기능을 구현하였습니다.)유니코드 객체를 const char* 형식의 UTF-8 인코딩된 문자열과 비교하기 위한
PyUnicode_EqualToUTF8AndSize()와PyUnicode_EqualToUTF8()함수를 추가했습니다. 두 값이 같으면 1을 반환하며, 두 값이 같지 않으면 0을 반환합니다. 해당하는 함수들은 예외를 발생시키지 않습니다. (Serhiy Storchaka가 gh-110289를 통해 기능을 구현하였습니다.)PyWeakref_GetObject()의 대안으로PyWeakref_GetRef()함수를 추가했습니다. 해당하는 함수는 참조 대상이 아직 살아 있는 경우 강한 참조 (strong reference)를, 더 이상 살아 있지 않은 경우 NULL을 반환합니다. (Victor Stinner가 gh-105927를 통해 기능을 구현하였습니다.)에러를 조용한 방식으로 간과/무시하던 함수들의 동작을 바로잡은 새로운 함수들을 추가했습니다:
PyObject_HasAttr()대신PyObject_HasAttrWithError()를 사용해주시기를 부탁드립니다.PyObject_HasAttrString()의 사용 대신PyObject_HasAttrStringWithError()의 사용을 부탁드립니다.PyMapping_HasKey()대신PyMapping_HasKeyWithError()를 사용해주시기를 부탁드립니다.PyMapping_HasKeyString()의 사용 대신PyMapping_HasKeyStringWithError()의 사용을 부탁드립니다.
새로운 함수들은 에러의 경우 -1을, 참의 경우 기존과 같이 1을, 거짓의 경우 0을 반환합니다.
(Serhiy Storchaka가 gh-108511를 통해 기능을 구현하였습니다.)
C API의 변경 사항들¶
PyArg_ParseTupleAndKeywords()와PyArg_VaParseTupleAndKeywords()의 keywords 매개 변수는 이제 C 언어에서는 char *const*, C++ 언어에서는 const char *const* 형식을 가지며, 이전의 char** 형식으로부터 업데이트되었습니다. C++ 언어에서는 이를 통해 해당하는 함수들이 const char *const*, const char**, char *const* 형식의 인자와 명시적인 타입 변환(explicit type cast) 없이도 호환되도록 합니다. C 언어에서는 해당하는 함수들이 char *const* 형식의 인자만 지원합니다. 해당하는 방식의 작동은PY_CXX_CONST매크로를 사용하여 재정의할 수 있습니다. (Serhiy Storchaka가 gh-65210를 통해 기능을 구현하였습니다.)PyArg_ParseTupleAndKeywords()가 이제 ASCII 가 아닌 키워드 매개 변수 이름도 지원합니다. (Serhiy Storchaka가 gh-110815를 통해 기능을 구현하였습니다.)PyCode_GetFirstFree()함수는 이제 불안정한 API로 분류되며, 이름도PyUnstable_Code_GetFirstFree()로 변경되었습니다. (Bogdan Romanyuk가 gh-115781를 통해 기능을 구현하였습니다.)PyDict_GetItem(),PyDict_GetItemString(),PyMapping_HasKey(),PyMapping_HasKeyString(),PyObject_HasAttr(),PyObject_HasAttrString(), 그리고PySys_GetObject()함수는 호출 시 발생한 모든 에러를 이전에는 그냥 지워 버렸지만, 이제sys.unraisablehook()을 사용하는 방식을 통해 해당하는 에러들을 보고합니다. 관련된 설명서를 기반으로 다른 함수로 변경하는 것이 보다 권장되는 방법입니다. (Serhiy Storchaka가 gh-106672를 통해 기능을 구현하였습니다.)PyUnicode_FromFormat()에%T,%#T,%N, 그리고%#N형식에 대한 지원이 추가되었습니다.%T: 객체 타입의 완전히 정규화된 이름을 가져옵니다.%#T: 위의%T와 같은 방식으로, 그러나 콜론을 구분 기호로 사용합니다.%N: 타입의 완전히 정규화된 이름을 가져옵니다.%#N: 위의%N과 같은 방식으로, 그러나 콜론을 구분 기호로 사용합니다.
보다 자세한 내용의 경우 PEP 737를 참고 부탁드립니다. (Victor Stinner가 gh-111696를 통해 기능을 구현하였습니다.)
이제
#포맷 코드를 사용할 때에Python.h를 포함하기 전에PY_SSIZE_T_CLEAN매크로를 정의할 필요가 없습니다. 해당하는 포맷 코드를 받는 API들은#포맷에 대해 항상Py_ssize_t를 사용합니다. (Inada Naoki가 gh-104922를 통해 기능을 구현하였습니다.)파이썬이 디버그 모드로 빌드되었거나
with assertions옵션으로 빌드된 경우,PyTuple_SET_ITEM()과PyList_SET_ITEM()함수는 인덱스 인자가 올바른지 검사문을 통한 확인(assert)을 통해 검사합니다.
제한된 C API 변경 사항들¶
다음과 같은 함수들은 이제 제한된 C API에 포함됩니다.
참조 추적(tracing references)을 활성화하여
--with-trace-refs옵션으로 빌드된 파이썬은 이제 제한된 C API를 지원합니다. (Victor Stinner가 gh-108634를 통해 기능을 구현하였습니다.)
제거된 C API들¶
_Py또는_PY접두사가 붙은 (비공개로 간주되는) 여러 함수, 매크로, 변수 등을 제거되었습니다. 혹시나라도 프로젝트가 해당하는 제거의 영향을 받거나 제거된 API가 계속 제공되어야 한다고 생각하신다면, 공개 C API를 요청하기 위해 새 이슈를 열어주시고, Victor Stinner에게 알리기 위해 이슈에cc: @vstinner를 추가해 주십시오. (Victor Stinner가 gh-106320를 통해 기능을 구현하였습니다.)파이썬 3.0에서 사용 지원이 중단된 낡은 버퍼 프로토콜을 제거합니다. 대신 버퍼 프로토콜를 사용해주시기를 부탁드립니다.
PyObject_CheckReadBuffer(): 객체가 버퍼 프로토콜을 지원하는지 테스트하고자 하는 경우PyObject_CheckBuffer()를 사용해주시기를 부탁드립니다. 참고로PyObject_CheckBuffer()는PyObject_GetBuffer()가 성공하는 것을 보장하는 방식의 가정을 하지는 않습니다. 객체를 실제로 읽을 수 있는지 테스트하고자 하는 경우PyObject_GetBuffer()의 다음 예제를 참조해주시기를 부탁드립니다.PyObject_AsCharBuffer(),PyObject_AsReadBuffer(): 대신PyObject_GetBuffer()와PyBuffer_Release()를 사용해주시기를 부탁드립니다:// `view.buf`\와 `view.len`\을 사용하여 버퍼로부터 읽는 것이 가능합니다. // buf를 `(const char*)view.buf`\로 캐스팅해야 하는 경우가 있을 수 있습니다.
PyObject_AsWriteBuffer(): 대신PyObject_GetBuffer()와PyBuffer_Release()를 사용해주시기를 부탁드립니다.// 버퍼에 쓸 때에는 `view.buf`\와 `view.len`\을 사용할 수 있습니다.
(Inada Naoki가 gh-85275를 통해 기능을 구현하였습니다.)
파이썬 3.9에서 사용 지원이 중단된 여러 함수를 제거합니다.
PyEval_CallObject(),PyEval_CallObjectWithKeywords(): 대신PyObject_CallNoArgs()혹은PyObject_Call()를 사용해주시기를 부탁드립니다.경고
PyObject_Call()에서는 위치 인자가tuple이어야 하고 NULL이면 안 됩니다. 키워드 인자는dict이거나 NULL입니다. 제거된 과거의 함수들은 인자 형식을 검사하고, 위치 인자와 키워드 인자에 대해 NULL을 허용했었습니다. PyEval_CallObjectWithKeywords(func, NULL, kwargs)를PyObject_Call()대신 사용할 때에,PyTuple_New(0)로 생성한 빈 튜플을 위치 인자로 전달하는 것이 가능합니다.PyEval_CallFunction(): 대신PyObject_CallFunction()를 사용해주시기를 부탁드립니다.PyEval_CallMethod(): 대신PyObject_CallMethod()를 사용해주시기를 부탁드립니다.PyCFunction_Call(): 대신PyObject_Call()를 사용해주시기를 부탁드립니다.
(Victor Stinner가 gh-105107를 통해 기능을 구현하였습니다.)
오래된, 파이썬 초기화를 구성할 때 사용되던, 파이썬 3.11에서 사용 지원이 중단(deprecated)된, 다음 함수들을 제거합니다:
PySys_AddWarnOptionUnicode(): 대신PyConfig.warnoptions를 사용해주시기를 부탁드립니다.PySys_AddWarnOptionUnicode(): 대신PyConfig.warnoptions를 사용해주시기를 부탁드립니다.PySys_AddXOption(): 대신PyConfig.xoptions를 사용해주시기를 부탁드립니다.PySys_HasWarnOptions(): 대신PyConfig.xoptions를 사용해주시기를 부탁드립니다.PySys_SetPath(): 대신PyConfig.module_search_paths를 설정해주시기를 부탁드립니다.Py_SetPath(): 대신PyConfig.module_search_paths를 설정해주시기를 부탁드립니다.Py_SetStandardStreamEncoding(): 대신PyConfig.stdio_encoding를 설정해주시기를 부탁드립니다. 또한, 윈도우에서의 경우PyConfig.legacy_windows_stdio를 설정해주시는 것이 필요한 경우가 종종 있습니다._Py_SetProgramFullPath(): 대신PyConfig.executable를 설정해주시기를 부탁드립니다.
파이썬 3.8에 추가된 파이썬 초기화 구성의 새로운
PyConfigAPI를 대신 사용해주시기를 부탁드립니다(보다 자세한 내용의 경우 PEP 587를 참고해주시기를 부탁드립니다). (Victor Stinner가 gh-105145를 통해 기능을 구현하였습니다.)파이썬 3.2에서 폐지된
PyEval_AcquireLock()과PyEval_ReleaseLock()함수들을 제거하였습니다. 해당하는 함수들은 스레드 상태를 갱신하지 않았었습니다. 해당하는 함수들은 다음의 함수들을 통해 대체 가능합니다:(Victor Stinner가 gh-105182를 통해 기능을 구현하였습니다.)
파이썬 3.9에서 사용 지원이 중단(deprecated)되었던
PyEval_ThreadsInitialized()함수를 제거했습니다. 파이썬 3.7부터는Py_Initialize()가 항상 GIL을 생성합니다. 따라서,PyEval_InitThreads()를 호출해도 아무런 효과가 없으며PyEval_ThreadsInitialized()는 항상 0이 아닌 값을 반환합니다. (Victor Stinner가 gh-105182를 통해 기능을 구현하였습니다.)파이썬 3.8과의 하위 호환성을 위해 유지되던
_PyInterpreterState_Get()별칭(alias)을 제거했습니다. 해당하는 별칭(alias)은PyInterpreterState_Get()에 대한 별칭(alias)이었습니다. 파이썬 3.8 및 그 이전 버전에서PyInterpreterState_Get()을 사용하는 것은 pythoncapi-compat project를 통해 가능합니다. (Victor Stinner가 gh-106320를 통해 기능을 구현하였습니다.)비공개(private) 함수
_PyObject_FastCall()을 제거했습니다: 대신 파이썬 3.8부터 사용할 수 있는PyObject_Vectorcall()을 사용해주시기를 부탁드립니다(보다 자세한 내용의 경우 PEP 590를 참고해주시기를 부탁드립니다). (Victor Stinner가 gh-106023를 통해 기능을 구현하였습니다.)비공개(private) 함수만을 포함하던 cpython/pytime.h 헤더 파일을 제거했습니다. (Victor Stinner가 gh-106316를 통해 기능을 구현하였습니다.)
제한된 C API에서 문서화되지 않은 상수 PY_TIMEOUT_MAX를 제거했습니다.
휴지통 매크로 Py_TRASHCAN_SAFE_BEGIN과 Py_TRASHCAN_SAFE_END를 제거했습니다. 해당 매크로는 오래된 것이었습니다. 대신 새로운 매크로인 Py_TRASHCAN_BEGIN과 Py_TRASHCAN_END를 사용해주시기를 부탁드립니다. (Irit Katriel이 gh-105111를 통해 기능을 구현하였습니다.)
사용 지원 중단(deprecated)된 C API들¶
오래된 파이썬 초기화 함수들의 사용 지원을 중단(deprecate)합니다:
PySys_ResetWarnOptions(): 대신sys.warnoptions와warnings.filters를 초기화해주시기를 부탁드립니다.Py_GetExecPrefix(): 대신sys.exec_prefix를 활용해주시기를 부탁드립니다.Py_GetPath(): 대신sys.path를 활용해주시기를 부탁드립니다.Py_GetPrefix(): 대신sys.prefix를 활용해주시기를 부탁드립니다.Py_GetProgramFullPath(): 대신sys.executable를 활용해주시기를 부탁드립니다.Py_GetProgramName(): 대신sys.executable를 활용해주시기를 부탁드립니다.Py_GetPythonHome(): 대신PyConfig.home혹은PYTHONHOME환경 변수를 활용해주시기를 부탁드립니다.
(Victor Stinner가 gh-105145를 통해 기능을 구현하였습니다.)
PyEval_GetBuiltins(),PyEval_GetGlobals(),PyEval_GetLocals()함수를 소프트 사용 지원 중단(soft deprecated) 상태로 표시합니다. 이들 함수는 빌린 참조(borrowed reference)를 반환합니다.PyImport_ImportModuleNoBlock()함수를 사용 지원 중단(deprecate)합니다. 해당하는 함수는 파이썬 3.3부터PyImport_ImportModule()의 별칭(alias)입니다.PyModule_AddObject()함수를 소프트 사용 지원 중단(soft deprecated) 상태로 표시합니다. 해당하는 함수는PyModule_Add()또는PyModule_AddObjectRef()로 대체해야 합니다. (Serhiy Storchaka가 gh-86493를 통해 기능을 구현하였습니다.)오래된 Py_UNICODE 그리고 PY_UNICODE_TYPE 타입과
Py_UNICODE_WIDE매크로를 폐지합니다. 대신wchar_t타입을 사용해주시기를 부탁드립니다. 파이썬 3.3부터 Py_UNICODE와 PY_UNICODE_TYPE은wchar_t의 별칭(alias)입니다.PyWeakref_GetObject()와PyWeakref_GET_OBJECT()함수가 사용 지원 중단(deprecate)되었습니다. 해당하는 함수들은 빌린 참조(borrowed reference)를 반환합니다. 해당하는 함수들은 새PyWeakref_GetRef()함수로 대체되어야 합니다. 해당하는 함수는 강한 참조 (strong reference)를 반환합니다. 파이썬 3.12 및 그 이전 버전에서PyWeakref_GetRef()를 사용하기 위해 pythoncapi-compat 프로젝트를 활용할 수 있습니다.
파이썬 3.14에서 제거 예정인 항목들¶
확장 모듈용
PyDictObject의 ma_version_tag 필드(보다 자세한 내용의 경우 PEP 699과 gh-101193를 참고 부탁드립니다).변형 가능한(mutable) 기반으로부터
immutable types의 생성 (보다 자세한 내용의 경우 gh-95388를 참고 부탁드립니다).
파이썬 3.15에서 제거 예정인 항목들¶
PyImport_ImportModuleNoBlock(): 대신PyImport_ImportModule()를 사용해주시기를 부탁드립니다.PyWeakref_GetObject()와PyWeakref_GET_OBJECT(): 대신PyWeakref_GetRef()를 사용해주시기를 부탁드립니다. 파이썬 3.12 및 그 이전 버전에서PyWeakref_GetRef()를 사용하려면 pythoncapi-compat 프로젝트를 활용할 수 있습니다.Py_UNICODE타입과Py_UNICODE_WIDE매크로는 대신wchar_t를 사용해주시기를 부탁드립니다.PyUnicode_AsDecodedObject(): 대신PyCodec_Decode()를 사용해주시기를 부탁드립니다.PyUnicode_AsDecodedUnicode(): 대신PyCodec_Decode()를 사용해주시기를 부탁드립니다. 다만, 일부 코덱(예를 들어, "base64")은str이 아닌bytes와 같은 다른 타입을 반환할 수 있음을 주의해주시기를 부탁드립니다.PyUnicode_AsEncodedObject(): 대신PyCodec_Encode()를 사용해주시기를 부탁드립니다.PyUnicode_AsEncodedUnicode()대신PyCodec_Encode()를 사용해주시기를 부탁드립니다. 일부 코덱(예를 들어, "base64")은bytes가 아닌str과 같은 다른 타입을 반환할 수 있음을 주의해주시기를 부탁드립니다.파이썬 3.13에서 사용 지원 중단(deprecated)된 파이썬 초기화 함수들:
Py_GetPath(): 대신PyConfig_Get("module_search_paths")(sys.path)를 사용해주시기를 부탁드립니다.Py_GetPrefix(): 대신PyConfig_Get("base_prefix")(sys.base_prefix)를 사용해주시기를 부탁드립니다. 만약 가상 환경에 대한 처리가 필요한 경우에는 대신PyConfig_Get("prefix")(sys.prefix)를 사용해주시기를 부탁드립니다.Py_GetExecPrefix(): 대신PyConfig_Get("base_exec_prefix")(sys.base_exec_prefix)를 사용해주시기를 부탁드립니다. 만약 가상 환경에 대한 처리가 필요한 경우에는 대신PyConfig_Get("exec_prefix")(sys.exec_prefix)를 사용해주시기를 부탁드립니다.Py_GetProgramFullPath(): 대신PyConfig_Get("executable")(sys.executable)를 사용해주시기를 부탁드립니다.Py_GetProgramName(): 대신PyConfig_Get("executable")(sys.executable)를 사용해주시기를 부탁드립니다.Py_GetPythonHome(): 대신PyConfig_Get("home")혹은PYTHONHOME환경 변수를 사용해주시기를 부탁드립니다.
Python 3.13 및 이전 버전에서
PyConfig_Get()을 사용하기 위해 pythoncapi-compat 프로젝트를 사용할 수 있습니다.파이썬 3.11에서 사용 지원이 중단(deprecated)된, 파이썬 초기화를 구성하는 함수들은 다음과 같습니다:
PySys_SetArgvEx(): 대신PyConfig.argv를 설정해주시기를 부탁드립니다.PySys_SetArgv(): 대신PyConfig.argv를 설정해주시기를 부탁드립니다.Py_SetProgramName(): 대신PyConfig.program_name를 설정해주시기를 부탁드립니다.Py_SetPythonHome(): 대신PyConfig.home를 설정해주시기를 부탁드립니다.PySys_ResetWarnOptions(): 대신sys.warnoptions와warnings.filters를 초기화해주시기를 부탁드립니다.
Py_InitializeFromConfig()API는PyConfig와 함께 사용되어야 합니다.전역 구성 변수들:
Py_DebugFlag: 대신PyConfig.parser_debug나PyConfig_Get("parser_debug")를 사용해주시기를 부탁드립니다.Py_VerboseFlag: 대신PyConfig.verbose나PyConfig_Get("verbose")를 사용해주시기를 부탁드립니다.Py_QuietFlag: 대신PyConfig.quiet나PyConfig_Get("quiet")를 사용해주시기를 부탁드립니다.Py_InteractiveFlag: 대신PyConfig.interactive나PyConfig_Get("interactive")를 사용해주시기를 부탁드립니다.Py_InspectFlag: 대신PyConfig.inspect나PyConfig_Get("inspect")를 사용해주시기를 부탁드립니다.Py_OptimizeFlag: 대신PyConfig.optimization_level나PyConfig_Get("optimization_level")를 사용해주시기를 부탁드립니다.Py_NoSiteFlag: 대신PyConfig.site_import나PyConfig_Get("site_import")를 사용해주시기를 부탁드립니다.Py_BytesWarningFlag: 대신PyConfig.bytes_warning나PyConfig_Get("bytes_warning")를 사용해주시기를 부탁드립니다.Py_FrozenFlag: 대신PyConfig.pathconfig_warnings나PyConfig_Get("pathconfig_warnings")를 사용해주시기를 부탁드립니다.Py_IgnoreEnvironmentFlag: 대신PyConfig.use_environment나PyConfig_Get("use_environment")를 사용해주시기를 부탁드립니다.Py_DontWriteBytecodeFlag: 대신PyConfig.write_bytecode나PyConfig_Get("write_bytecode")를 사용해주시기를 부탁드립니다.Py_NoUserSiteDirectory: 대신PyConfig.user_site_directory나PyConfig_Get("user_site_directory")를 사용해주시기를 부탁드립니다.Py_UnbufferedStdioFlag: 대신PyConfig.buffered_stdio나PyConfig_Get("buffered_stdio")를 사용해주시기를 부탁드립니다.Py_HashRandomizationFlag: 대신PyConfig.use_hash_seed나PyConfig.hash_seed혹은PyConfig_Get("hash_seed")를 사용해주시기를 부탁드립니다.Py_IsolatedFlag: 대신PyConfig.isolated혹은PyConfig_Get("isolated")를 사용해주시기를 부탁드립니다.Py_LegacyWindowsFSEncodingFlag: 대신PyPreConfig.legacy_windows_fs_encoding혹은PyConfig_Get("legacy_windows_fs_encoding")를 사용해주시기를 부탁드립니다.Py_LegacyWindowsStdioFlag: 대신PyConfig.legacy_windows_stdio혹은PyConfig_Get("legacy_windows_stdio")를 사용해주시기를 부탁드립니다.Py_FileSystemDefaultEncoding와Py_HasFileSystemDefaultEncoding: 대신PyConfig.filesystem_encoding혹은PyConfig_Get("filesystem_encoding")를 사용해주시기를 부탁드립니다.Py_FileSystemDefaultEncodeErrors: 대신PyConfig.filesystem_errors혹은PyConfig_Get("filesystem_errors")를 사용해주시기를 부탁드립니다.Py_UTF8Mode: 대신PyPreConfig.utf8_mode혹은PyConfig_Get("utf8_mode")를 사용해주시기를 부탁드립니다 (보다 자세한 내용의 경우Py_PreInitialize()를 참고 부탁드립니다).
해당하는 옵션들을 설정하기 위해
Py_InitializeFromConfig()API를PyConfig와 함께 사용해주시기를 부탁드립니다. 혹은, 실행 시간에 해당하는 옵션 값을 가져오는 방식으로PyConfig_Get()을 사용해주시기를 부탁드립니다.
파이썬 3.16에서 제거 예정인 항목들¶
번들로 포함된
libmpdec사본.
파이썬 3.18에서 제거 예정인 항목들¶
다음의 비공개(private) 함수들은 사용 지원이 중단(deprecated)되었으며 파이썬 3.18에서 제거될 예정입니다.
_PyBytes_Join(): 대신PyBytes_Join()를 사용해주시기를 부탁드립니다._PyDict_GetItemStringWithError(): 대신PyDict_GetItemStringRef()를 사용해주시기를 부탁드립니다._PyDict_Pop(): 대신PyDict_Pop()을 사용해주시기를 부탁드립니다._PyLong_Sign(): 대신PyLong_GetSign()을 사용해주시기를 부탁드립니다._PyLong_FromDigits()그리고_PyLong_New(): 대신PyLongWriter_Create()를 사용해주시기를 부탁드립니다._PyThreadState_UncheckedGet(): 대신PyThreadState_GetUnchecked()를 사용해주시기를 부탁드립니다._PyUnicode_AsString(): 대신PyUnicode_AsUTF8()를 사용해주시기를 부탁드립니다._PyUnicodeWriter_Init():_PyUnicodeWriter_Init(&writer)와 같은 사용 대신writer = PyUnicodeWriter_Create(0)와 같은 사용을 부탁드립니다._PyUnicodeWriter_Finish():_PyUnicodeWriter_Finish(&writer)와 같은 사용 대신PyUnicodeWriter_Finish(writer)와 같은 사용을 부탁드립니다._PyUnicodeWriter_Dealloc():_PyUnicodeWriter_Dealloc(&writer)와 같은 사용 대신PyUnicodeWriter_Discard(writer)와 같은 사용을 부탁드립니다._PyUnicodeWriter_WriteChar():_PyUnicodeWriter_WriteChar(&writer, ch)와 같은 사용 대신PyUnicodeWriter_WriteChar(writer, ch)와 같은 사용을 부탁드립니다._PyUnicodeWriter_WriteStr():_PyUnicodeWriter_WriteStr(&writer, str)와 같은 사용 대신PyUnicodeWriter_WriteStr(writer, str)와 같은 사용을 부탁드립니다._PyUnicodeWriter_WriteSubstring():_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)와 같은 사용 대신PyUnicodeWriter_WriteSubstring(writer, str, start, end) " "와 같은 사용을 부탁드립니다._PyUnicodeWriter_WriteASCIIString():_PyUnicodeWriter_WriteASCIIString(&writer, str)와 같은 사용 대신PyUnicodeWriter_WriteASCII(writer, str)와 같은 사용을 부탁드립니다._PyUnicodeWriter_WriteLatin1String():_PyUnicodeWriter_WriteLatin1String(&writer, str)와 같은 사용 대신PyUnicodeWriter_WriteUTF8(writer, str)와 같은 사용을 부탁드립니다._PyUnicodeWriter_Prepare(): (다른 직접적인 대안이 없습니다.)_PyUnicodeWriter_PrepareKind(): (다른 직접적인 대안이 없습니다.)_Py_HashPointer(): 대신Py_HashPointer()를 사용해주시기를 부탁드립니다._Py_fopen_obj(): 대신Py_fopen()를 사용해주시기를 부탁드립니다.
pythoncapi-compat 프로젝트를 통해 Python 3.13 및 그 이전 버전에서 새로운 공개 함수를 사용할 수 있습니다.
향후 보다 상위 버전의 제거 예정 항목들¶
다음의 API는 사용 지원 중단(deprecated)되었습니다. 제거될 예정이지만, 아직 구체적인 제거 일정이 정해지지는 않았습니다.
Py_TPFLAGS_HAVE_FINALIZE: 파이썬 3.8부터 활용되고 있지 않습니다.PyErr_Fetch(): 대신PyErr_GetRaisedException()를 사용해주시기를 부탁드립니다.PyErr_NormalizeException(): 대신PyErr_GetRaisedException()를 사용해주시기를 부탁드립니다.PyErr_Restore(): 대신PyErr_SetRaisedException()를 사용해주시기를 부탁드립니다.PyModule_GetFilename(): 대신PyModule_GetFilenameObject()를 사용해주시기를 부탁드립니다.PyOS_AfterFork(): 대신PyOS_AfterFork_Child()를 사용해주시기를 부탁드립니다.PySlice_GetIndicesEx(): 대신PySlice_Unpack()과PySlice_AdjustIndices()를 사용해주시기를 부탁드립니다.PyUnicode_READY(): 파이썬 3.12부터 활용되고 있지 않습니다.PyErr_Display(): 대신PyErr_DisplayException()를 사용해주시기를 부탁드립니다._PyErr_ChainExceptions(): 대신_PyErr_ChainExceptions1()를 사용해주시기를 부탁드립니다.PyBytesObject.ob_shash: 대신PyObject_Hash()를 사용해주시기를 부탁드립니다.스레드 로컬 저장소 (Thread Local Storage; TLS) API:
PyThread_create_key(): 대신PyThread_tss_alloc()를 사용해주시기를 부탁드립니다.PyThread_delete_key(): 대신PyThread_tss_free()를 사용해주시기를 부탁드립니다.PyThread_set_key_value(): 대신PyThread_tss_set()를 사용해주시기를 부탁드립니다.PyThread_get_key_value(): 대신PyThread_tss_get()를 사용해주시기를 부탁드립니다.PyThread_delete_key_value(): 대신PyThread_tss_delete()를 사용해주시기를 부탁드립니다.PyThread_ReInitTLS(): 파이썬 3.7부터 활용되고 있지 않습니다.
빌드 변경 사항들¶
arm64-apple-ios와 arm64-apple-ios-simulator는 이제 PEP 11에서 규정된 3단계 (Tier 3) 지원 플랫폼입니다. (Russell Keith-Magee가 PEP 730를 작성하였으며, gh-114099를 통해 기능을 구현하였습니다.)
aarch64-linux-android와 x86_64-linux-android는 이제 PEP 11에서 규정된 3단계 (Tier 3) 지원 플랫폼입니다. (Malcolm Smith가 PEP 738를 작성하였으며, gh-116622를 통해 기능을 구현하였습니다.)
wasm32-wasi는 PEP 11에서 규정된 2단계 (Tier 2) 지원 플랫폼입니다. (Brett Cannon이 gh-115192를 통해 기능을 구현하였습니다.)wasm32-emscripten은 더 이상 PEP 11에서 규정된 공식 지원 플랫폼이 아닙니다. (Brett Cannon이 gh-115192를 통해 기능을 구현하였습니다.)
이제 CPython을 빌드하려면 C11 atomic 라이브러리, GCC 내장 atomic 함수, 또는 MSVC interlocked intrinsic를 지원하는 컴파일러가 필요합니다.
이제
configure스크립트를 다시 생성하려면 Autoconf 2.71과 aclocal 1.16.5가 필요합니다. (Christian Heimes가 gh-89886를 통해, 그리고 Victor Stinner가 gh-112090를 통해 기능을 구현하였습니다.)sqlite3확장 모듈을 빌드하려면 SQLite 3.15.2 이상이 필요합니다. (Erlend Aasland가 gh-105875를 통해 기능을 구현하였습니다.)CPython은 이제 기본적으로 mimalloc 라이브러리를 함께 제공합니다. 해당하는 라이브러리는 MIT 라이센스로 배포됩니다. 보다 자세한 내용은 mimalloc 라이센스을 참고 부탁드립니다. mimalloc 번들에는 사용자에 의한 변경 사항이 있을 수 있습니다. 보다 자세한 내용은 gh-113141을 참고 부탁드립니다.
configure스크립트의--with-system-libmpdec옵션 기본값은 이제yes입니다. 내장된 libmpdec 사본은 Python 3.16에서 제거될 예정입니다.configure에서--with-trace-refs(참조 추적) 옵션을 사용해 빌드한 파이썬은 이제 파이썬 릴리스 빌드 및 디버그 빌드와 ABI 호환됩니다. (Victor Stinner가 gh-108634를 통해 기능을 구현하였습니다.)POSIX 시스템에서 이제 pkg-config(
.) 파일 이름에 ABI 플래그가 포함됩니다. 예를 들어, 제한 없는 스레드를 사용하는(free-threaded) 빌드는 python-3.13t.pc를 생성하고 디버그 빌드는 python-3.13d.pc를 생성합니다.errno,fcntl,grp,md5,pwd,resource,termios,winsound,_ctypes_test,_multiprocessing.posixshmem,_scproxy,_stat,_statistics,_testconsole,_testimportmultiple, 그리고_uuidC 확장 모듈은 이제 제한된 C API (limited-c-api)로 빌드됩니다. (Victor Stinner가 gh-85283를 통해 기능을 구현하였습니다.)
파이썬 3.13으로의 (코드) 이식¶
해당하는 섹션을 통해, 앞서 설명한 변경 사항과, 코드 변경이 필요할 수 있는 기타 버그 수정 사항들을 나열하며 각각에 대한 설명을 드리고자 합니다.
파이썬 API 변경 사항¶
PEP 667는
locals()와f_locals의 의미 구조에 여러 변경 가능성을 제안하였습니다.최적화된 스코프(optimized scope)에서
locals()를 호출하면 호출할 때마다 서로 독립적인 스냅샷이 생성되며, 그 결과 이전에 반환된 참조는 더 이상 암시적으로 갱신되지 않습니다. 레거시 CPython 동작을 재현하려면, 처음에 반환된 딕셔너리를 이후의locals()호출 결과로 명시적으로 갱신해 주어야 합니다.locals()를 암시적으로 대상으로 하는 코드 실행 함수들(예를 들어, exec 혹은 eval)은 최적화된 스코프(optimized scope)에서 실행 결과에 접근하려면 반드시 명시적인 네임 스페이스(namespace)을 전달받아야 합니다. (PEP 667를 통해 제안된 가능성 중 일부가 적용된 결과입니다.)모듈이나 클래스 스코프에서 컴프리헨션 내부에서(exec혹은 eval를 사용하는 경우를 포함하는 방식으로)
locals()를 호출하면, 다시 한 번 그 컴프리헨션이 독립적인 중첩 함수처럼 실행되는 것과 같은 방식으로 작동합니다. 이를 감싸고 있는(containing) 스코프의 지역 변수는 포함되지 않습니다. 파이썬 3.12에서는 PEP 709을 통해 제안된 가능성 중 일부를 적용한 결과로, 감싸고 있는(containing) 스코프의 지역 변수까지 포함하도록 해당하는 동작이 구현되었던 적 있습니다. (현재 버전의 변경은, PEP 667를 통해 제안된 가능성 중 일부가 적용된 결과입니다.)이제 최적화된 스코프에서
FrameType.f_locals에 접근하면, 특정 시점에만 갱신되는 스냅샷이 아니라 이어쓰기(write-through) 프록시가 반환됩니다. 스냅샷이 필요한 경우에는, dict 생성자나 프록시의 .copy() 메서드를 통해 명시적으로 만들어주셔야 합니다. (PEP 667를 통해 제안된 가능성 중 일부가 적용된 결과입니다.)
functools.partial을 메서드로 사용할 경우 이제FutureWarning경고가 발생합니다. 해당하는 동작은 향후의 파이썬 버전에서 수정 변경될 예저입니다. 이전 방식의 동작을 그대로 유지하고자 하는 경우,staticmethod()로 감싸서 사용해주시기를 부탁드립니다. (Serhiy Storchaka가 gh-121027를 통해 기능을 구현하였습니다.)getpass.getuser()은 사용자 아이디 검색에 실패하면 비유닉스 플랫폼에서는ImportError, 유닉스 플랫폼에서는 비밀번호 데이터베이스가 비어 있는 경우KeyError대신OSError이 발생함을 유의해주시기를 부탁드립니다.gzip.GzipFile의mode어트리뷰트 값은 이제 정수형 (1또는2) 대신 문자열('rb'또는'wb')입니다.zipfile.ZipFile.open()에서 반환되는 읽기 가능한 파일형 객체의mode어트리뷰트 값은 이제'r'대신'rb'입니다. (Serhiy Storchaka가 gh-115961를 통해 기능을 구현하였습니다.)mailbox.Maildir는 이제 이름이 점('.')으로 시작하는 파일을 무시합니다. (Zackery Spytz가 gh-65559를 통해 기능을 구현하였습니다.)pathlib.Path.glob()및rglob()는 이제"**"로 끝나는 패턴이 주어지면 디렉터리뿐만 아니라 파일도 모두 반환합니다. 이전에는 디렉터리만 반환했습니다. 이전과 같이 디렉터리만 일치시키려면 패턴 끝에 슬래시를 추가하십시오.threading모듈은 이제_thread모듈에_is_main_interpreter()함수가 정의되어 있는 것을 가정합니다. 해당하는 함수는 인자를 받지 않으며, 현재의 인터프리터가 메인 인터프리터이면 True를 반환합니다.커스텀
_thread모듈을 제공하는 모든 라이브러리나 응용 프로그램은, 모듈의 다른 "비공개(private)" 어트리뷰트와 마찬가지로_is_main_interpreter()함수를 반드시 제공해야 합니다. (보다 자세한 내용은 gh-112826를 참고 부탁드립니다.)
C API 변경사항¶
Python.h는 더 이상<ieeefp.h>표준 헤더 파일을 포함하지 않습니다. 해당하는 헤더는 원래finite()함수를 제공하기 위해 포함되었으나, 이제 해당하는 함수는<math.h>헤더를 통해 제공됩니다. 이제는 필요한 경우에만 명시적으로 포함해야 합니다. 또한,HAVE_IEEEFP_H매크로가 제거되었습니다. (Victor Stinner가 gh-108765를 통해 기능을 구현하였습니다.)Python.h는 이제
<time.h>,<sys/select.h>,<sys/time.h>표준 헤더 파일을 더 이상 포함하지 않습니다. 이제는 필요한 경우에만 해당하는 헤더들을 명시적으로 포함해야 합니다. 예를 들어,<time.h>는clock()및gmtime()함수를 제공하고, <sys/select.h>`는 :c:func:!select` 함수를 제공하며,<sys/time.h>는futimes(),gettimeofday(),setitimer()함수들을 제공합니다. (Victor Stinner가 gh-108765를 통해 기능을 구현하였습니다.)Windows에서
Python.h는 더 이상<stddef.h>표준 헤더 파일을 포함하지 않습니다. 이제는 필요한 경우에만 해당하는 헤더들을 명시적으로 포함해야 합니다. 예를 들어, 해당하는 헤더는offsetof()함수와size_t및ptrdiff_t타입을 제공합니다. 다른 모든 플랫폼에서는 이미<stddef.h>를 명시적으로 포함해야 했습니다.HAVE_STDDEF_H매크로는 윈도우에서만 정의됩니다. (Victor Stinner가 gh-108765를 통해 기능을 구현하였습니다.)Py_LIMITED_API매크로가 정의된 경우,Py_BUILD_CORE,Py_BUILD_CORE_BUILTIN, 그리고Py_BUILD_CORE_MODULE매크로는 이제<Python.h>에서 정의가 해제됩니다. (Victor Stinner가 gh-85283를 통해 기능을 구현하였습니다.)이전 trashcan 매크로인
Py_TRASHCAN_SAFE_BEGIN과Py_TRASHCAN_SAFE_END가 제거되었습니다. 대신 보다 새로운 매크로인Py_TRASHCAN_BEGIN및Py_TRASHCAN_END를 사용해주시기를 부탁드립니다.이전 매크로를 사용하는
tp_dealloc함수는 다음과 같이:static void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_SAFE_BEGIN(p); ... Py_TRASHCAN_SAFE_END }
새 매크로를 사용하는 방식으로 업데이트되어야 합니다.
static void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_BEGIN(p, mytype_dealloc) ... Py_TRASHCAN_END }
Py_TRASHCAN_BEGIN의 두 번째 인자는 해당하는 매크로가 사용되는 할당 해제 함수 자신을 가리켜야 한다는 점을 유의해주십사 부탁드립니다. 새로운 매크로는 파이썬 3.8에서 추가되었고, 기존 매크로는 파이썬 3.11에서 사용 지원이 중단(deprecated)되었습니다. (Irit Katriel이 gh-105111을 통해 기능을 구현하였습니다.)
PEP 667은 프레임 관련 함수에 여러 변경 가능성을 제안합니다:
최적화된 스코프에서
PyEval_GetLocals()가 반환하는 딕셔너리를 변경했을 때의 작동 방식이 달라졌습니다. 추가된 새 딕셔너리 항목은 이제 해당 프레임에서 이어지는PyEval_GetLocals()호출에서만 보이게 됩니다.PyFrame_GetLocals(),locals(),FrameType.f_locals는 더 이상 동일한 하부 캐시 딕셔너리에 액세스하지 않습니다. 실제 변수 이름에 대한 항목과 이어쓰기(write-through) 프록시 인터페이스를 통해 추가된 이름에 대한 변경 사항은, 해당 프레임에서PyEval_GetLocals()를 이어서 호출하는 경우에 덮어씁니다. 권장되는 코드 수정 방법은 그 함수가 어떻게 사용되고 있었는지에 따라 달라질 수 있습니다. 보다 자세한 내용의 경우 해당하는 함수에 대한 사용 지원 중단 안내(deprecation notice)를 참고해주시기를 부탁드립니다.최적화된 스코프에서
PyFrame_GetLocals()를 호출하면, 이제는 시점이 불분명하게 갱신되는 스냅샷 대신 이어쓰기(write-through) 프록시를 반환합니다. 스냅샷이 필요한 경우에는 명시적으로 (예를 들어,PyDict_Copy()를 통해) 만들거나 혹은 새로운PyEval_GetFrameLocals()API를 호출하는 방법이 있습니다.PyFrame_FastToLocals`와 :c:func:()!PyFrame_FastToLocalsWithError`는 더 이상 아무런 효과도 가지지 않습니다. 파이썬 3.11에PyFrame_GetLocals()이 도입된 이후로 해당하는 함수들을 호출하는 것이 불필요하다는 점에 유의해주시기를 부탁드립니다.PyFrame_LocalsToFast()는 더 이상 아무런 효과도 가지지 않습니다.PyFrame_GetLocals()이 optimized scopes에 대한 이어 쓰기 프록시를 반환하므로 해당하는 함수를 호출하는 것이 불필요하다는 점에 유의해주시기를 부탁드립니다.
파이썬 3.13은 많은 비공개(private) 함수들을 제거했습니다. 일부는 다음과 같은 방식으로 대체될 수 있습니다:
_PyDict_Pop()PyDict_Pop()또는PyDict_PopString();_PyDict_GetItemWithError():PyDict_GetItemRef();_PyErr_WriteUnraisableMsg():PyErr_FormatUnraisable();_PyEval_SetTrace()PyEval_SetTrace()또는PyEval_SetTraceAllThreads();_PyList_Extend():PyList_Extend();_PyLong_AsInt():PyLong_AsInt();_PyMem_RawStrdup():strdup();_PyMem_Strdup():strdup();_PyObject_ClearManagedDict():PyObject_ClearManagedDict();_PyObject_VisitManagedDict():PyObject_VisitManagedDict();_PyThreadState_UncheckedGet():PyThreadState_GetUnchecked();_PyTime_AsSecondsDouble():PyTime_AsSecondsDouble();_PyTime_GetMonotonicClock()PyTime_Monotonic()또는PyTime_MonotonicRaw();_PyTime_GetPerfCounter()PyTime_PerfCounter()또는PyTime_PerfCounterRaw();_PyTime_GetSystemClock()PyTime_Time()또는PyTime_TimeRaw();_PyTime_MAX:PyTime_MAX;_PyTime_MIN:PyTime_MIN;_PyTime_t:PyTime_t;_Py_HashPointer():Py_HashPointer();_Py_IsFinalizing():Py_IsFinalizing().
파이썬 3.12 및 상위 버전에서 pythoncapi-compat 프로젝트를 통해 해당하는 새로운 함수 대부분을 사용할 수 있습니다.
회귀 테스트 변경 사항¶
configure--with-pydebug을 통해 빌드된 파이썬은 이제-X presite=package.module를 지원합니다. 해당하는 옵션을 사용하면site.py이 실행되기 전에 인터프리터의 라이프 사이클 초기에 가져와야 하는 모듈들을 지정합니다. (Łukasz Langa가 gh-110769를 통해 기능을 구현하였습니다.)