Python

파이썬 3.12의 새로운 기능

편집기:

Adam Turner

이 문서는 파이썬 3.11과 비교하여 파이썬 3.12에 도입된 새로운 기능들을 설명합니다. 파이썬 3.12는 2023년 10월 2일에 출시되었습니다. 자세한 내용은 변경 로그 를 참조하십시오.

더 보기

PEP 693 – 파이썬 3.12 출시 일정

요약 – 릴리스 하이라이트

파이썬 3.12는 파이썬 프로그래밍 언어의 안정 버전이며, 언어와 표준 라이브러리에 여러 변경 사항이 포함되어 있습니다. 라이브러리 변경 사항은 폐기된 API 정리, 사용성 및 정확성에 중점을 두고 있습니다. 특히, distutils 패키지가 표준 라이브러리에서 제거되었습니다. ospathlib 의 파일 시스템 지원 기능이 개선되었으며, 여러 모듈의 성능이 향상되었습니다.

언어 관련 변경 사항은 사용성에 중점을 두고 있으며, f-문자열 의 많은 제한이 해제되었고 ‘Did you mean …’ 제안 기능이 지속적으로 개선되고 있습니다. 새로운 타입 파라미터 구문type 문은 정적 타입 검사기에서 제네릭 유형타입 별칭 을 사용할 때의 편의성을 향상시킵니다.

이 문서는 모든 새 기능에 대한 완전한 명세를 제공하기보다는 편리한 개요를 제공합니다. 자세한 내용은 라이브러리 참조언어 참조 와 같은 문서들을 참조하십시오. 특정 변경 사항의 전체 구현과 설계 근거를 이해하려면 해당 기능에 대한 PEP를 참조하십시오. 단, PEP는 기능이 완전히 구현된 후에는 최신 상태로 유지되지 않는 경우가 많으니 주의하시기 바랍니다.


새로운 문법 기능:

새로운 문법 기능:

인터프리터 개선 사항:

파이썬 데이터 모델 개선:

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

보안 개선 사항:

  • 내장된 hashlib 의 SHA1, SHA3, SHA2-384, SHA2-512 및 MD5 구현을 HACL* 프로젝트에서 제공하는 공식 검증 코드로 대체합니다. 이러한 내장된 구현은 OpenSSL이 이를 제공하지 않을 때만 사용되는 대체 수단으로 남아 있습니다.

C API 개선 사항:

  • PEP 697, 불안정한(unstable) C API 계층

  • PEP 683, 불멸(immortal) 객체

CPython 구현 개선 사항:

  • PEP 709, 컴프리헨션 인라이닝

  • Linux perf 프로파일러를 위한 CPython 지원

  • 지원되는 플랫폼에서 스택 오버플로 방지 기능을 구현합니다.

새로운 타이핑 기능:

중요한 폐지, 제거 또는 제한 사항:

  • PEP 623: 파이썬 C API의 유니코드 객체에서 wstr 을 제거하여 모든 str 객체의 크기를 최소 8바이트 줄입니다.

  • PEP 632: distutils 패키지를 제거합니다. 제공되던 API를 대체하는 방법에 대한 조언은 마이그레이션 가이드 를 참조하십시오. Python 3.12 이상 버전에서도 해당 기능이 필요한 경우, 서드파티 Setuptools 패키지가 계속해서 distutils 를 제공합니다.

  • gh-95299: venv 로 생성된 가상 환경에 setuptools 를 미리 설치하지 마십시오. 이는 distutils, setuptools, pkg_resources, easy_install 을 더 이상 기본적으로 사용할 수 없음을 의미합니다. 이 기능들에 접근하려면 활성화된 가상 환경에서 pip install setuptools 를 실행하십시오.

  • The asynchat, asyncore, and imp modules have been removed, along with several unittest.TestCase method aliases.

새로운 기능

PEP 695: 타입 파라미터 구문

PEP 484 에 따른 제네릭 클래스와 함수는 타입 파라미터의 범위를 불분명하게 만들고 변이(variance)를 명시적으로 선언해야 하는 번거로운 구문을 사용하여 정의되었습니다.

PEP 695 은 더 간결하고 명확한 방식으로 제네릭 클래스함수 를 생성하는 방법을 도입합니다.

def max[T](args: Iterable[T]) -> T:
    ...

class list[T]:
    def __getitem__(self, index: int, /) -> T:
        ...

    def append(self, element: T) -> None:
        ...

또한, 이 PEP는 type 문을 사용하여 타입 별칭 를 선언하는 새로운 방법을 도입하며, 이는 TypeAliasType 의 인스턴스를 생성합니다.

type Point = tuple[float, float]

타입 별칭은 제네릭 일 수도 있습니다.

type Point[T] = tuple[T, T]

새 구문을 사용하면 TypeVarTupleParamSpec 파라미터뿐만 아니라 경계(bound)나 제약 조건이 있는 TypeVar 파라미터를 선언할 수 있습니다.

type IntFunc[**P] = Callable[P, int]  # ParamSpec
type LabeledTuple[*Ts] = tuple[str, *Ts]  # TypeVarTuple
type HashableSequence[T: Hashable] = Sequence[T]  # 경계가 있는 TypeVar
type IntOrStrSequence[T: (int, str)] = Sequence[T]  # 제약 조건이 있는 TypeVar

이 구문을 통해 생성된 타입 별칭의 값과 타입 변수의 경계 및 제약 조건은 필요할 때에만 평가됩니다(참고: 지연 평가). 이는 타입 별칭이 파일 내에서 나중에 정의되는 다른 유형을 참조할 수 있음을 의미합니다.

타입 파라미터 목록을 통해 선언된 타입 파라미터는 해당 선언의 범위와 중첩된 모든 스코프 내에서는 보이지만, 외부 스코프에서는 인식되지 않습니다. 예를 들어, 제네릭 클래스의 메서드에 대한 형식 주석이나 클래스 본문 내에서는 사용할 수 있지만, 클래스가 정의된 후 모듈 스코프에서 사용할 수는 없습니다. 타입 파라미터의 런타임 시맨틱에 대한 자세한 설명은 타입 매개변수 목록 를 참조하십시오.

이러한 범위(scoping) 시맨틱을 지원하기 위해 새로운 종류의 스코프인 어노테이션 스코프 가 도입됩니다. 어노테이션 스코프는 대부분 기능과 유사하게 동작하지만, 감싸고 있는 클래스 스코프와 상호작용하는 방식이 다릅니다. Python 3.13에서는 어노테이션 또한 어노테이션 스코프에서 평가됩니다.

자세한 내용은 PEP 695 를 참조하십시오.

(Eric Traut가 PEP을 작성했습니다. Jelle Zijlstra, Eric Traut 및 기타 인원들이 gh-103764 에서 구현을 담당했습니다.)

PEP 701: f-문자열의 구문 공식화

PEP 701f-문자열 사용에 대한 일부 제한을 해제합니다. 이제 f-문자열 내부의 표현식 구성 요소는 포함된 f-문자열과 동일한 따옴표를 사용하는 문자열, 여러 줄의 표현식, 주석, 백슬래시 및 유니코드 이스케이프 시퀀스를 포함하여 모든 유효한 파이썬 표현식이 될 수 있습니다. 이를 자세히 살펴보겠습니다.

  • 따옴표 재사용: Python 3.11에서 포함된 f-문자열과 동일한 따옴표를 재사용하면 SyntaxError 가 발생하여 사용자가 다른 가용한 따옴표를 사용해야만 했습니다(예를 들어, f-문자열이 단일 따옴표를 사용하는 경우 이중 따옴표나 삼중 따옴표를 사용). Python 3.12에서는 다음과 같이 수행할 수 있습니다.

    >>> songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism']
    >>> f"This is the playlist: {", ".join(songs)}"
    'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
    

    이 변경 전에는 f-문자열을 중첩하는 방식에 대한 명시적인 제한은 없었으나, f-문자열의 표현식 구성 요소 내에서 문자열 따옴표를 재사용할 수 없다는 사실 때문에 f-문자열을 임의로 중첩하는 것이 불가능했습니다. 실제로 다음과 같은 형태가 작성 가능한 가장 깊게 중첩된 f-문자열입니다.

    >>> f"""{f'''{f'{f"{1+1}"}'}'''}"""
    '2'
    

    이제 f-문자열이 표현 구성 요소 내에 유효한 파이썬 표현식을 포함할 수 있으므로, f-문자열을 임의로 중첩하는 것이 가능해졌습니다.

    >>> f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}"
    '2'
    
  • 여러 줄 표현식 및 주석: Python 3.11에서 f-문자열 내의 표현식이 원래 여러 줄에 걸쳐 나타날 수 있는 경우(예를 들어, 여러 줄에 걸쳐 정의되는 리터럴 목록)에도 f-문자열 표현식은 단일 줄로 정의되어야 했으므로 가독성이 떨어졌습니다. Python 3.12에서는 여러 줄에 걸친 f-문자열을 정의하고 인라인 주석을 추가할 수 있습니다.

    >>> f"This is the playlist: {", ".join([
    ...     'Take me back to Eden',  # My, my, those eyes like fire
    ...     'Alkaline',              # Not acid nor alkaline
    ...     'Ascensionism'           # Take to the broken skies at last
    ... ])}"
    'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
    
  • 백슬래시 및 유니코드 문자: Python 3.12 이전에는 f-문자령 표현식에 \ 문자를 포함할 수 없었습니다. 이는 이전에 f-문자열의 표현 구성 요소의 일부가 될 수 없었던 \N 부분을 포함하는 유니코드 이스케이프 시퀀스 (예: \N{snowman})에도 영향을 미쳤습니다. 이제 다음과 같이 표현식을 정의할 수 있습니다.

    >>> print(f"This is the playlist: {"\n".join(songs)}")
    This is the playlist: Take me back to Eden
    Alkaline
    Ascensionism
    >>> print(f"This is the playlist: {"\N{BLACK HEART SUIT}".join(songs)}")
    This is the playlist: Take me back to Eden♥Alkaline♥Ascensionism
    

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

이 기능이 구현된 방식(문자열 파싱 시 PEG 파서 사용)에 따른 긍정적인 부수 효과로, 이제 f-문자열에 대한 에러 메시지가 더 정확해졌으며 오류의 정확한 위치를 포함합니다. 예를 들어, Python 3.11에서는 다음 f-문자열이 SyntaxError 를 발생시켰습니다.

>>> my_string = f"{x z y}" + f"{1 + 1}"
  File "<stdin>", line 1
    (x z y)
     ^^^
SyntaxError: f-string: invalid syntax. Perhaps you forgot a comma?

그러나 당시 에러 메시지는 해당 줄 내의 정확한 오류 위치를 포함하지 않았으며 표현식이 인위적으로 괄호로 둘러싸여 있었습니다. Python 3.12에서는 f-문자열이 PEG 파서로 분석되므로, 에러 메시지가 더 정확해지고 전체 줄을 표시합니다.

>>> my_string = f"{x z y}" + f"{1 + 1}"
  File "<stdin>", line 1
    my_string = f"{x z y}" + f"{1 + 1}"
                   ^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?

(Pablo Galindo, Batuhan Taskaya, Lysandros Nikolaou, Cristián Maureira-Fredes, Marta Gómez가 gh-102856 에서 기여했습니다. PEP은 Pablo Galindo, Batuhan Taskaya, Lysandros Nikolaou, Marta Gómez가 작성했습니다.)

PEP 684: 인터프리터별 GIL

PEP 684 은 인터프리터별 GIL 을 도입하여, 이제 서브 인터프리터를 생성할 때 각 인터프리터마다 고유한 GIL이 부여되도록 합니다. 이를 통해 파이썬 프로그램이 다중 CPU 코어를 최대한 활용할 수 있습니다. 이 기능은 현재 C-API를 통해서만 가능하지만, 파이썬 API는 3.13 버전에서 도입될 예정입니다.

자체적인 GIL을 가진 인터프리터를 생성하려면 새로운 Py_NewInterpreterFromConfig() 함수를 사용하십시오.

PyInterpreterConfig config = {
    .check_multi_interp_extensions = 1,
    .gil = PyInterpreterConfig_OWN_GIL,
};
PyThreadState *tstate = NULL;
PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config);
if (PyStatus_Exception(status)) {
    return -1;
}
/* 새 인터프리터가 현재 스레드에서 활성화됩니다. */

인터프리터별 GIL을 가진 서브 인터프리터를 위해 C-API를 사용하는 방법에 대한 자세한 예제는 Modules/_xxsubinterpretersmodule.c 를 참조하십시오.

(Eric Snow가 gh-104210 등에서 기여했습니다.)

PEP 669: CPython을 위한 낮은 영향력의 모니터링

PEP 669 은 프로파일러, 디버거 및 기타 도구가 CPython의 이벤트를 모니터링할 수 있는 새로운 API 를 정의합니다. 여기에는 호출(calls), 반환(returns), 라인, 예외, 점프 등 광범위한 이벤트가 포함됩니다. 이는 사용한 기능에 대해서만 비용을 지불함을 의미하며, 거의 없는 오버헤드로 디버거 및 커버리지 도구를 지원합니다. 자세한 내용은 sys.monitoring 을 참조하십시오.

(Mark Shannon이 gh-103082 에서 기여했습니다.)

PEP 688: 파이썬에서 버퍼 프로토콜을 사용할 수 있게 함

PEP 688 은 파이썬 코드에서 버퍼 프로토콜 을 사용하는 방법을 도입합니다. __buffer__() 메서드를 구현하는 클래스는 이제 버퍼 유형으로 사용할 수 있습니다.

새로운 collections.abc.Buffer ABC는 예를 들어 형식 주석에서 버퍼 객체를 표현하는 표준 방식을 제공합니다. 새로운 inspect.BufferFlags 열거형(enum)은 버퍼 생성을 사용자 정의하기 위해 사용되는 플래그를 나타냅니다. (Jelle Zijlstra가 gh-102500 에서 기여했습니다.)

PEP 709: 컴프리헨션 인라이닝

딕셔너리, 리스트, 세트 컴프리헨션은 이제 매 실행마다 단일 사용 함수 객체를 생성하는 대신 인라인 처리됩니다. 이를 통해 컴프리헨션의 실행 속도가 최대 두 배까지 빨라집니다. 자세한 내용은 PEP 709 를 참조하십시오.

컴프리헨션 반복 변수는 독립된 상태를 유지하며 외부 스코프에서 동일한 이름의 변수를 덮어쓰지 않고, 컴프리헨션이 끝난 후에도 보이지 않습니다. 인라이닝으로 인해 몇 가지 눈에 띄는 동작 변화가 발생합니다.

  • 트레이스백에서 컴프리헨션을 위한 별도의 프레임이 더 이상 생성되지 않으며, 트레이싱/프로파일링 시에도 컴프리헨션이 함수 호출로 표시되지 않습니다.

  • symtable 모듈은 더 이상 각 컴프리헨션에 대해 하위 심볼 테이블을 생성하지 않습니다. 대신, 컴프리헨션의 지역 변수가 부모 함수의 심볼 테이블에 포함됩니다.

  • 컴프리헨션 내부에서 locals`를 호출하면 이제 컴프리헨션 외부의 변수들이 포함되며, 이상 컴프리헨션 '인자'를 위한 합성된 `().0`` 변수가 포함되지 않습니다.

  • locals()``를 직접 반복하는 컴프리헨션(예: ``[k for k in locals()])은 트레이싱(예: 코드 커버리지 측정) 환경에서 실행될 때 “RuntimeError: dictionary changed size during iteration”을 발생시킬 수 있습니다. 이는 이미 for k in locals(): 등에서 확인된 것과 동일한 동작입니다. 이 오류를 방지하려면 먼저 반복할 키의 리스트를 생성하십시오: keys = list(locals()); [k for k in keys].

(Carl Meyer와 Vladimir Matveev가 PEP 709 에서 기여했습니다.)

에러 메시지 개선

  • 이제 최상위 레벨에서 NameError 가 발생할 때 인터프리터가 표시하는 에러 메시지의 일부로 표준 라이브러리의 모듈이 제안될 수 있습니다. (Pablo Galindo가 gh-98254 에서 기여했습니다.)

    >>> sys.version_info
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'sys' is not defined. Did you forget to import 'sys'?
    
  • 인스턴스에 대한 NameError 예외의 에러 제안을 개선했습니다. 이제 메서드 내에서 NameError 가 발생하고 인스턴스가 예외의 이름과 정확히 일치하는 속성을 보유한 경우, 제안 내용에 메서드 범위 내의 가장 유사한 매칭 대신 self.<NAME> 이 포함됩니다. (Pablo Galindo가 :gh:`99139 에서 기여했습니다.)

    >>> class A:
    ...    def __init__(self):
    ...        self.blech = 1
    ...
    ...    def foo(self):
    ...        somethin = blech
    ...
    >>> A().foo()
    Traceback (most recent call last):
      File "<stdin>", line 1
        somethin = blech
                   ^^^^^
    NameError: name 'blech' is not defined. Did you mean: 'self.blech'?
    
  • 사용자가 from y import x 대신 import x from y 를 입력할 때 발생하는 SyntaxError 메시지를 개선했습니다. (Pablo Galindo가 gh-98931 에서 기여했습니다.)

    >>> import a.y.z from b.y.z
    Traceback (most recent call last):
      File "<stdin>", line 1
        import a.y.z from b.y.z
        ^^^^^^^^^^^^^^^^^^^^^^^
    SyntaxError: Did you mean to use 'from ... import ...' instead?
    
  • 실패한 from <module> import <name> 문에서 발생하는 ImportError 예외에 이제 <module> 내에서 사용 가능한 이름을 기반으로 한 <name> 의 값 제안이 포함됩니다. (Pablo Galindo가 gh-91058 에서 기여했습니다.)

    >>> from collections import chainmap
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ImportError: cannot import name 'chainmap' from 'collections'. Did you mean: 'ChainMap'?
    

기타 언어 변경 사항

  • 이제 파서가 널 바이트를 포함하는 소스 코드를 분석할 때 SyntaxError 를 발생시킵니다. (Pablo Galindo가 gh-96670 에서 제공함.)

  • 유효한 이스케이프 시퀀스가 아닌 역 슬래시 문자 쌍이 이제 DeprecationWarning 대신 SyntaxWarning 을 생성합니다. 예를 들어, re.compile("\d+\.\d+") 는 이제 SyntaxWarning 을 발생시킵니다("\d" 은 유효하지 않은 이스케이프 시퀀스이며, 정규 표현식에는 raw 문자열을 사용하십시오: re.compile(r"\d+\.\d+")). 향후 파이썬 버전에서는 SyntaxWarning 대신 최종적으로 SyntaxError 가 발생하게 됩니다. (Victor Stinner가 gh-98401 에서 제공함.)

  • 파이썬 3.11에서 지원이 중단된 0o377 보다 큰 값을 가진 8진수 이스케이프(예: "\477")는 이제 DeprecationWarning 대신 SyntaxWarning 을 생성합니다. 향후 파이썬 버전에서는 최종적으로 SyntaxError 가 발생하게 됩니다. (Victor Stinner가 gh-98401 에서 제공함.)

  • 컴프리헨션의 타겟 부분에서 저장되지 않는 변수들이 이제 할당 표현식(:=)에 사용될 수 있습니다. 예를 들어, [(b := 1) for a, b.prop in some_iter] 에서 b 에 대한 할당이 허용됩니다. 주의할 점은 PEP 572 에 따라 컴프리헨션 타겟 부분에서 저장되는 변수(예: a)에 할당하는 것은 여전히 금지된다는 것입니다. (Nikita Sobolev가 gh-100581 에서 제공함.)

  • 클래스 또는 타입의 __set_name__ 메서드에서 발생한 예외가 더 이상 RuntimeError 로 감싸지지 않습니다. 컨텍스트 정보는 PEP 678 노트로 예외에 추가됩니다. (Irit Katriel이 gh-77757 에서 제공함.)

  • try-except* 구조가 전체 ExceptionGroup 을 처리하고 다른 하나의 예외를 발생시킬 때, 해당 예외는 더 이상 ExceptionGroup 으로 감싸지지 않습니다. 이 변경 사항은 3.11.4 버전에서도 적용되었습니다. (Irit Katriel이 gh-103590 에서 제공함.)

  • 가비지 컬렉터(Garbage Collector)가 이제 객체 할당 대신 파이썬 바이트코드 평가 루프의 eval breaker 메커니즘에서만 실행됩니다. 또한 PyErr_CheckSignals() 가 호출될 때도 GC가 실행될 수 있으므로, 파이썬 코드를 실행하지 않고 장시간 실행되어야 하는 C 확장 프로그램도 주기적으로 GC를 실행할 기회를 얻게 됩니다. (Pablo Galindo가 gh-97922 에서 제공함.)

  • 불리언 매개변수를 기대하는 모든 내장 및 확장 호출 가능 객체(callable)가 이제 boolint 뿐만 아니라 모든 타입의 인자를 수용합니다. (Serhiy Storchaka가 gh-60203 에서 제공함.)

  • memoryview 가 이제 half-float 타입(형식 코드 “e”)을 지원합니다. (Donghee Na와 Antoine Pitrou가 gh-90751 에서 제공함.)

  • slice 객체가 이제 해시 가능(hashable)해져서 딕셔너리 키나 집합 항목으로 사용할 수 있습니다. (Will Bradshaw, Furkan Onder, 그리고 Raymond Hettinger가 gh-101264 에서 제공함.)

  • sum() 이 이제 부동 소수점 수나 정수와 부동 소수점 수가 섞인 경우를 합산할 때 정확도와 교환성을 개선하기 위해 Neumaier summation을 사용합니다. (Raymond Hettinger가 gh-100425 에서 제공함.)

  • ast.parse() 가 이제 널 바이트를 포함하는 소스 코드를 분석할 때 ValueError 대신 SyntaxError 를 발생시킵니다. (Pablo Galindo가 gh-96670 에서 제공함.)

  • tarfile 의 추출 메서드와 shutil.unpack_archive() 에 목적지 디렉토리 외부에 파일을 생성하는 것과 같이 당혹스럽거나 위험할 수 있는 tar 기능을 제한할 수 있는 새로운 filter 인자가 추가되었습니다. 자세한 내용은 tarfile extraction filters 를 참조하십시오. 파이썬 3.14에서 기본값은 'data' 로 변경됩니다. (Petr Viktorin이 PEP 706 에서 제공함.)

  • types.MappingProxyType instances are now hashable if the underlying mapping is hashable. (Contributed by Serhiy Storchaka in gh-87995.)

  • 새로운 환경 변수 PYTHONPERFSUPPORT 및 명령줄 옵션 -X perf 를 통한 perf 프로파일러 지원 과 새로운 sys.activate_stack_trampoline(), sys.deactivate_stack_trampoline(), 그리고 sys.is_stack_trampoline_active() 함수들을 추가했습니다. (Pablo Galindo가 설계하고, Pablo Galindo와 Christian Heimes가 Gregory P. Smith [Google], Mark Shannon과 함께 gh-96123 에서 제공함.)

새로운 모듈

  • 없음.

개선된 모듈

배열

asyncio

  • The performance of writing to sockets in asyncio has been significantly improved. asyncio now avoids unnecessary copying when writing to sockets and uses sendmsg() if the platform supports it. (Contributed by Kumar Aditya in gh-91166.)

  • 이벤트 루프에서 즉시 실행(eager task execution)을 선택하여 일부 유즈케이스를 2~5배 더 빠르게 만들 수 있도록 하는 asyncio.eager_task_factory()asyncio.create_eager_task_factory() 함수를 추가했습니다. (Jacob Bower & Itamar Oren이 gh-102853, gh-104140, gh-104138 에서 제공함.)

  • 리눅스에서, asyncioos.pidfd_open() 이 사용 가능하고 정상 작동하는 경우 asyncio.ThreadedChildWatcher 대신 기본적으로 asyncio.PidfdChildWatcher 를 사용합니다. (Kumar Aditya가 gh-98024 에서 기여함.)

  • 이벤트 루프는 이제 각 플랫폼에서 사용 가능한 최상의 자식 감시자(asyncio.PidfdChildWatcher 가 지원되면 이를, 그렇지 않으면 asyncio.ThreadedChildWatcher 를 사용)를 사용하므로 자식 감시자를 수동으로 구성하는 것은 권장되지 않습니다. (Kumar Aditya가 gh-94597 에서 기여함.)

  • asyncio.run() 에 커스텀 이벤트 루프 팩토리를 지정할 수 있도록 loop_factory 매개변수를 추가했습니다. (Kumar Aditya가 gh-99388 에서 기여함.)

  • asyncio.current_task() 의 속도를 4~6배 향상시키기 위해 C 구현을 추가했습니다. (Itamar Oren과 Pranav Thulasiram Bhat이 gh-100344 에서 기여함.)

  • asyncio 는 이전의 제너레이터 기반 코루틴을 지원하지 않으므로, asyncio.iscoroutine() 은 이제 제너레이터에 대해 False 를 반환합니다. (Kumar Aditya가 gh-102748 에서 기여함.)

  • asyncio.wait()asyncio.as_completed() 이 이제 태스크를 생성하는 제너레이터를 수용합니다. (Kumar Aditya가 gh-78530 에서 기여함.)

calendar

csv

dis

  • Pseudo instruction opcodes (which are used by the compiler but do not appear in executable bytecode) are now exposed in the dis module. HAVE_ARGUMENT is still relevant to real opcodes, but it is not useful for pseudo instructions. Use the new dis.hasarg collection instead. (Contributed by Irit Katriel in gh-94216.)

  • Add the dis.hasexc collection to signify instructions that set an exception handler. (Contributed by Irit Katriel in gh-94216.)

fractions

  • fractions.Fraction 타입의 객체가 이제 부동 소수점 스타일 형식을 지원합니다. (Mark Dickinson이 gh-100161 에서 기여함.)

importlib.resources

inspect

itertools

  • 마지막 배치가 나머지보다 짧을 수 있는 경우 동일한 크기의 튜플로 수집하는 itertools.batched() 를 추가했습니다. (Raymond Hettinger가 gh-98363 에서 기여함.)

math

  • 곱들의 합을 계산하는 math.sumprod() 를 추가했습니다. (Raymond Hetinger가 gh-100485 에서 기여함.)

  • math.nextafter() 를 확장하여 한 번에 여러 단계씩 위나 아래로 이동할 수 있는 steps 인자를 포함하도록 했습니다. (Matthias Goergens, Mark Dickinson, 그리고 Raymond Hettinger가 gh-94906 에서 기여함.)

os

  • os.pidfd_open() 을 사용하여 프로세스의 파일 기술자를 비차단(non-blocking) 모드로 열 수 있도록 하는 os.PIDFD_NONBLOCK 을 추가했습니다. (Kumar Aditya가 gh-93312 에서 기여함.)

  • os.DirEntry 에 해당 항목이 연결점(junction)인지 확인하는 os.DirEntry.is_junction() 메서드가 추가되었습니다. (Charles Machalow가 gh-99547 에서 기여함.)

  • Windows에서 드라이브, 볼륨 및 탑재 지점을 열거하는 os.listdrives(), os.listvolumes(), os.listmounts() 함수를 추가했습니다. (Steve Dower가 gh-102519 에서 기여함.)

  • os.stat()os.lstat() 이 이제 Windows에서 더 정확하게 동작합니다. st_birthtime 필드에 파일 생성 시간이 채워지며, st_ctime 은 폐지(deprecated)되었으나 여전히 생성 시간을 포함합니다(향후 다른 플랫폼과의 일관성을 위해 마지막 메타데이터 변경 시점을 반환할 예정입니다). st_dev 는 파일 시스템에 따라 최대 64비트, st_ino 는 최대 128비트가 될 수 있으며, st_rdev 는 잘못된 값 대신 항상 0으로 설정됩니다. 두 함수 모두 최신 Windows 버전에서 상당히 빨라질 수 있습니다. (Steve Dower가 gh-99726 에서 기여함.)

os.path

  • 주어진 경로가 연결점(junction)인지 확인하는 os.path.isjunction() 을 추가했습니다. (Charles Machalow가 gh-99547 에서 기여함.)

  • os.path.splitroot() 를 추가하여 경로를 (drive, root, tail) 의 세 부분으로 나눌 수 있게 했습니다. (Barney Gale이 gh-101000 에서 기여함.)

pathlib

platform

  • Windows 11 및 2012 이후의 Windows Server 릴리스를 감지하는 기능을 추가했습니다. 이전에는 Windows Server 2012보다 최신인 Windows Server 플랫폼이나 Windows 11에서 조회를 수행하면 Windows-10 을 반환했습니다. (Steve Dower가 gh-89545 에서 기여함.)

pdb

  • 디버그 세션에서 값을 일시적으로 보유하고 현재 프레임이나 반환 값과 같은 값에 빠르게 접근할 수 있는 편의 변수들을 추가했습니다. (Tian Gao가 gh-103693 에서 기여함.)

random

shutil

  • shutil.make_archive() 가 이제 이를 지원하는 사용자 정의 아카이버에 root_dir 인수를 전달합니다. 이 경우 더 이상 압축을 수행하기 위해 프로세스의 현재 작업 디렉터리를 root_dir 로 일시적으로 변경하지 않습니다. (Serhiy Storchaka가 gh-74696 에서 기여함.)

  • shutil.rmtree() 가 이제 onerror 와 유사한 오류 처리기인 onexc 인수를 수락합니다. onexc(typ, val, tb) 튜플 대신 예외 인스턴스를 기대합니다. onerror 는 사용 지원이 중단(deprecated)되었습니다. (Irit Katriel이 gh-102828 에서 기여함.)

  • shutil.which() 이 이제 Windows에서 주어진 cmd 에 디렉터리 구성 요소가 포함된 경우에도 PATH 내에서 일치하는 항목을 찾기 위해 PATHEXT 환경 변수를 참조합니다. (Charles Machalow가 gh-103179 에서 기여함.)

    shutil.which() 이 Windows에서 실행 파일을 조회할 때 현재 작업 디렉터리를 검색 경로에 추가해야 하는지 결정하기 위해 NeedCurrentDirectoryForExePathW 를 호출합니다. (Charles Machalow가 gh-103179 에서 기여함.)

    shutil.which() 이 Windows에서 검색 경로의 다른 곳에서 직접 일치하는 것을 찾기 전에 PATHEXT 의 구성 요소가 포함된 cmd 와 일치하는 경로를 반환합니다. (Charles Machalow가 gh-103179 에서 기여함.)

sqlite3

statistics

  • 순위화된 데이터의 스피어먼 상관계수를 계산하기 위해 순위 기반의 ranked 메서드를 포함하도록 statistics.correlation() 을 확장했습니다. (Raymond Hettinger가 gh-95861 에서 기여함.)

sys

tempfile

  • tempfile.NamedTemporaryFile 함수에 새로운 선택적 매개변수 delete_on_close 가 추가되었습니다. (Evgeny Zorin이 gh-58451 에서 기여함.)

  • tempfile.mkdtemp() 은 이제 dir 매개변수로 제공된 인수가 상대 경로이더라도 항상 절대 경로를 반환합니다.

threading

tkinter

  • tkinter.Canvas.coords() 가 이제 인수를 평탄화(flatten)합니다. 이 함수는 개별 좌표(x1, y1, x2, y2, ...) 및 좌표 시퀀스([x1, y1, x2, y2, ...])뿐만 아니라 create_*() 메서드와 같이 쌍으로 묶인 좌표((x1, y1), (x2, y2), ...[(x1, y1), (x2, y2), ...])도 수용합니다. (Serhiy Storchaka가 gh-94473 에서 기여함.)

토큰화(tokenize)

  • tokenize 모듈에 PEP 701 에서 도입된 변경 사항이 포함되었습니다. (Marta Gómez Macías 및 Pablo Galindo가 gh-102856 에서 기여함.) tokenize 모듈의 변경 사항에 대한 자세한 내용은 Python 3.12로 이식 를 참조하십시오.

types

typing

  • isinstance() 를 사용하여 runtime-checkable protocols 를 검사할 때, 속성 존재 여부를 확인하기 위해 이제 hasattr() 대신 inspect.getattr_static() 을 사용합니다. 이는 runtime-checkable 프로토콜에 대한 isinstance() 검사 중에 디스크립터와 __getattr__() 메서드가 더 이상 예기치 않게 평가되지 않음을 의미합니다. 그러나 이로 인해 기존에 특정 runtime-checkable 프로토콜의 인스턴스로 간주되던 일부 객체가 Python 3.12+에서 해당 프로토콜의 인스턴스로 간주되지 않거나, 그 반대의 경우도 발생할 수 있습니다. 대부분의 사용자는 이 변화에 영향을 받지 않을 것입니다. (Alex Waygood이 gh-102433 에서 기여함.)

  • runtime-checkable 프로토콜의 멤버는 이제 클래스가 생성되는 즉시 런타임에서 “얼어붙은(frozen)” 상태로 간주됩니다. runtime-checkable 프로토콜에 속성을 몽키 패치(Monkey-patching)하는 것은 여전히 작동하지만, 객체를 해당 프로토콜과 비교하는 isinstance() 검사에는 영향을 주지 않습니다. 예를 들어:

    >>> from typing import Protocol, runtime_checkable
    >>> @runtime_checkable
    ... class HasX(Protocol):
    ...     x = 1
    ...
    >>> class Foo: ...
    ...
    >>> f = Foo()
    >>> isinstance(f, HasX)
    False
    >>> f.x = 1
    >>> isinstance(f, HasX)
    True
    >>> HasX.y = 2
    >>> isinstance(f, HasX)  # HasX에 "y" 속성이 추가되었음에도 결과는 변하지 않음
    True
    

    이 변경 사항은 runtime-checkable 프로토콜에 대한 isinstance() 검사 속도를 높이기 위해 이루어졌습니다.

  • isinstance() 를 사용하여 runtime-checkable protocols 를 검사할 때의 성능 프로파일이 크게 변했습니다. 멤버가 몇 개 없는 프로토콜에 대한 대부분의 isinstance() 검사는 3.11보다 최소 2배 이상 빨라졌으며, 일부는 20배 또는 그 이상 빠를 수 있습니다. 하지만 멤버가 많은 프로토콜에 대한 isinstance() 검사는 Python 3.11보다 느려질 수 있습니다. (Alex Waygood이 gh-74690gh-103193 에서 기여함.)

  • 모든 typing.TypedDicttyping.NamedTuple 클래스가 이제 __orig_bases__ 속성을 가집니다. (Adrian Garcia Badaracco가 gh-103699 에서 기여함.)

  • @typing.dataclass_transformfrozen_default 매개 변수를 추가했습니다. (Erik De Bonte가 gh-99957 에서 기여함.)

unicodedata

  • 유니코드 데이터베이스가 버전 15.0.0으로 업데이트되었습니다. (Benjamin Peterson이 gh-96734 에서 기여함.)

unittest

가장 느린 N개의 테스트 사례를 보여주는 --durations 명령행 옵션을 추가했습니다:

python3 -m unittest --durations=3 lib.tests.test_threading
.....
Slowest test durations
----------------------------------------------------------------------
1.210s     test_timeout (Lib.test.test_threading.BarrierTests)
1.003s     test_default_timeout (Lib.test.test_threading.BarrierTests)
0.518s     test_timeout (Lib.test.test_threading.EventTests)

(0.000 durations hidden.  Use -v to show these durations.)
----------------------------------------------------------------------
Ran 158 tests in 9.869s

OK (skipped=3)

(Giampaolo Rodola가 gh-48330 에서 기여함)

uuid

최적화

  • Unicode 객체에서 wstrwstr_length 멤버를 제거했습니다. 이로 인해 64비트 플랫폼에서 객체 크기가 8 또는 16바이트 감소합니다. (PEP 623) (Inada Naoki가 gh-92536 에서 기여함.)

  • 빌드 프로세스에서 성능을 1~5% 향상시키는 BOLT 바이너리 최적화 도구 사용에 대한 실험적 지원을 추가했습니다. (Kevin Modzelewski가 gh-90536 에서 기여하고 Donghee Na가 gh-101525 에서 조정함)

  • Speed up the regular expression substitution (functions re.sub() and re.subn() and corresponding re.Pattern methods) for replacement strings containing group references by 2–3 times. (Contributed by Serhiy Storchaka in gh-91524.)

  • 비용이 많이 드는 문자열 포맷팅을 지연시켜 asyncio.Task 생성 속도를 높였습니다. (Itamar Oren이 gh-103793 에서 기여함.)

  • tokenize 모듈에서 PEP 701 을 지원하기 위해 필요한 변경 사항의 부수적인 효과로 tokenize.tokenize()tokenize.generate_tokens() 함수가 최대 64% 더 빨라졌습니다. (Marta Gómez Macías 및 Pablo Galindo가 gh-102856 에서 기여함.)

  • 새로운 LOAD_SUPER_ATTR 명령어를 통해 super() 메서드 호출 및 속성 로드 속도를 높였습니다. (Carl Meyer 및 Vladimir Matveev가 gh-103497 에서 기여함.)

CPython 바이트코드 변경 사항

데모 및 도구

  • 오래된 데모 스크립트가 포함되어 있던 Tools/demo/ 디렉토리를 제거했습니다. 사본은 old-demos 프로젝트 에서 찾을 수 있습니다. (Victor Stinner가 gh-97681 에서 기여함.)

  • Tools/scripts/ 디렉토리의 오래된 예제 스크립트를 제거했습니다. 사본은 old-demos 프로젝트 에서 찾을 수 있습니다. (Victor Stinner가 gh-97669 에서 기여함.)

폐지됨

  • argparse: argparse.BooleanOptionalActiontype, choices, 그리고 metavar 매개변수가 폐지되었으며 3.14 버전에서 제거될 예정입니다. (Nikita Sobolev가 gh-92248 에서 기여함.)

  • ast: 다음 ast 기능들은 파이썬 3.8부터 문서에서 폐지되었으며, 현재는 접근하거나 사용할 때 런타임에 DeprecationWarning 을 발생시키고 파이썬 3.14에서 제거될 예정입니다:

    • ast.Num

    • ast.Str

    • ast.Bytes

    • ast.NameConstant

    • ast.Ellipsis

    대신 ast.Constant 를 사용하십시오. (Serhiy Storchaka가 gh-90953 에서 기여함.)

  • asyncio:

    • 자식 관찰자(child watcher) 클래스인 asyncio.MultiLoopChildWatcher, asyncio.FastChildWatcher, asyncio.AbstractChildWatcher, 그리고 asyncio.SafeChildWatcher 가 폐지되었으며 파이썬 3.14에서 제거될 예정입니다. (Kumar Aditya가 gh-94597 에서 기여함.)

    • asyncio.set_child_watcher(), asyncio.get_child_watcher(), asyncio.AbstractEventLoopPolicy.set_child_watcher(), 그리고 asyncio.AbstractEventLoopPolicy.get_child_watcher() 가 폐지되었으며 파이썬 3.14에서 제거될 예정입니다. (Kumar Aditya가 gh-94597 에서 기여함.)

    • 기본 이벤트 루프 정책의 get_event_loop() 메서드는 현재 설정된 이벤트 루프가 없는 상태에서 새로운 루프를 생성하기로 결정할 경우 이제 DeprecationWarning 을 발생시킵니다. (Serhiy Storchaka와 Guido van Rossum이 gh-100160 에서 제안함.)

  • calendar: calendar.Januarycalendar.February 상수는 더 이상 사용되지 않으며(deprecated), 대신 calendar.JANUARYcalendar.FEBRUARY 로 대체됩니다. (Prince Roshan이 gh-103636 에서 제안함.)

  • collections.abc: collections.abc.ByteString 이(가) 더 이상 사용되지 않습니다(deprecated).

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

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

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

  • datetime: datetime.datetimeutcnow()utcfromtimestamp() 는 더 이상 사용되지 않으며(deprecated) 향후 버전에서 제거될 예정입니다. 대신 UTC 날짜를 나타낼 때는 시간대 정보가 포함된 객체를 사용하십시오. 즉, tz 매개변수를 datetime.UTC 로 설정하고 now()fromtimestamp() 를 각각 호출하십시오. (Paul Gansle가 gh-103857 에서 제안함.)

  • email: email.utils.localtime()isdst 매개 변수 사용을 중단합니다. (Alan Williams가 gh-72346 에서 제안함.)

  • importlib.abc: 다음 클래스들의 사용을 중단하며, Python 3.14에서 제거될 예정입니다:

    • importlib.abc.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

    대신 importlib.resources.abc 클래스들을 사용하십시오:

    (Jason R. Coombs와 Hugo van Kemenade가 gh-93963 에서 제안함.)

  • itertools: 문서화되지 않았고 비효율적이며 과거부터 버그가 많고 일관성이 없는 copy, deepcopy 및 pickle 연산 지원을 중단합니다. 이는 코드 분량과 유지 관리 부담을 크게 줄이기 위해 3.14에서 제거될 예정입니다. (Raymond Hettinger가 gh-101588 에서 제안함.)

  • multiprocessing: In Python 3.14, the default multiprocessing start method will change to a safer one on Linux, BSDs, and other non-macOS POSIX platforms where 'fork' is currently the default (gh-84559). Adding a runtime warning about this was deemed too disruptive as the majority of code is not expected to care. Use the get_context() or set_start_method() APIs to explicitly specify when your code requires 'fork'. See contexts and start methods.

  • pkgutil: pkgutil.find_loader()pkgutil.get_loader() 는 더 이상 사용되지 않으며(deprecated) Python 3.14에서 제거될 예정입니다. 대신 importlib.util.find_spec() 을 사용하십시오. (Nikita Sobolev가 gh-97850 에서 제안함.)

  • pty: 이 모듈에는 문서화되지 않은 master_open()slave_open() 함수가 두 개 있습니다. 이들은 Python 2부터 사용 중단되었으나 3.12에서야 정식으로 DeprecationWarning 을 발생시켰습니다. 3.14에서 해당 함수들을 제거합니다. (Soumendra Ganguly와 Gregory P. Smith가 gh-85984 에서 제안함.)

  • os:

    • Windows에서 os.stat()os.lstat() 이 반환하는 st_ctime 필드는 더 이상 사용되지 않습니다(deprecated). 향후 릴리스에서는 다른 플랫폼과 동일하게 마지막 메타데이터 변경 시간을 포함하게 됩니다. 현재는 여전히 생성 시간을 포함하며, 이는 새로운 st_birthtime 필드에서도 확인할 수 있습니다. (Steve Dower가 gh-99726 에서 제안함.)

    • POSIX 플랫폼에서 os.fork() 가 멀티스레드 프로세스에서 호출되는 것을 감지할 경우 이제 DeprecationWarning 을 발생시킬 수 있습니다. 이렇게 실행하는 것은 항상 POSIX 플랫폼과 근본적인 호환성 문제가 있었습니다. 비록 해당 코드가 겉보기에 작동하더라도 말입니다. 이러한 방식의 코드에서 발생하는 문제가 점점 더 빈번해짐에 따라 경고를 추가하여 인지도를 높이고자 합니다. 자세한 내용은 os.fork() 문서를 참조하고, 왜 이 오래된 플랫폼 호환성 문제를 개발자들에게 알리기로 했는지에 대한 이유는 이 스레드와 호환되지 않는 fork에 관한 논의 를 확인하십시오.

    multiprocessing 또는 concurrent.futures 를 사용하다가 이 경고가 발생하는 경우, 해결 방법은 "spawn" 또는 "forkserver" 와 같은 다른 multiprocessing 시작 메서드를 사용하는 것입니다.

  • shutil: shutil.rmtree()onerror 인수가 더 이상 사용되지 않으므로(deprecated) 대신 onexc 를 사용하십시오. (Irit Katriel이 gh-102828 에서 제안함.)

  • sqlite3:

  • sys: sys.last_type, sys.last_value, 그리고 sys.last_traceback 필드가 더 이상 사용되지 않습니다. 대신 sys.last_exc 를 사용하십시오. (Irit Katriel이 gh-102778 에서 제안함.)

  • tarfile: filter 를 지정하지 않고 tar 아카이브를 추출하는 것은 더 이상 권장되지 않으며(deprecated), Python 3.14부터는 'data' 필터가 기본값이 됩니다. 자세한 내용은 추출 필터 를 참조하십시오.

  • typing:

  • xml.etree.ElementTree: 이제 xml.etree.ElementTree.Element 의 진리값(truth value)을 검사할 때 DeprecationWarning 을 발생시킵니다. 이전에는 Python 구현체에서 FutureWarning 이 발생했고, C 구현체에서는 아무것도 발생하지 않았습니다. (Jacob Walls가 gh-83122 에서 제안함.)

  • coroutine throw(), generator throw(), 그리고 async generator throw() 의 3개 인자(type, value, traceback) 시그니처가 더 이상 사용되지 않으며(deprecated), 향후 Python 버전에서 제거될 수 있습니다. 대신 이 함수들의 단일 인자 버전을 사용하십시오. (Ofey Chan이 gh-89874 에서 제안함.)

  • __package__ 가 모듈에서 __spec__.parent 와 다를 때 이제 DeprecationWarning 이 발생합니다(이전에는 ImportWarning 이었습니다). (Brett Cannon이 gh-65961 에서 제안함.)

  • 모듈에서 __package__ 또는 __cached__ 를 설정하는 것은 더 이상 사용되지 않으며(deprecated), Python 3.14부터는 임포트 시스템에서 더 이상 설정되거나 고려되지 않습니다. (Brett Cannon이 gh-65961 에서 제안함.)

  • bool에 대한 비트 반전 연산자(~)가 더 이상 사용되지 않습니다. 이는 Python 3.16에서 오류를 발생시킵니다. 대신 bool의 논리적 부정을 위해 not 을 사용하십시오. 기초적인 int 값의 비트 반전이 실제로 필요한 드문 경우에에는 명시적으로 int로 변환하십시오: ~int(x). (Tim Hoffmann가 gh-103487 에서 제안함.)

  • 코드 객체에서 codeobject.co_lnotab 에 접근하는 기능은 Python 3.10에서 PEP 626 을 통해 사용 지원 중단(deprecated)되었으나, 3.12 버전에서야 정식으로 DeprecationWarning 이 발생하기 시작했습니다. 이 기능은 3.15에서 제거될 수 있습니다. (Nikita Sobolev가 gh-101866 을 통해 기능을 기여하였습니다.)

Python 3.13에서 제거 예정

모듈(siehe PEP 594):

  • aifc

  • audioop

  • cgi

  • cgitb

  • chunk

  • crypt

  • imghdr

  • mailcap

  • msilib

  • nis

  • nntplib

  • ossaudiodev

  • pipes

  • sndhdr

  • spwd

  • sunau

  • telnetlib

  • uu

  • xdrlib

기타 모듈:

  • lib2to3, 그리고 2to3 프로그램 (gh-84540)

API:

Python 3.14에서 삭제 예정

  • argparse: argparse.BooleanOptionalActiontype, choices, 그리고 metavar 매개변수가 폐지되었으며 3.14 버전에서 제거될 예정입니다. (Nikita Sobolev가 gh-92248 에서 기여함.)

  • ast: 다음 기능들은 파이썬 3.8부터 문서상에서 폐지되었으며, 현재는 접근하거나 사용할 때 런타임에 DeprecationWarning 을 발생시키고 파이썬 3.14에서 제거될 예정입니다.

    • ast.Num

    • ast.Str

    • ast.Bytes

    • ast.NameConstant

    • ast.Ellipsis

    대신 ast.Constant 를 사용하십시오. (Serhiy Storchaka가 gh-90953 에서 기여함.)

  • asyncio:

    • 자식 관찰자(child watcher) 클래스인 asyncio.MultiLoopChildWatcher, asyncio.FastChildWatcher, asyncio.AbstractChildWatcher, 그리고 asyncio.SafeChildWatcher 가 폐지되었으며 파이썬 3.14에서 제거될 예정입니다. (Kumar Aditya가 gh-94597 에서 기여함.)

    • asyncio.set_child_watcher(), asyncio.get_child_watcher(), asyncio.AbstractEventLoopPolicy.set_child_watcher(), 그리고 asyncio.AbstractEventLoopPolicy.get_child_watcher() 가 폐지되었으며 파이썬 3.14에서 제거될 예정입니다. (Kumar Aditya가 gh-94597 에서 기여함.)

    • 기본 이벤트 루프 정책의 get_event_loop() 메서드는 현재 설정된 이벤트 루프가 없는 상태에서 새로운 루프를 생성하기로 결정할 경우 이제 DeprecationWarning 을 발생시킵니다. (Serhiy Storchaka와 Guido van Rossum이 gh-100160 에서 제안함.)

  • email: email.utils.localtime()isdst 매개변수를 폐지했습니다. (Alan Williams가 gh-72346 을 통해 기여함.)

  • importlib.abc 의 폐지된 클래스들:

    • importlib.abc.ResourceReader

    • importlib.abc.Traversable

    • importlib.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' 가 기본값인 Linux, BSD 및 기타 non-macOS POSIX 플랫폼에서 기본 시작 방법이 더 안전한 것으로 변경됩니다(gh-84559). 대부분의 코드가 영향을 받지 않을 것으로 예상되므로 이에 대한 런타임 경고를 추가하는 것은 너무 번거로운 것으로 판단되었습니다. 귀하의 코드가 명시적으로 'fork' 를 필요로 하는 경우 get_context() 또는 set_start_method() API를 사용하여 지정하십시오. 자세한 내용은 컨텍스트 및 시작 방법 를 참조하십시오.

  • pathlib: is_relative_to()relative_to(): 추가 인자를 전달하는 것이 폐지되었습니다.

  • pkgutil: pkgutil.find_loader()pkgutil.get_loader() 는 이제 DeprecationWarning 을 발생시킵니다; 대신 importlib.util.find_spec() 을 사용하십시오. (Nikita Sobolev가 gh-97850 을 통해 기여함.)

  • pty:

  • sqlite3:

  • urllib: urllib.parse.Quoter 는 폐지되었습니다. 이는 공개 API로 설계되지 않았기 때문입니다. (Gregory P. Smith가 gh-88168 을 통해 기여함.)

Python 3.15에서 제거 예정

  • 임포트 시스템:

    • __spec__.cached <importlib.machinery.ModuleSpec.cached>`를 설정하지 못하면서 모듈에 ``__cached__``를 설정하는 행위는 이제 폐지되었습니다. Python 3.15부터는 임포트 시스템이나 표준 라이브러리에서 ``__cached__``를 설정하거나 고려하지 않습니다. (:gh:`97879)

  • ctypes:

    • 문서화되지 않은 ctypes.SetPointerType() 함수는 Python 3.13부터 사용 지원 중단(deprecated)되었습니다.

  • http.server:

    • 더 이상 사용되지 않고 거의 쓰이지 않는 CGIHTTPRequestHandler 는 Python 3.13부터 사용 지원 중단(deprecated)되었습니다. 직접적인 대체재는 없으나, 웹 서버와 요청 처리기를 연결할 때 CGI보다는 그 어떤 방식이라도 더 낫습니다.

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

  • importlib:

    • load_module() 메서드: 대신 exec_module() 을 사용하십시오.

  • pathlib:

    • .PurePath.is_reserved() 는 Python 3.13부터 사용 지원 중단(deprecated)되었습니다. Windows에서 예약된 경로를 감지하려면 os.path.isreserved() 를 사용하십시오.

  • platform:

    • platform.java_ver() 는 Python 3.13부터 사용 지원 중단(deprecated)되었습니다. 이 함수는 Jython 지원에만 유용하며, API가 혼란스럽고 대부분 테스트되지 않았습니다.

  • sysconfig:

  • threading:

    • RLock() 은 Python 3.15에서 인자를 받지 않습니다. Python 버전에서는 인자를 허용하지 않으나 C 버전에서는 모든 인자를 무시하며 임의의 개수의 위치 또는 키워드 인자를 허용하기 때문에, 인자를 전달하는 것은 Python 3.14부터 사용 지원 중단(deprecated)되었습니다.

  • types:

    • types.CodeType: codeobject.co_lnotab 에 접근하는 것은 PEP 626 을 통해 3.10부터 사용 지원 중단(deprecated)되었으며 3.12에서 제거될 예정이었으나, 3.12에서 비로소 적절한 DeprecationWarning 이 발생하게 되었습니다. 3.15에서 제거될 수 있습니다. (Nikita Sobolev가 gh-101866 을 통해 기여함.)

  • typing:

    • NamedTuple 클래스를 생성할 때 사용하는 문서화되지 않은 키워드 인자 구문(예: Point = NamedTuple("Point", x=int, y=int))은 Python 3.13부터 사용 지원 중단(deprecated)되었습니다. 대신 클래스 기반 구문이나 기능적 구문을 사용하십시오.

    • TypedDict 의 기능적 구문을 사용할 때, fields 매개변수에 값을 전달하지 않거나(TD = TypedDict("TD")) None 을 전달하는 것(TD = TypedDict("TD", None))은 Python 3.13부터 사용 지원 중단(deprecated)되었습니다. 필드가 없는 TypedDict를 생성하려면 class TD(TypedDict): pass 또는 TD = TypedDict("TD", {}) 를 사용하십시오.

    • @typing.no_type_check_decorator 데코레이터 함수는 Python 3.13부터 사용 지원 중단(deprecated)되었습니다. typing 모듈에 포함된 지 8년이 지났으나, 아직까지 어떤 주요 타입 검사기에서도 지원되지 않았습니다.

  • sre_compile, sre_constants, 그리고 sre_parse 모듈.

  • wave:

    • Wave_readWave_write 클래스의 getmark(), setmark(), getmarkers() 메서드는 Python 3.13부터 사용 지원 중단(deprecated)되었습니다.

  • zipimport:

    • zipimport.zipimporter.load_module() 은 Python 3.10부터 사용 지원 중단(deprecated)되었습니다. 대신 exec_module() 을 사용하십시오. (gh-125746.)

Python 3.16에서 제거 예정

  • 임포트 시스템:

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

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

  • 내장된 libmpdec 복사본.

  • array:

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

  • asyncio:

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

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

      • asyncio.AbstractEventLoopPolicy

      • asyncio.DefaultEventLoopPolicy

      • asyncio.WindowsSelectorEventLoopPolicy

      • asyncio.WindowsProactorEventLoopPolicy

      • asyncio.get_event_loop_policy()

      • asyncio.set_event_loop_policy()

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

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

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

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

  • builtins:

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

  • functools:

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

  • logging:

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

  • mimetypes:

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

  • shutil:

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

  • symtable:

    • symtable.Class.get_methods() 메서드는 Python 3.14부터 폐지되었습니다.

  • sys:

    • _enablelegacywindowsfsencoding() 함수는 Python 3.13부터 폐지되었습니다. 대신 PYTHONLEGACYWINDOWSFSENCODING 환경 변수를 사용하십시오.

  • sysconfig:

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

  • tarfile:

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

파이썬 3.17에서 삭제 예정

  • datetime:

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

  • collections.abc:

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

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

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

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

  • encodings:

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

  • webbrowser:

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

  • typing:

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

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

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

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

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

  • tkinter:

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

Python 3.19에서 삭제 예정

  • ctypes:

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

  • hashlib:

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

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

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

  • http.cookies:

  • imaplib:

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

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

Python 3.20에서 삭제 예정

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

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

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

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

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

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

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

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

  • ast:

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

Python 3.21에서 삭제 예정

  • abc

  • ast:

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

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

향후 버전에서 제거 예정

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

  • argparse:

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

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

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

  • builtins:

    • 제너레이터: throw(type, exc, tb)athrow(type, exc, tb) 시그니처가 더 이상 권장되지 않습니다. 대신 단일 인자 시그니처인 throw(exc)athrow(exc) 를 사용하십시오.

    • 현재 파이썬은 키워드가 바로 뒤따르는 숫자 리터럴을 허용합니다. 예를 들어 0in x, 1or x, 0if 1else 2 등이 있습니다. 이는 [0x1for x in y] ( [0x1 for x in y] 또는 [0x1f or x in y] 로 해석될 수 있음)와 같이 혼란스럽고 모호한 표현을 허용합니다. 숫자 리터럴 바로 뒤에 키워드 and, else, for, if, in, isor 중 하나가 오면 구문 경고가 발생합니다. 향후 릴리스에서는 이를 구문 오류로 변경할 예정입니다. (gh-87999)

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

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

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

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

  • calendar: calendar.Januarycalendar.February 상수는 더 이상 사용되지 않으며(deprecated), 대신 calendar.JANUARYcalendar.FEBRUARY 로 대체됩니다. (Prince Roshan이 gh-103636 에서 제안함.)

  • codecs: codecs.open() 대신 open`을 사용하십시오. (:gh:`133038())

  • codeobject.co_lnotab 대신 codeobject.co_lines() 메서드를 사용하십시오.

  • datetime:

    • utcnow(): 대신 datetime.datetime.now(tz=datetime.UTC) 를 사용하십시오.

    • utcfromtimestamp(): 대신 datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC) 를 사용하십시오.

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

  • importlib:

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

  • importlib.metadata:

    • EntryPoints 튜플 인터페이스.

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

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

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

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

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

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

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

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

  • ssl 옵션 및 프로토콜:

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

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

    • ssl.OP_NO_SSL* 옵션

    • ssl.OP_NO_TLS* 옵션

    • ssl.PROTOCOL_SSLv3

    • ssl.PROTOCOL_TLS

    • ssl.PROTOCOL_TLSv1

    • ssl.PROTOCOL_TLSv1_1

    • ssl.PROTOCOL_TLSv1_2

    • ssl.TLSVersion.SSLv3

    • ssl.TLSVersion.TLSv1

    • ssl.TLSVersion.TLSv1_1

  • threading 메서드:

  • typing.Text (gh-92332).

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

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

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

    • splitattr()

    • splithost()

    • splitnport()

    • splitpasswd()

    • splitport()

    • splitquery()

    • splittag()

    • splittype()

    • splituser()

    • splitvalue()

    • to_bytes()

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

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

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

제거됨

asynchat 및 asyncore

  • 이 두 모듈은 Python 3.6에서 사용 중단(deprecated)된 후, PEP 594 일정에 따라 제거되었습니다. 대신 asyncio 를 사용하십시오. (Nikita Sobolev가 gh-96580 에서 제안함.)

configparser

  • configparser 에서 오래전(3.2 버전)에 사용 중단되었던 여러 이름이 gh-89336 에 따라 제거되었습니다:

    • configparser.ParsingError`은(는) 이상 ``filename` 속성이나 인수를 가지지 않습니다. 대신 source 속성과 인수를 사용하십시오.

    • configparser 는 더 이상 SafeConfigParser 클래스를 포함하지 않습니다. 대신 짧은 명칭인 ConfigParser 를 사용하십시오.

    • configparser.ConfigParser 는 더 이상 readfp 메서드를 제공하지 않습니다. 대신 read_file() 을 사용하십시오.

distutils

  • distutils 패키지를 제거합니다. 이 패키지는 Python 3.10에서 PEP 632 “Deprecate distutils module”에 의해 사용 중단(deprecated)되었습니다. 여전히 distutils 를 사용하며 다른 것으로 업데이트할 수 없는 프로젝트의 경우, setuptools 프로젝트를 설치하면 됩니다. 해당 프로젝트는 여전히 distutils 를 제공합니다. (Victor Stinner가 gh-92584 에서 제안함.)

ensurepip

  • ensurepip 에서 번들로 제공되는 setuptools 휠을 제거하고, venv 에 의해 생성된 환경에서 setuptools를 설치하는 것을 중단합니다.

    pip (>= 22.1) 는 환경에 setuptools 가 설치되어 있지 않아도 작동합니다. 파이썬 패키지를 빌드할 때 사용하는 빌드 환경에서 pip가 직접 setuptools 를 제공하기 때문에, setuptools 기반(및 distutils 기반) 패키지도 여전히 pip install 을 통해 사용할 수 있습니다.

    easy_install, pkg_resources, setuptoolsdistutilssetuptools 패키지의 일부이므로, venv 로 생성하거나 ensurepip 로 부트스트랩한 환경에서 더 이상 기본으로 제공되지 않습니다. 실행 시(runtime) 이러한 도구에 의존하는 프로젝트의 경우, setuptools 를 의존성으로 선언하고 별도로 설치해야 합니다(일반적으로 pip 사용).

    (Pradyun Gedam가 gh-95299 를 통해 기능을 기여하였습니다.)

enum

  • enum 어트리뷰트 접근에 더 이상 필요하지 않은 enumEnumMeta.__getattr__ 를 제거했습니다. (Ethan Furman가 gh-95083 을 통해 기능을 기여하였습니다.)

ftplib

  • ftplibFTP_TLS.ssl_version 클래스 어트리뷰트를 제거했습니다. 대신 context 파라미터를 사용하십시오. (Victor Stinner가 gh-94172 를 통해 기능을 기여하였습니다.)

gzip

  • Python 2.6부터 사용 지원이 중단된 gzipgzip.GzipFilefilename 어트리뷰트를 제거했습니다. 대신 name 어트리뷰트를 사용하십시오. 쓰기 모드에서 filename 어트리뷰트는 확장자가 없는 경우 '.gz' 파일 확장자를 추가하는 기능을 수행했습니다. (Victor Stinner가 gh-94196 을 통해 기능을 기여하였습니다.)

hashlib

  • Python 3.10에서 사용 지원이 중단된 hashlibhashlib.pbkdf2_hmac() 순수 파이썬 구현을 제거했습니다. Python 3.10 이상은 OpenSSL 1.1.1(PEP 644)을 요구하며, 이 버전의 OpenSSL은 더 빠른 C 구현의 pbkdf2_hmac() 를 제공합니다. (Victor Stinner가 gh-94199 를 통해 기능을 기여하였습니다.)

importlib

  • importlib 에서 이전에 사용 지원이 중단되었던 여러 정리 작업들이 완료되었습니다:

    • module_repr() 에 대한 참조 및 지원이 제거되었습니다. (Barry Warsaw가 gh-97850 을 통해 기능을 기여하였습니다.)

    • importlib.util.set_package, importlib.util.set_loaderimportlib.util.module_for_loader 가 모두 제거되었습니다. (Brett Cannon와 Nikita Sobolev가 각각 gh-65961gh-97850 를 통해 기능을 기여하였습니다.)

    • find_loader()find_module() API 지원이 제거되었습니다. (Barry Warsaw가 gh-98040 을 통해 기능을 기여하였습니다.)

    • importlib.abc.Finder, pkgutil.ImpImporterpkgutil.ImpLoader 가 제거되었습니다. (Barry Warsaw가 gh-98040 를 통해 기능을 기여하였습니다.)

imp

  • imp 모듈이 제거되었습니다. (Barry Warsaw가 gh-98040 를 통해 기능을 기여하였습니다.)

    마이그레이션하려면 다음 대응표를 참조하십시오.

    imp

    importlib

    imp.NullImporter

    sys.path_importer_cacheNone 을 삽입합니다.

    imp.cache_from_source()

    importlib.util.cache_from_source()

    imp.find_module()

    importlib.util.find_spec()

    imp.get_magic()

    importlib.util.MAGIC_NUMBER

    imp.get_suffixes()

    importlib.machinery.SOURCE_SUFFIXES, importlib.machinery.EXTENSION_SUFFIXES, 및 importlib.machinery.BYTECODE_SUFFIXES

    imp.get_tag()

    sys.implementation.cache_tag

    imp.load_module()

    importlib.import_module()

    imp.new_module(name)

    types.ModuleType(name)

    imp.reload()

    importlib.reload()

    imp.source_from_cache()

    importlib.util.source_from_cache()

    imp.load_source()

    아래를 참조하십시오

    imp.load_source() 를 다음으로 대체합니다:

    import importlib.util
    import importlib.machinery
    
    def load_source(modname, filename):
        loader = importlib.machinery.SourceFileLoader(modname, filename)
        spec = importlib.util.spec_from_file_location(modname, filename, loader=loader)
        module = importlib.util.module_from_spec(spec)
        # 모듈은 항상 실행되며 sys.modules에 캐시되지 않습니다.
        # 모듈을 캐싱하려면 다음 줄의 주석을 해제하십시오.
        # sys.modules[module.__name__] = module
        loader.exec_module(module)
        return module
    
  • 대체 기능이 없는 imp 함수 및 어트리뷰트를 제거했습니다.

    • 문서화되지 않은 함수:

      • imp.init_builtin()

      • imp.load_compiled()

      • imp.load_dynamic()

      • imp.load_package()

    • imp.lock_held(), imp.acquire_lock(), imp.release_lock(): 파이썬 3.3에서 잠금 방식이 모듈 단위 잠금으로 변경되었습니다.

    • imp.find_module() 상수: SEARCH_ERROR, PY_SOURCE, PY_COMPILED, C_EXTENSION, PY_RESOURCE, PKG_DIRECTORY, C_BUILTIN, PY_FROZEN, PY_CODERESOURCE, IMP_HOOK.

io

  • Python 3.10에서 사용 지원이 중단된 ioio.OpenWrapper_pyio.OpenWrapper 를 제거했습니다. 대신 open() 을 사용하십시오. open() (io.open())은 내장 함수입니다. 파이썬 3.10부터 _pyio.open() 도 정적 메서드(static method)입니다. (Victor Stinner가 gh-94169 를 통해 기능을 기여하였습니다.)

locale

  • Python 3.7에서 사용 지원이 중단된 localelocale.format() 함수를 제거했습니다. 대신 locale.format_string() 을 사용하십시오. (Victor Stinner가 gh-94226 를 통해 기능을 기여하였습니다.)

smtpd

  • smtpd 모듈은 PEP 594 일정에 따라 제거되었습니다(파이썬 3.4.7 및 3.5.4에서 사용 지원 중단). 대신 aiosmtpd PyPI 모듈이나 다른 asyncio 기반 서버를 사용하십시오. (Oleg Iarygin가 gh-93243 을 통해 기능을 기여하였습니다.)

sqlite3

  • 파이썬 3.10에서 사용 지원이 중단된 다음의 문서화되지 않은 sqlite3 기능들이 제거되었습니다:

    • sqlite3.enable_shared_cache()

    • sqlite3.OptimizedUnicode

    공유 캐시를 사용해야 하는 경우, cache=shared 쿼리 파라미터를 사용하여 URI 모드로 데이터베이스를 여십시오.

    The sqlite3.OptimizedUnicode text factory has been an alias for str since Python 3.3. Code that previously set the text factory to OptimizedUnicode can either use str explicitly, or rely on the default value which is also str.

    (Erlend E. Aasland가 gh-92548 을 통해 기능을 기여하였습니다.)

ssl

  • Python 3.6에서 사용 지원이 중단된 sslssl.RAND_pseudo_bytes() 함수를 제거했습니다. 대신 os.urandom() 또는 ssl.RAND_bytes() 를 사용하십시오. (Victor Stinner가 gh-94199 를 통해 기능을 기여하였습니다.)

  • ssl.match_hostname() 함수를 제거했습니다. 이 함수는 파이썬 3.7에서 사용 지원이 중단되었습니다. 파이썬 3.7부터 OpenSSL이 호스트 이름 매칭을 수행하므로, 파이썬은 더 이상 ssl.match_hostname() 함수를 사용하지 않습니다. (Victor Stinner가 gh-94199 를 통해 기능을 기여하였습니다.)

  • 파이썬 3.7에서 사용 지원이 중단된 ssl.wrap_socket() 함수를 제거했습니다. 대신 ssl.SSLContext 객체를 생성하고 해당 객체의 ssl.SSLContext.wrap_socket 메서드를 호출하십시오. 여전히 ssl.wrap_socket() 을 사용하는 모든 패키지는 손상되었으며 보안에 취약합니다. 이 함수는 SNI TLS 확장을 전송하지도, 서버 호스트 이름을 검증하지도 않습니다. 해당 코드는 CWE 295 (부적절한 인증서 검증)에 해당할 수 있습니다. (Victor Stinner가 gh-94199 를 통해 기능을 기여하였습니다.)

unittest

webbrowser

  • webbrowser`에서 이상 사용되지 않는 브라우저 지원을 제거했습니다. 제거된 브라우저는 Grail, Mosaic, Netscape, Galeon, Skipstone, Iceape, Firebird, 그리고 Firefox 35 이하 버전입니다 (:gh:`102871).

xml.etree.ElementTree

  • 파이썬 3.10에서 사용 지원이 중단된 순수 파이썬 구현의 ElementTree.Element.copy() 메서드를 제거했습니다. 대신 copy.copy() 함수를 사용하십시오. xml.etree.ElementTree 의 C 구현체에는 copy() 메서드가 없으며, 오직 __copy__() 메서드만 존재합니다. (Victor Stinner가 gh-94383 을 통해 기능을 기여하였습니다.)

zipimport

  • 파이썬 3.10에서 사용 지원이 중단된 zipimportfind_loader()find_module() 메서드를 제거했습니다. 대신 find_spec() 메서드를 사용하십시오. 근거는 PEP 451 을 참조하십시오. (Victor Stinner가 gh-94379 를 통해 기능을 기여하였습니다.)

기타

  • Remove the suspicious rule from the documentation Makefile and Doc/tools/rstlint.py, both in favor of sphinx-lint. (Contributed by Julien Palard in gh-98179.)

  • 파이썬 3.6부터 사용 지원이 중단된 ftplib, imaplib, poplib, smtplib 모듈의 keyfilecertfile 파라미터와 http.client 모듈의 key_file, cert_filecheck_hostname 파라미터를 제거했습니다. 대신 context 파라미터(imaplib 에서는 ssl_context)를 사용하십시오. (Victor Stinner가 gh-94172 를 통해 기능을 기여하였습니다.)

  • 여러 표준 라이브러리 모듈 및 테스트에서 Jython 호환성 꼼수를 제거했습니다. (Nikita Sobolev가 gh-99482 를 통해 기능을 기여하였습니다.)

  • ctypes 모듈에서 _use_broken_old_ctypes_structure_semantics_ 플래그를 제거했습니다. (Nikita Sobolev가 gh-99285 를 통해 기능을 기여하였습니다.)

Python 3.12로 이식

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

파이썬 API 변경 사항

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

  • Python 3.10부터 폐지된 randrange() 기능을 제거했습니다. 이전에는 randrange(10.0)randrange(10) 으로 손실 없이 변환되었으나, 이제는 TypeError 를 발생시킵니다. 또한 randrange(10.5)randrange('10') 와 같은 비정수 값에 대해 발생하는 예외가 ValueError 에서 TypeError 로 변경되었습니다. 이는 randrange(1e25)randrange(10**25) 보다 더 큰 범위에서 조용히 선택되는 버그를 방지합니다. (원래 Serhiy Storchaka의 제안으로 gh-86388 에 의해 구현되었습니다.)

  • argparse.ArgumentParser 가 파일을 읽어 인자를 처리할 때(예: fromfile_prefix_chars 옵션)의 인코딩 및 오류 처리 방식을 기본 텍스트 인코딩(예: locale.getpreferredencoding(False))에서 filesystem encoding and error handler 로 변경했습니다. Windows에서는 인자 파일이 ANSI Codepage 대신 UTF-8로 인코딩되어야 합니다.

  • Python 3.4.7 및 3.5.4에서 폐지된 asyncore 기반의 smtpd 모듈을 제거했습니다. 권장되는 대체재는 asyncio 기반의 aiosmtpd PyPI 모듈입니다.

  • shlex.split(): s 인자에 None 을 전달할 경우 이제 sys.stdin 을 읽는 대신 예외를 발생시킵니다. 이 기능은 Python 3.9에서 폐지되었습니다. (Victor Stinner가 gh-94352 를 통해 구현했습니다.)

  • os 모듈은 더 이상 bytearraymemoryview 와 같은 bytes-like 경로를 허용하지 않습니다. 바이트 문자열의 경우 정확히 bytes 타입만 허용됩니다. (Victor Stinner가 gh-98393 을 통해 구현했습니다.)

  • syslog.openlog()syslog.closelog() 은 이제 서브 인터프리터(subinterpreter)에서 사용 시 실패합니다. syslog.syslog() 는 서브 인터프리터에서도 여전히 사용할 수 있지만, 오직 메인 인터프리터에서 syslog.openlog() 가 이미 호출된 경우에만 가능합니다. 이러한 새로운 제한 사항은 메인 인터프리터에는 적용되지 않으므로 매우 적은 수의 사용자에게만 영향을 미칩니다. 이 변경 사항은 인터프리터 격리에 도움이 됩니다. 또한, syslog 는 프로세스 전역 리소스를 래핑하는 것이므로 메인 인터프리터에서 관리하는 것이 가장 좋습니다. (Donghee Na가 gh-99127 을 통해 구현했습니다.)

  • @~functools.cached_property 의 문서화되지 않은 잠금(locking) 동작을 제거했습니다. 이 기능은 클래스의 모든 인스턴스에 걸쳐 잠금을 수행하여 높은 잠금 경합을 유발했기 때문입니다. 이는 이제 두 스레드가 경쟁할 경우 단일 인스턴스에 대해 캐시된 속성 getter 함수가 여러 번 실행될 수 있음을 의미합니다. 대부분의 단순한 캐시된 속성(예를 들어, 멱등성을 가지며 인스턴스의 다른 속성을 기반으로 값을 계산하는 경우)은 문제가 없습니다. 동기화가 필요한 경우, 캐시된 속성 getter 함수 내부 또는 멀티스레드 접근 지점 주위에 잠금을 구현하십시오.

  • sys._current_exceptions() 은 이제 (typ, exc, tb) 튜플 대신 스레드 ID에서 예외 인스턴스로의 매핑을 반환합니다. (Irit Katriel이 gh-103176 에서 기여함.)

  • tarfile 또는 shutil.unpack_archive() 를 사용하여 tar 파일을 추출할 때, 예상치 못한 동작이나 위험한 기능을 제한하기 위해 filter 인수를 전달하십시오. 자세한 내용은 추출 필터 를 참조하십시오.

  • PEP 701 에서 도입된 변경 사항으로 인해 tokenize.tokenize()tokenize.generate_tokens() 함수의 출력이 변경되었습니다. 이는 f-문자열에 대해 더 이상 STRING 토큰이 생성되지 않고, 대신 PEP 701 에서 설명하는 토큰들이 생성됨을 의미합니다. 표현 성분의 토큰화에 적절한 토큰과 더불어, f-문자열의 “문자열” 부분에 대해서는 이제 FSTRING_START, FSTRING_MIDDLEFSTRING_END 가 발송됩니다. 예를 들어, f-문자열 f"start {1+1} end" 에 대해 이전 버전의 토크나이저는 다음을 출력했습니다:

    1,0-1,18:           STRING         'f"start {1+1} end"'
    

    반면 새 버전은 다음을 출력합니다:

    1,0-1,2:            FSTRING_START  'f"'
    1,2-1,8:            FSTRING_MIDDLE 'start '
    1,8-1,9:            OP             '{'
    1,9-1,10:           NUMBER         '1'
    1,10-1,11:          OP             '+'
    1,11-1,12:          NUMBER         '1'
    1,12-1,13:          OP             '}'
    1,13-1,17:          FSTRING_MIDDLE ' end'
    1,17-1,18:          FSTRING_END    '"'
    

    또한, PEP 701 지원을 위해 필요한 변경 사항으로 인해 몇 가지 사소한 동작 변화가 있을 수 있습니다. 이러한 변경 사항 중 일부는 다음과 같습니다.

    • ! 와 같은 일부 잘못된 파이썬 문자를 토큰화할 때 생성되는 토큰의 type 속성이 ERRORTOKEN 에서 OP 로 변경되었습니다.

    • 불완전한 단일 행 문자열도 이제 불완전한 다중 행 문자열과 마찬가지로 tokenize.TokenError 를 발생시킵니다.

    • 일부 불완전하거나 유효하지 않은 파이썬 코드를 토큰화할 때, 이제 임의의 ERRORTOKEN 을 반환하는 대신 tokenize.TokenError 를 발생시킵니다.

    • 동일한 파일에서 들여쓰기를 할 때 탭과 공백을 혼용하는 것은 더 이상 지원되지 않으며 TabError 를 발생시킵니다.

  • threading 모듈은 이제 _thread 모듈에 _is_main_interpreter 속성이 있기를 기대합니다. 이는 인자가 없는 함수로, 현재 인터프리터가 메인 인터프리터이면 True 를 반환합니다.

    커스텀 _thread 모듈을 제공하는 모든 라이브러리나 애플리케이션은 _is_main_interpreter() 를 제공해야 합니다. (자세한 내용은 gh-112826 을 참조하십시오.)

빌드 변경 사항

  • 파이썬은 더 이상 공유 C 확장 모듈을 빌드하는 데 setup.py 를 사용하지 않습니다. 헤더 및 라이브러리와 같은 빌드 매개변수는 configure 스크립트에서 감지됩니다. 확장 모듈은 Makefile 에 의해 빌드됩니다. 대부분의 확장 모듈은 pkg-config 를 사용하며, 실패할 경우 수동 탐색으로 전환합니다. (Christian Heimes가 gh-93939 을 통해 구현했습니다.)

  • 파이썬을 빌드할 때 이제 va_start(args, format) 과 같이 두 개의 매개변수를 가진 va_start() 가 필요합니다. va_start() 는 더 이상 단일 매개변수와 함께 호출되지 않습니다. (Kumar Aditya가 gh-93207 을 통해 구현했습니다.)

  • Clang 컴파일러가 플래그를 수용하는 경우, CPython은 이제 기본 링크 시간 최적화 정책으로 ThinLTO 옵션을 사용합니다. (Donghee Na가 gh-89536 을 통해 구현했습니다.)

  • Add COMPILEALL_OPTS variable in Makefile to override compileall options (default: -j0) in make install. Also merged the 3 compileall commands into a single command to build .pyc files for all optimization levels (0, 1, 2) at once. (Contributed by Victor Stinner in gh-99289.)

  • 64비트 LoongArch를 위한 플랫폼 트리플렛을 추가합니다:

    • loongarch64-linux-gnusf

    • loongarch64-linux-gnuf32

    • loongarch64-linux-gnu

    (Zhang Na가 gh-90656 을 통해 구현했습니다.)

  • PYTHON_FOR_REGEN 은 이제 파이썬 3.10 이상 버전을 요구합니다.

  • configure 를 다시 생성하려면 Autoconf 2.71 및 aclocal 1.16.4가 필요합니다. (Christian Heimes가 gh-89886 을 통해 구현했습니다.)

  • python.org의 Windows 빌드 및 macOS 설치 프로그램은 이제 OpenSSL 3.0을 사용합니다.

C API 변경 사항

새로운 기능

  • PEP 697: 디버거 및 JIT 컴파일러와 같은 저수준 도구를 위한 Unstable C API tier <unstable-c-api>`를 도입했습니다. 이 API는 CPython의 마이너 릴리스마다 폐지 경고 없이 변경될 수 있습니다. 해당 내용은 이름에 ``PyUnstable_` 접두사로 표시됩니다.

    코드 객체 생성자:

    • PyUnstable_Code_New() (PyCode_New 에서 이름 변경)

    • PyUnstable_Code_NewWithPosOnlyArgs() (PyCode_NewWithPosOnlyArgs 에서 이름 변경)

    코드 객체를 위한 추가 저장 공간(PEP 523):

    • PyUnstable_Eval_RequestCodeExtraIndex() (_PyEval_RequestCodeExtraIndex 에서 이름 변경)

    • PyUnstable_Code_GetExtra() (_PyCode_GetExtra 에서 이름 변경)

    • PyUnstable_Code_SetExtra() (_PyCode_SetExtra 에서 이름 변경)

    해당 API가 변경될 때까지 기존 이름은 계속 사용할 수 있습니다.

    (Petr Viktorin이 gh-101101 을 통해 구현했습니다.)

  • PEP 697: 인스턴스 메모리 레이아웃이 불투명한(opaque) 형을 확장하기 위한 API를 추가했습니다:

    (Petr Viktorin이 gh-103509 를 통해 구현했습니다.)

  • 기존 PyType_FromModuleAndSpec() 을 추가적인 메타클래스 인자를 사용하여 일반화한 새로운 limited C API 함수인 PyType_FromMetaclass() 를 추가했습니다. (Wenzel Jakob가 gh-93012 를 통해 구현했습니다.)

  • vectorcall 프로토콜 을 사용하여 호출할 수 있는 객체를 생성하는 API가 Limited API 에 추가되었습니다:

    The Py_TPFLAGS_HAVE_VECTORCALL flag is now removed from a class when the class’s __call__() method is reassigned. This makes vectorcall safe to use with mutable types (i.e. heap types without the immutable flag, Py_TPFLAGS_IMMUTABLETYPE). Mutable types that do not override tp_call now inherit the Py_TPFLAGS_HAVE_VECTORCALL flag. (Contributed by Petr Viktorin in gh-93274.)

    Py_TPFLAGS_MANAGED_DICTPy_TPFLAGS_MANAGED_WEAKREF 플래그가 추가되었습니다. 이를 통해 확장 클래스에서 적은 관리 작업으로도 객체 __dict__ 와 weakref를 지원할 수 있으며, 메모리 사용량이 줄고 접근 속도가 빨라집니다.

  • vectorcall 프로토콜 을 사용하여 호출을 수행하는 API가 Limited API 에 추가되었습니다:

    이는 벡터 호출 프로토콜의 수신 및 송신 끝단이 이제 Limited API 에서 모두 사용할 수 있음을 의미합니다. (Wenzel Jakob가 gh-98586 에서 기여했습니다.)

  • 호출 중인 스레드 외에도 실행 중인 모든 스레드에 트레이싱 및 프로파일링 함수를 설정할 수 있는 두 개의 새로운 공개 함수, PyEval_SetProfileAllThreads()PyEval_SetTraceAllThreads() 를 추가했습니다. (Pablo Galindo가 gh-93503 을 통해 구현했습니다.)

  • 주어진 PyFunctionObject 의 vectorcall 필드를 설정하는 새로운 함수 PyFunction_SetVectorcall() 을 C API에 추가했습니다. (Andrew Frost가 gh-92257 을 통해 구현했습니다.)

  • C API에서 이제 PyDict_AddWatcher(), PyDict_Watch() 및 관련 API를 통해 딕셔너리가 수정될 때마다 호출되는 콜백을 등록할 수 있습니다. 이는 최적화된 인터프리터, JIT 컴파일러 또는 디버거에서 사용하기 위한 것입니다. (Carl Meyer가 gh-91052 를 통해 구현했습니다.)

  • 타입의 변경 사항에 대한 알림을 받기 위해 콜백을 등록하는 PyType_AddWatcher()PyType_Watch() API를 추가했습니다. (Carl Meyer가 gh-91051 을 통해 구현했습니다.)

  • 코드 객체의 생성 및 파괴 시 알림을 받기 위한 콜백을 등록하는 PyCode_AddWatcher()PyCode_ClearWatcher() API를 추가했습니다. (Itamar Oren이 gh-91054 에서 기여했습니다.)

  • 프레임 변수를 이름으로 가져오는 PyFrame_GetVar()PyFrame_GetVarString() 함수를 추가했습니다. (Victor Stinner가 gh-91248 에서 기여했습니다.)

  • 현재 예외를 저장하고 복원하기 위한 PyErr_GetRaisedException()PyErr_SetRaisedException() 을 추가했습니다. 이 함수들은 이제 폐지된 PyErr_Fetch()PyErr_Restore() 의 세 가지 인자 대신 단일 예외 객체를 반환하고 수용합니다. 이는 오류가 발생할 가능성이 적고 약간 더 효율적입니다. (Mark Shannon이 gh-101578 에서 기여했습니다.)

  • 이제 폐지된 레거시 API인 _PyErr_ChainExceptions 를 대체하기 위해 예외 인스턴스를 인수로 받는 _PyErr_ChainExceptions1 을 추가했습니다. (Mark Shannon이 gh-101578 에서 기여했습니다.)

  • 예외 생성자에 전달된 args 를 가져오고 수정하기 위한 편의 함수인 PyException_GetArgs()PyException_SetArgs() 를 추가했습니다. (Mark Shannon이 gh-101578 에서 기여했습니다.)

  • 레거시 API인 PyErr_Display() 를 대신하여 예시 인스턴스를 받는 PyErr_DisplayException() 을 추가했습니다. (Irit Katriel이 gh-102755 에서 기여했습니다.)

  • PEP 683: 객체가 참조 횟수를 무시할 수 있게 하는 Immortal Objects 를 도입하고 이와 관련된 C-API 변경 사항을 적용했습니다:

    • _Py_IMMORTAL_REFCNT: 객체를 정의하는 참조 횟수

      불멸(immortal)로 정의함.

    • _Py_IsImmortal: 객체가 불멸 참조 횟수를 가졌는지 확인합니다.

    • PyObject_HEAD_INIT: 이제 이 매크로는 참조 횟수를 다음으로 초기화합니다.

      Py_BUILD_CORE 와 함께 사용될 때 _Py_IMMORTAL_REFCNT 로 초기화합니다.

    • SSTATE_INTERNED_IMMORTAL: 인턴된 유니코드 객체에 대한 식별자

      불멸인 경우입니다.

    • SSTATE_INTERNED_IMMORTAL_STATIC: 인턴된 유니코드에 대한 식별자

      불임(immortal)이면서 정적인 객체입니다.

    • sys.getunicodeinternedsize: 이 함수는 인턴된 유니코드의 총 개수를 반환합니다.

      인턴된 객체들의 총 개수입니다. 이는 이제 refleak.py 가 참조 횟수와 할당된 블록을 정확하게 추적하는 데 필요합니다.

    (Eddie Elizondo가 gh-84436 에서 기여했습니다.)

  • PEP 684: 독자적인 GIL을 가진 서브 인터프리터를 생성하는 데 사용될 수 있는 새로운 Py_NewInterpreterFromConfig() 함수와 PyInterpreterConfig 를 추가했습니다. (더 자세한 정보는 PEP 684: 인터프리터별 GIL 를 참조하십시오.) (Eric Snow가 gh-104110 에서 기여했습니다.)

  • 제한된 C API 버전 3.12에서, Py_INCREF()Py_DECREF() 함수는 구현 세부 사항을 숨기기 위해 불투명(opaque) 함수 호출로 구현됩니다. (Victor Stinner가 gh-105387 에서 기여했습니다.)

Python 3.12로 이식

  • Py_UNICODE* 표기법에 기반한 레거시 유니코드 API가 제거되었습니다. UTF-8 또는 wchar_t* 기반의 API로 마이그레이션하십시오.

  • PyArg_ParseTuple() 과 같은 인자 파싱 함수는 더 이상 Py_UNICODE* 기반 형식(예: u, Z)을 지원하지 않습니다. 유니코드를 위해 s, z, es, U 와 같은 다른 형식을 사용하십시오.

  • 모든 정적 내장 타입에 대해 tp_weaklist``는 항상 ``NULL``입니다. 이는 ``PyTypeObject``의 내부 전용 필드이지만, 누군가 해당 필드에 직접 접근하는 경우를 대비하여 변경 사항을 알립니다. 오류 방지를 위해 기존 공개 C-API를 사용하거나, 필요한 경우 (내부 전용) ``_PyObject_GET_WEAKREFS_LISTPTR() 매크로를 고려하십시오.

  • 이 내부 전용 PyTypeObject.tp_subclasses 는 이제 유효한 객체 포인터가 아닐 수 있습니다. 이를 반영하기 위해 해당 타입이 void* 로 변경되었습니다. 누군가가 내부 전용 필드에 직접 접근하는 경우를 대비하여 이 내용을 언급합니다.

    서브 클래스 목록을 가져오려면 파이썬 메서드인 __subclasses__() 를 호출하십시오(예를 들어, PyObject_CallMethod() 사용).

  • PyUnicode_FromFormat()PyUnicode_FromFormatV() 에 더 많은 서식 지정 옵션(왼쪽 정렬, 8진수, 대문자 16진수, intmax_t, ptrdiff_t, wchar_t C 문자열, 가변 너비 및 정밀도)에 대한 지원이 추가되었습니다. (Serhiy Storchaka가 gh-98836 에서 기여했습니다.)

  • PyUnicode_FromFormat()PyUnicode_FromFormatV() 에서 인식할 수 없는 서식 문자는 이제 SystemError 를 발생시킵니다. 이전 버전에서는 나머지 서식 문자열이 결과 문자열에 그대로 복사되고, 추가 인자는 버려졌습니다. (Serhiy Storchaka가 gh-95781 에서 기여했습니다.)

  • PyUnicode_FromFormat()PyUnicode_FromFormatV() 에서 잘못된 부호 위치를 수정했습니다. (Philip Georgi가 gh-95504 에서 기여했습니다.)

  • __dict__ 또는 약한 참조 슬롯을 추가하려는 확장 클래스는 tp_dictoffsettp_weaklistoffset 대신 각각 Py_TPFLAGS_MANAGED_DICTPy_TPFLAGS_MANAGED_WEAKREF 를 사용해야 합니다. tp_dictoffsettp_weaklistoffset 을 사용하는 것도 여전히 지원되지만, 다중 상속(gh-95589)을 완벽하게 지원하지 않으며 성능이 떨어질 수 있습니다. Py_TPFLAGS_MANAGED_DICT 를 선언하는 클래스는 인스턴스의 딕셔너리를 탐색하고 비우기 위해 _PyObject_VisitManagedDict()_PyObject_ClearManagedDict() 를 호출해야 합니다. 약한 참조를 지우려면 이전과 같이 PyObject_ClearWeakRefs() 를 호출하십시오.

  • PyUnicode_FSDecoder() 함수는 더 이상 bytearraymemoryview 와 같은 바이트 라이크 경로를 허용하지 않습니다. 바이트 문자열의 경우 정확히 bytes 타입만 수락됩니다. (Victor Stinner가 gh-98393 에서 기여했습니다.)

  • Py_CLEAR, Py_SETREFPy_XSETREF 매크로는 이제 인수를 한 번만 평가합니다. 인수에 부수 효과가 있는 경우, 더 이상 해당 효과가 중복되지 않습니다. (Victor Stinner가 gh-98724 에서 기여했습니다.)

  • 인터프리터의 에러 표시자가 이제 항상 정규화됩니다. 이는 PyErr_SetObject(), PyErr_SetString() 및 에러 표시를 설정하는 다른 함수들이 예외를 저장하기 전에 먼저 정규화함을 의미합니다. (Mark Shannon이 gh-101578 에서 기여했습니다.)

  • _Py_RefTotal 은 더 이상 공식적인 값이 아니며, ABI 호환성을 위해 유지됩니다. 이는 내부 전역 변수이며 디버그 빌드에서만 사용할 수 있습니다. 만약 이를 사용하고 있다면 _Py_GetGlobal_RefTotal() 을 사용하기 시작해야 합니다.

  • 다음 함수들은 이제 새로 생성된 타입에 적절한 메타 클래스를 선택합니다:

    메타 클래스가 tp_new 를 재정의하는 클래스를 생성하는 것은 이제 폐지되었으며, Python 3.14부터는 허용되지 않습니다. 이러한 함수들은 메타 클래스의 tp_new 를 무시하므로 초기화가 불완전하게 수행될 수 있습니다.

    PyType_FromMetaclass() (Python 3.12에서 추가됨)는 이미 메타클래스가 tp_new 를 재정의하는 클래스를 생성하는 것을 허용하지 않습니다(Python에서는 __new__() 에 해당).

    tp_newPyType_From* 함수들이 수행하는 거의 모든 것을 재정의하기 때문에 두 기능은 서로 호환되지 않습니다. 타입 생성 과정 중 여러 단계에서 메타 클래스를 무시하는 기존 동작은 (메타) 클래스가 tp_new 가 호출되었다고 가정하기 때문에 일반적으로 안전하지 않습니다. 간단한 일반적인 해결책은 없습니다. 다음 방법 중 하나가 도움이 될 수 있습니다:

    • 메타 클래스를 직접 제어하는 경우, 그 안에서 tp_new 를 사용하지 마십시오:

      • 초기화를 생략할 수 있는 경우, 대신 PyTypeObject.tp_init 에서 수행할 수 있습니다.

      • 메타 클래스를 파이썬에서 인스턴스화할 필요가 없는 경우, Py_TPFLAGS_DISALLOW_INSTANTIATION 플래그를 사용하여 그 tp_new``를 ``NULL``로 설정하십시오. 이렇게 하면 ``PyType_From* 함수에서 사용할 수 있습니다.

    • PyType_From* 함수들의 사용을 피하십시오: C 전용 기능(슬롯 또는 인스턴스 크기 설정)이 필요하지 않은 경우, 메타클래스를 호출하여 생성하십시오.

    • tp_new 를 안전하게 건너뛸 수 있다는 것을 확실히 알고 있는 경우, 파이썬의 warnings.catch_warnings() 를 사용하여 폐지 경고를 걸러내십시오.

  • PyOS_InputHookPyOS_ReadlineFunctionPointer 는 더 이상 subinterpreters 에서 호출되지 않습니다. 이는 클라이언트가 일반적으로 프로세스 전체의 전역 상태에 의존하기 때문입니다(이러한 콜백은 확장 모듈 상태를 복구할 방법이 없습니다).

    이는 또한 확장 프로그램이 지원하지 않거나(또는 아직 로드되지 않은) 서브 인터프리터에서 실행되는 상황을 방지합니다. 자세한 내용은 gh-104668 을 참조하십시오.

  • PyLongObject 의 내부 구조가 성능 향상을 위해 변경되었습니다. PyLongObject 의 내부는 비공개이지만 일부 확장 모듈에서 사용됩니다. 이제 내부 필드에 직접 접근해서는 안 되며, 대신 PyLong_... 으로 시작하는 API 함수를 사용해야 합니다. 단일 머신 워드에 들어가는 PyLongObject 값을 효율적으로 액세스하기 위해 두 개의 새로운 불안정(unstable) API 함수가 제공됩니다.

  • PyMem_SetAllocator() 를 통해 설정되는 사용자 정의 할당자는 메모리 영역에 관계없이 이제 스레드 안전해야 합니다. “훅”을 포함하여 자체 상태가 없는 할당량은 영향을 받지 않습니다. 사용 중인 커스텀 할당자가 스레드 안전하지 않아 안내가 필요한 경우, 새 GitHub 이슈를 생성하고 @ericsnowcurrently 를 참조하십시오.

폐지됨

Python 3.14에서 삭제 예정

Python 3.15에서 제거 예정

Python 3.16에서 제거 예정

향후 버전에서 제거 예정

다음 API들은 현재 구체적인 제거 날짜가 정해지지는 않았으나 향후 삭제될 예정입니다.

제거됨

  • token.h 헤더 파일을 제거합니다. 공개적인 토크나이저 C API는 존재한 적이 없으며, token.h 헤더 파일은 오직 Python 내부용으로만 설계되었습니다. (Victor Stinner가 gh-92651 에서 기여함.)

  • 레거시 유니코드 API가 제거되었습니다. 자세한 내용은 PEP 623 을 참조하십시오.

    • PyUnicode_WCHAR_KIND

    • PyUnicode_AS_UNICODE()

    • PyUnicode_AsUnicode()

    • PyUnicode_AsUnicodeAndSize()

    • PyUnicode_AS_DATA()

    • PyUnicode_FromUnicode()

    • PyUnicode_GET_SIZE()

    • PyUnicode_GetSize()

    • PyUnicode_GET_DATA_SIZE()

  • PyUnicode_InternImmortal() 함수 매크로를 제거합니다. (Victor Stinner가 gh-85858 에서 기여함.)

분실물 보관소