Python

Python 3.11의 새로운 기능

편집기:

Pablo Galindo Salgado

이 기사에서는 3.10과 비교하여 Python 3.11의 새로운 기능에 대해 설명합니다. Python 3.11은 2022년 10월 24일에 출시되었습니다. 자세한 내용은 변경 내역 를 참조하십시오.

요약 – 릴리스 하이라이트

  • Python 3.11은 Python 3.10보다 약 10~60% 더 빠릅니다. 표준 벤치마크 세트에서 평균적으로 1.25배의 속도 향상을 측정했습니다. 자세한 내용은 더 빠른 CPython 을 참조하십시오.

새로운 문법 기능:

새로운 내장 기능:

새로운 표준 라이브러리 모듈:

인터프리터 개선 사항:

새로운 타이핑 기능:

중요한 폐지, 제거 및 제한 사항:

새로운 기능

PEP 657: 트레이스백 내 세분화된 오류 위치 정보

트레이스백을 출력할 때 인터프리터는 이제 단순히 줄(line)이 아니라 오류를 일으킨 정확한 표현식을 가리킵니다. 예시:

Traceback (most recent call last):
  File "distance.py", line 11, in <module>
    print(manhattan_distance(p1, p2))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "distance.py", line 6, in manhattan_distance
    return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
                           ^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'x'

이전 버전의 인터프리터는 단순히 줄만 표시했기 때문에 어떤 객체가 None 인지 모호한 경우가 있었습니다. 강화된 오류 메시지는 깊게 중첩된 dict 객체나 여러 번의 함수 호출을 처리할 때도 유용합니다.

Traceback (most recent call last):
  File "query.py", line 37, in <module>
    magic_arithmetic('foo')
  File "query.py", line 18, in magic_arithmetic
    return add_counts(x) / 25
           ^^^^^^^^^^^^^
  File "query.py", line 24, in add_counts
    return 25 + query_user(user1) + query_user(user2)
                ^^^^^^^^^^^^^^^^^
  File "query.py", line 32, in query_user
    return 1 + query_count(db, response['a']['b']['c']['user'], retry=True)
                               ~~~~~~~~~~~~~~~~~~^^^^^
TypeError: 'NoneType' object is not subscriptable

또한 복잡한 산술 표현식에서도 도움이 됩니다.

Traceback (most recent call last):
  File "calculation.py", line 54, in <module>
    result = (x / y / z) * (a / b / c)
              ~~~~~~^~~
ZeroDivisionError: division by zero

또한 강화된 트레이스백 기능에 사용되는 정보를 일반 API를 통해 제공하며, 이를 통해 bytecode instructions 와 소스 코드 위치를 연관 지을 수 있습니다. 이 정보는 다음을 사용하여 가져올 수 있습니다.

자세한 내용은 PEP 657 을 참조하십시오. (Pablo Galindo, Batuhan Taskaya, Ammar Askar가 bpo-43950 에서 기여함.)

참고

이 기능은 코드 객체 에 열 위치를 저장해야 하므로 인터프리터 메모리 사용량과 컴파일된 파이썬 파일의 디스크 사용량이 약간 증가할 수 있습니다. 추가 정보를 저장하지 않고 트레이스백 정보 출력을 비활성화하려면 -X no_debug_ranges 명령줄 옵션이나 PYTHONNODEBUGRANGES 환경 변수를 사용하십시오.

PEP 654: 예외 그룹 및 except*

PEP 654 는 프로그램이 여러 개의 서로 관련 없는 예외를 동시에 발생시키고 처리할 수 있게 하는 언어 기능을 도입합니다. 내장 타입인 ExceptionGroupBaseExceptionGroup 을 통해 예외를 그룹화하여 함께 발생시킬 수 있으며, 새로운 except* 구문은 예외 그룹의 하위 그룹과 일치하도록 except 를 일반화합니다.

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

(Irit Katriel이 bpo-45292 에서 기여함. PEP는 Irit Katriel, Yury Selivanov, Guido van Rossum이 작성함.)

PEP 678: 예외에 노트 추가 가능

BaseExceptionadd_note() 메서드가 추가되었습니다. 이 메서드는 예외가 발생하는 시점에 알 수 없는 컨텍스트 정보를 예외에 추가하는 데 사용할 수 있습니다. 추가된 노트는 기본 트레이스백에 표시됩니다.

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

(Irit Katriel이 bpo-45607 에서 기여함. PEP는 Zac Hatfield-Dodds가 작성함.)

Windows py.exe 런처 개선

파이썬 3.11에 포함된 Python Install Manager 복사본이 크게 업데이트되었습니다. 이제 제한적인 -{<major>}.{<minor>}` 대신 PEP 514 에 정의된 대로 -V:{<company>}/{<tag>}` 인자를 사용하여 company/tag 구문을 지원합니다. 이를 통해 python.org 에서 호스팅되는 PythonCore 외의 배포판도 실행할 수 있습니다.

When using -V: selectors, either company or tag can be omitted, but all installs will be searched. For example, -V:OtherPython/ will select the “best” tag registered for OtherPython, while -V:3.11 or -V:/3.11 will select the “best” distribution with tag 3.11.

레거시인 -<major>, -<major>.<minor>, -<major>-<bitness> 또는 -<major>.<minor>-<bitness> 인자를 사용할 때 이전 버전의 모든 동작이 유지되며 PythonCore``의 릴리스만 선택됩니다. 그러나 현재는 여러 개의 64비트 플랫폼이 지원되므로, ``-64 접미사는 이제

이외의 언어 변경 사항

  • 스크립트를 실행할 때 스크립트 디렉터리나, -c-m 을 사용할 때 현재 디렉터리가 sys.path 에 자동으로 추가되는 것을 방지하는 -P 명령줄 옵션과 PYTHONSAFEPATH 환경 변수가 추가되었습니다. 이를 통해 import 시 표준 라이브러리 및 설치된 모듈만 불러오도록 보장하며, 로컬(일반적으로 사용자가 쓰기 가능한) 디렉터리에 있는 모듈이 의도치 않거나 악의적으로 덮어씌워지는 것을 방지합니다. (Victor Stinner가 gh-57684 를 통해 기여함.)

  • 형식 정밀도에 따라 반올림한 후 음수를 양의 0으로 변환하는 "z" 옵션이 포맷 명세 미니 언어 에 추가되었습니다. 자세한 내용은 PEP 682 를 참조하십시오. (John Belmonte가 gh-90153 을 통해 기여함.)

  • sys.path 에서 더 이상 바이트(bytes)를 허용하지 않습니다. 해당 기능은 Python 3.2와 3.6 사이 어느 시점에 깨졌으나, Python 3.10.0이 출시될 때까지 아무도 알아차리지 못했습니다. 또한, strbytes 키가 혼재하는 상황에서 -bsys.path_importer_cache 사이의 상호작용으로 인해 지원을 다시 도입하는 것은 문제가 될 수 있습니다. (Thomas Grainger가 gh-91181 을 통해 기여함.)

기타 CPython 구현 변경 사항

  • complex 를 위한 __complex__()bytes 를 위한 __bytes__() 특수 메서드가 구현되어 typing.SupportsComplextyping.SupportsBytes 프로토콜을 지원합니다. (Mark Dickinson과 Donghee Na가 bpo-24234 를 통해 기여함.)

  • 새로운 내부 해싱 알고리즘으로 siphash13 이 추가되었습니다. 이는 siphash24 와 유사한 보안 속성을 가지며, 긴 입력에 대해 약간 더 빠릅니다. 이제 str, bytes 및 일부 다른 유형들이 hash() 의 기본 알고리즘으로 이를 사용합니다. PEP 552해시 기반 .pyc 파일 도 이제 siphash13 을 사용합니다. (Inada Naoki가 bpo-29410 을 통해 기여함.)

  • 활성 예외가 매개변수 없이 raise 문에 의해 다시 발생할 때, 이 예외에 연결된 트레이스백은 이제 항상 sys.exc_info()[1].__traceback__ 입니다. 이는 현재 except 절에서 변경된 내용이 재발생한 예외에 반영됨을 의미합니다. (Irit Katriel 작성, bpo-45711.)

  • 인터프리터 상태에서 처리된 예외의 표현(일명 exc_info 또는 _PyErr_StackItem)이 이제 exc_value 필드만 가집니다. exc_typeexc_tracebackexc_value 로부터 도출될 수 있으므로 제거되었습니다. (Irit Katriel이 bpo-45711 을 통해 기여함.)

  • Windows 설치 프로그램을 위해 새로운 명령줄 옵션AppendPath 가 추가되었습니다. 이는 PrependPath 와 유사하게 작동하지만, 설치 및 스크립트 디렉터리를 앞에 추가하는 대신 뒤에 추가합니다. (Bastian Neuburger가 bpo-44934 를 통해 기여함.)

  • sys.path 을 초기화할 때 PyConfig.module_search_paths 를 사용하려면 이제 PyConfig.module_search_paths_set 필드가 1 로 설정되어야 합니다. 그렇지 않으면, 초기화 과정에서 경로를 다시 계산하고 module_search_paths 에 추가된 모든 값을 대체하게 됩니다.

  • --help 옵션의 출력이 이제 50줄/80열에 맞게 조정됩니다. Python 환경 변수-X 옵션에 대한 정보는 각각의 --help-env--help-xoptions 플래그와 새로운 --help-all 을 통해 확인할 수 있습니다. (Éric Araujo가 bpo-46142 를 통해 기여함.)

  • 2(이진수), 4, 8(팔진수), 16(16진수) 또는 32가 아닌 기반(예: 10(십진수))에서 intstr 간의 변환 시, 문자열 형태의 자릿수가 제한을 초과하면 알고리즘 복잡도로 인한 잠재적인 서비스 거부(DoS) 공격을 방지하기 위해 ValueError 를 발생시킵니다. 이는 CVE 2020-10735 에 대한 완화 조치입니다. 이 제한은 환경 변수, 명령줄 플래그 또는 sys API를 통해 설정하거나 비활성화할 수 있습니다. 자세한 내용은 정수 문자열 변환 길이 제한 문서를 참조하십시오. 기본 제한은 문자열 형태에서 4300자입니다.

새로운 모듈

  • tomllib: TOML <https://toml.io/> 파싱용입니다. 자세한 내용은 PEP 680 을 참조하십시오. (Taneli Hukkinen이 bpo-40059 를 통해 기여함.)

  • wsgiref.types: 정적 형 검사를 위한 WSGI 전용 타입들입니다. (Sebastian Rittau가 bpo-42012 를 통해 기여함.)

개선된 모듈

asyncio

contextlib

  • 현재 작업 디렉터리를 변경하고 종료 시 복구하는 비병렬 안전(non parallel-safe) chdir() 컨텍스트 매니저가 추가되었습니다. 이는 chdir() 의 간단한 래퍼입니다. (Filipe Laíns가 bpo-25625 를 통해 기여함)

dataclasses

  • 필드 기본값의 가변성 검사를 변경하여, 단순히 dict, list, 또는 set 인스턴스가 아닌 객체 대신 해시 가능 한 대상만 허용합니다. (Eric V. Smith가 bpo-44674 를 통해 기여함.)

datetime

enum

  • EnumMetaEnumType 으로 이름을 변경했습니다. (EnumMeta 는 별칭으로 유지됩니다.)

  • 멤버를 문자열로 사용할 수 있고(반드시 문자열이어야 함)인 StrEnum 을 추가했습니다.

  • Added ReprEnum, which only modifies the __repr__() of members while returning their literal values (rather than names) for __str__() and __format__() (used by str(), format() and f-strings).

  • Enum.__format__() (format(), str.format()f-string s의 기본값)이 항상 Enum.__str__() 와 동일한 결과를 생성하도록 변경되었습니다. 즉, ReprEnum 을 상속하는 열거형은 멤버의 값을, 그 외 모든 열거형은 열거형과 멤버 이름(예: Color.RED)을 반환합니다.

  • 범위를 벗어나는 플래그 값의 처리 방식을 제어하기 위해 Flag 열거형에 새로운 boundary 클래스 파라미터와 옵션이 포함된 FlagBoundary 열거형을 추가했습니다.

  • 열거형 클래스를 여러 구체적인 제약 조건에 대해 확인하는 verify() 열거형 데코레이터와 옵션이 포함된 EnumCheck 열거형을 추가했습니다.

  • 데코레이션된 객체가 열거형 멤버로 변환되거나 되지 않도록 보장하는 member()nonmember() 데코레이터를 추가했습니다.

  • 열거형을 위한 @property 와 유사하게 작동하는 @~enum.property 데코레이터를 추가했습니다. 이 기능을 위해 types.DynamicClassAttribute() 대신 이것을 사용하십시오.

  • 열거형 클래스가 아닌 해당 모듈의 멤버로 값을 표시하도록 __repr__()__str__() 을 조정하는 global_enum() 열거형 데코레이터를 추가했습니다. 예를 들어, re.RegexFlagASCII 멤버를 'RegexFlag.ASCII' 대신 're.ASCII' 로 표시합니다.

  • Flag 을 강화하여 멤버에 대한 len(), 반복(iteration), 그리고 in/not in 연산을 지원합니다. 예를 들어, 이제 len(AFlag(3)) == 2 and list(AFlag(3)) == (AFlag.ONE, AFlag.TWO) 가 작동합니다.

  • EnumFlag 의 멤버가 이제 __init_subclass__() 호출 전에 정의되도록 변경되었습니다. 이제 dir() 은 믹스인(mixed-in) 데이터 타입의 메서드 등을 포함합니다.

  • Flag`이 복합 값(``3`, 6, 10 등)은 별칭으로 간주하고 기본값(2의 거듭제곱)만 표준으로 인식하도록 변경되었습니다. 반전된 플래그는 양수와 동일한 값으로 변환됩니다.

fcntl

  • FreeBSD에서 F_DUP2FD`와 :data:!F_DUP2FD_CLOEXEC` 플래그를 각각 지원하며, 전자는 dup2 사용과 동일하고 후자는 추가로 FD_CLOEXEC 플래그를 설정합니다.

fractions

  • 문자열로부터 Fraction 을 초기화하는 PEP 515 스타일을 지원합니다. (Sergey B Kirpichev가 bpo-44258 에서 기여함.)

  • Fraction 이 이제 __int__ 메서드를 구현하므로, isinstance(some_fraction, typing.SupportsInt) 검사를 통과합니다. (Mark Dickinson이 bpo-44547 에서 기여함.)

functools

  • @functools.singledispatch 가 이제 디스패치 인자에 대한 어노테이션으로 types.UnionTypetyping.Union 을 지원합니다.:

    >>> from functools import singledispatch
    >>> @singledispatch
    ... def fun(arg, verbose=False):
    ...     if verbose:
    ...         print("Let me just say,", end=" ")
    ...     print(arg)
    ...
    >>> @fun.register
    ... def _(arg: int | float, verbose=False):
    ...     if verbose:
    ...         print("Strength in numbers, eh?", end=" ")
    ...     print(arg)
    ...
    >>> from typing import Union
    >>> @fun.register
    ... def _(arg: Union[list, set], verbose=False):
    ...     if verbose:
    ...         print("Enumerate this:")
    ...     for i, elem in enumerate(arg):
    ...         print(i, elem)
    ...
    

    (Yurii Karabas가 bpo-46014 에서 기여함.)

gzip

  • gzip.compress() 함수에 mtime=0 인수를 사용할 때 더 빨라졌으며, 이는 압축을 전체적으로 단일 zlib.compress() 작업으로 위임하기 때문입니다. 이 변경 사항에는 한 가지 부작용이 있습니다: gzip 파일 헤더는 헤더 내에 “OS” 바이트를 포함합니다. 이전에는 전통적으로 gzip 모듈에서 이를 “알 수 없음”을 나타내는 값 255로 설정했습니다. 이제 mtime=0 으로 compress() 를 사용하면, Python이 연결된 기반 zlib C 라이브러리에 의해 다른 값으로 설정될 수 있습니다. (부작용에 대한 자세한 내용은 gh-112346 을 참조하세요.)

hashlib

  • hashlib.blake2b()hashlib.blake2s() 가 이제 Python의 내장(vendored) 사본 대신 libb2 를 우선적으로 사용합니다. (Christian Heimes가 bpo-47095 에서 기여함.)

  • SHA3 및 SHAKE 알고리즘을 포함하는 내부 _sha3 모듈이 코드와 바이너리 크기를 줄이기 위해 Keccak Code Package 대신 tiny_sha3 를 사용합니다. hashlib 모듈은 OpenSSL의 최적화된 SHA3 및 SHAKE 구현을 우선적으로 사용하며, 이 변경 사항은 OpenSSL 지원이 없는 설치 환경에만 영향을 미칩니다. (Christian Heimes가 bpo-47098 에서 기여함.)

  • 파일 또는 파일과 유사한 객체를 효율적으로 해싱하기 위한 도움말 함수인 hashlib.file_digest() 를 추가했습니다. (Christian Heimes가 gh-89313 에서 기여함.)

IDLE 및 idlelib

  • .pyi 파일에 구문 강조를 적용했습니다. (Alex Waygood 및 Terry Jan Reedy가 bpo-45447 에서 기여)

  • 입력과 출력이 포함된 Shell을 저장할 때 프롬프트를 포함합니다. (Terry Jan Reedy가 gh-95191 에서 기여)

inspect 메듈

locale

  • 현재 로케일 인코딩을 가져오는 locale.getencoding() 을 추가했습니다. 이는 locale.getpreferredencoding(False) 와 유사하지만 Python UTF-8 Mode 를 무시합니다.

logging 모듈

math 모듈

  • math.exp2(): x의 거듭제곱인 2를 반환합니다. (Gideon Mitchell가 bpo-45917 에서 기여함.)

  • math.cbrt(): x의 세제곱근을 반환합니다. (Ajith Ramachandran이 bpo-44357 에서 기여함.)

  • IEEE 754 사양과의 일관성을 위해 두 가지 math.pow() 코너 케이스의 동작이 변경되었습니다. math.pow(0.0, -math.inf)math.pow(-0.0, -math.inf) 연산은 이제 inf 를 반환합니다. 이전에는 ValueError 를 발생시켰습니다. (Mark Dickinson이 bpo-44339 에서 기여함.)

  • math.nan 값을 이제 항상 사용할 수 있습니다. (Victor Stinner가 bpo-46917 에서 기여함.)

연산자(operator)

  • operator.call(obj, *args, **kwargs) == obj(*args, **kwargs) 가 성립하는 새로운 함수 operator.call 이 추가되었습니다. (Antony Lee가 bpo-44019 에서 기여함.)

os

  • Windows에서 os.urandom() 은 이제 더 이상 사용되지 않는 CryptGenRaw() 대신 BCryptGenRandom() 을 사용합니다. (Donghee Na가 bpo-44611 에서 기여함.)

pathlib

re

  • 정규 표현식에서 원자적 그룹화((?>...)) 및 소유적 수량자(*+, ++, ?+, {m,n}+)를 이제 지원합니다. (Jeffrey C. Jacobs와 Serhiy Storchaka가 bpo-433030 에서 기여함.)

shutil

  • shutil.rmtree() 에 선택적 매개변수 dir_fd 를 추가했습니다. (Serhiy Storchaka가 bpo-46245 에서 기여함.)

socket

  • NetBSD를 위한 CAN 소켓 지원을 추가했습니다. (Thomas Klausner가 bpo-30512 에서 기여함.)

  • create_connection() 은 연결 실패 시 마지막 오류만 발생시키는 대신 모든 오류를 포함하는 ExceptionGroup 을 발생시키는 옵션을 갖습니다. (Irit Katriel이 bpo-29980 에서 기여함.)

sqlite3

문자열

sys

  • sys.exc_info() 가 이제 value (예외 인스턴스)로부터 typetraceback 필드를 도출합니다. 따라서 예외가 처리되는 동안 수정되면 그 변경 사항이 이후 exc_info() 호출 결과에 반영됩니다. (Irit Katriel이 bpo-45711 에서 기여함.)

  • 활성 예외 인스턴스를 반환하는(sys.exc_info()[1] 와 동일) sys.exception() 을 추가했습니다. (Irit Katriel이 bpo-46328 에서 기여함.)

  • sys.flags.safe_path 플래그를 추가했습니다. (Victor Stinner가 gh-57684 에서 기여함.)

sysconfig

  • Three new installation schemes (posix_venv, nt_venv and venv) were added and are used when Python creates new virtual environments or when it is running from a virtual environment. The first two schemes (posix_venv and nt_venv) are OS-specific for non-Windows and Windows, the venv is essentially an alias to one of them according to the OS Python runs on. This is useful for downstream distributors who modify sysconfig.get_preferred_scheme(). Third party code that creates new virtual environments should use the new venv installation scheme to determine the paths, as does venv. (Contributed by Miro Hrončok in bpo-45413.)

임시 파일

  • SpooledTemporaryFile 객체가 이제 파일 모드에 따라 io.BufferedIOBase 또는 io.TextIOBase 의 메서드를 완전히 구현합니다. 이를 통해 압축 모듈과 같이 파일과 유사한 객체를 기대하는 API와 올바르게 작동할 수 있습니다. (Carey Metcalfe가 gh-70363 에서 기여함.)

threading

  • Unix에서 C 라이브러리(glibc 2.30 이상)에 sem_clockwait() 함수가 제공되는 경우, threading.Lock.acquire() 메서드는 시스템 시계(time.CLOCK_REALTIME) 대신 단조증가(monotonic) 시계(time.CLOCK_MONOTONIC)를 사용하여 시간 제한을 적용합니다. 이는 시스템 시계 변경의 영향을 받지 않기 위함입니다. (Contributed by Victor Stinner in bpo-41710.)

time

  • Unix에서 time.sleep`은 이제 사용 가능한 경우 ``select()``(해상도 1마이크로초, 10^−6 초) 대신 해상도가 1나노초(10^−9 초)인 ``clock_nanosleep()`() 또는 nanosleep() 함수를 사용합니다. (Contributed by Benjamin Szőke and Victor Stinner in bpo-21302.)

  • Windows 8.1 이상에서 time.sleep() 은 이제 해상도가 100나노초(10^−7 초)인 high-resolution timers 기반의 대기 가능 타이머를 사용합니다. 이전에는 해상도가 1밀리초(10^−3 초)였습니다. (Contributed by Benjamin Szőke, Donghee Na, Eryk Sun and Victor Stinner in bpo-21302 and bpo-45429.)

tkinter

  • sys.version_info`와 유사하게 Tcl 라이브러리의 정확한 버전을 네임드 튜플(named tuple)로 반환하는 ``info_patchlevel()` 메서드가 추가되었습니다. (Contributed by Serhiy Storchaka in gh-91827.)

추적(Traceback)

  • 사용자가 트레이스백(traceback)에 나타나는 프레임을 선택하고 그 형식을 정의할 수 있도록 traceback.StackSummary.format_frame_summary`를 추가했습니다. (Contributed by Ammar Askar in :issue:`44569().)

  • 포맷된 TracebackException 인스턴스를 파일에 출력하는 traceback.TracebackException.print`가 추가되었습니다. (Contributed by Irit Katriel in :issue:`33809().)

타이핑

주요 변경 사항은 형 힌트와 관련된 새로운 기능 을 참조하십시오.

  • typing.assert_never()typing.Never 를 추가했습니다. typing.assert_never() 는 타입 검사기에게 특정 코드 라인이 도달 가능하지 않음을 확인받을 때 유용합니다. 실행 시에는 AssertionError 를 발생시킵니다. (Contributed by Jelle Zijlstra in gh-90633.)

  • typing.reveal_type`를 추가했습니다. 이는 타입 검사기에게 주어진 표현식에 대해 추론된 형이 무엇인지 물어볼 유용합니다. 실행 시에는 수신된 값의 형을 출력합니다. (Contributed by Jelle Zijlstra in :gh:`90572().)

  • typing.assert_type`를 추가했습니다. 이는 타입 검사기에게 주어진 표현식에 대해 추론된 형이 지정된 형과 일치하는지 확인받을 유용합니다. 실행 시에는 수신됨 값만 반환합니다. (Contributed by Jelle Zijlstra in :gh:`90638().)

  • typing.TypedDict 형을 이제 제네릭(generic)으로 사용할 수 있습니다. (Contributed by Samodya Abeysiriwardane in gh-89026.)

  • NamedTuple 형을 이제 제네릭(generic)으로 사용할 수 있습니다. (Contributed by Serhiy Storchaka in bpo-43923.)

  • typing.Any의 서브클래싱을 허용합니다. 이는 mock과 같은 매우 동적인 클래스와 관련된 타입 체커 오류를 방지하는 데 유용합니다. (Contributed by Shantanu Jain in gh-91154.)

  • @typing.final데코레이터가 이제 데코레이트된 객체에 __final__ 속성을 설정합니다. (Contributed by Jelle Zijlstra in gh-90500.)

  • typing.get_overloads()함수는 함수의 오버로드를 조사(introspection)하는 데 사용될 수 있습니다. typing.clear_overloads()는 등록된 모든 함수의 오버로드를 삭제하는 데 사용됩니다. (Contributed by Jelle Zijlstra in gh-89263.)

  • Protocol서브클래스의 __init__() 메서드가 이제 유지됩니다. (Contributed by Adrian Garcia Badarasco in gh-88970.)

  • 빈 튜플 타입(Tuple[()])의 표현이 단순화되었습니다. 이는 introspection에 영향을 미치며, 예를 들어 get_args(Tuple[()]) 가 이제 ((),) 대신 () 로 평가됩니다. (Contributed by Serhiy Storchaka in gh-91137.)

  • 비공개인 typing._type_check 함수에서 callable 체크를 제거하여 타입 어노테이션에 대한 런타임 요구 사항을 완화했습니다. (Contributed by Gregory Beauregard in gh-90802.)

  • typing.get_type_hints()가 이제 PEP 585 generic aliases에서 문자열을 전방 참조로 평가하는 것을 지원합니다. (Contributed by Niklas Rosenstein in gh-85542.)

  • typing.get_type_hints() 가 이제 기본값이 None 인 매개변수에 Optional 를 추가하지 않습니다. (Contributed by Nikita Sobolev in gh-90353.)

  • typing.get_type_hints()가 이제 문자열로 된 단독(bare) ClassVar 어노테이션을 평가하는 것을 지원합니다. (Contributed by Gregory Beaureard in gh-90711.)

  • @typing.no_type_check가 더 이상 외부 클래스와 함수를 수정하지 않습니다. 또한 이제 classmethod가 타입 체크 대상이 아님을 올바르게 표시합니다. (Contributed by Nikita Sobolev in gh-90729.)

unicodedata

  • 유니코드 데이터베이스가 버전 14.0.0으로 업데이트되었습니다. (Contributed by Benjamin Peterson in bpo-45190.)

unittest

venv

  • 새로운 Python 가상 환경을 생성할 때, 해당 환경 내부의 경로를 결정하기 위해 venv sysconfig installation scheme <installation_paths>`가 사용됩니다. Python이 가상 환경에서 실행될 때도 동일한 설치 방식이 기본값이 됩니다. 이는 배포자가 가상 환경의 동작을 변경하지 않고도 기본 sysconfig 설치 방식을 변경할 수 있음을 의미합니다. 가상 환경을 생성하는 제3자 코드 또한 동일하게 작동해야 합니다. (Contributed by Miro Hrončok in :issue:`45413.)

warnings

  • warnings.catch_warnings()가 이제 warnings.simplefilter`를 위한 인자를 수용하여, 경고를 지역적으로 무시하거나 오류로 변환하는 간결한 방법을 제공합니다. (Contributed by Zac Hatfield-Dodds in :issue:`47074().)

zipfile

  • ZipFile의 디렉터리 및 파일 헤더에서 메타데이터를 읽을 때 멤버 이름 인코딩을 지정하는 기능을 추가했습니다. (Contributed by Stephen J. Turnbull and Serhiy Storchaka in bpo-28080.)

  • ZIP 아카이브 내에 새 디렉터리를 생성하기 위한 ZipFile.mkdir() <zipfile.ZipFile.mkdir>`가 추가되었습니다. (Contributed by Sam Ezeh in :gh:`49083().)

  • zipfile.Pathstem, suffix (Contributed by Miguel Brito in :gh:`88261.)

최적화

이 섹션은 별도의 섹션에서 다루는 더 빠른 CPython 프로젝트와 무관한 특정 최적화에 대해 설명합니다.

  • 컴파일러가 이제 %s, %r, %a 포맷 코드만 포함하는 문자열 리터럴에 대한 단순한 printf-style % formatting를 최적화하며, 이를 해당 f-string 표현과 동일한 속도로 처리합니다. (Contributed by Serhiy Storchaka in bpo-28307.)

  • 정수 나눗셈(//)이 컴파일러 최적화에 더 적합하도록 조정되었습니다. 이제 x86-64에서 int`를 ``2**30``보다 작은 값으로 나눌 20% 빠릅니다. (Contributed by Gregory P. Smith and Tim Peters in :gh:`90564.)

  • sum() 이 이제 2**30 보다 작은 정수에 대해 약 30% 더 빠릅니다. (Contributed by Stefan Behnel in gh-68264.)

  • 일반적인 경우에 대한 리스트 크기 조정이 간소화되어, list.append() 속도가 약 15% 향상되었고 단순한 list comprehensions은 최대 20-30%까지 빨라졌습니다. (Contributed by Dennis Sweeney in gh-91165.)

  • 모든 키가 Unicode 객체인 경우 딕셔너리가 해시 값을 저장하지 않아 dict 크기가 줄어듭니다. 예를 들어, 64비트 플랫폼에서 sys.getsizeof(dict.fromkeys("abcdefg")) 이 352바이트에서 272바이트로 감소(23% 감소)했습니다. (Contributed by Inada Naoki in bpo-46845.)

  • asyncio.DatagramProtocol`을 사용하여 UDP를 통해 대용량 파일을 전송할 속도가 훨씬 빨라졌으며, 60 MiB 파일의 경우 전송 속도가 100배 이상 향상되었습니다. (Contributed by msoxzw in :gh:`91487.)

  • math 함수인 comb() (Contributed by Serhiy Storchaka in :issue:`37295().)

  • statistics 함수인 mean(), variance()stdev() 가 이제 이터레이터를 먼저 list 로 변환하지 않고 한 번의 패스로 소비합니다. 이는 속도가 두 배 빠르며 상당한 메모리를 절약할 수 있습니다. (Contributed by Raymond Hettinger in gh-90415.)

  • unicodedata.normalize`가 이제 순수 ASCII 문자열을 상수 시간 내에 정규화합니다. (Contributed by Donghee Na in :issue:`44987().)

더 빠른 CPython

Ubuntu Linux에서 GCC로 컴파일했을 때, pyperformance <https://github.com/python/pyperformance> 벤치마크 세트로 측정 결과 CPython 3.11은 CPython 3.10보다 평균 25% 더 빠릅니다 <https://github.com/faster-cpython/ideas#published-results>`. 워크로드에 따라 전체 속도 향상 폭은 10~60%에 달할 수 있습니다.

이 프로젝트는 파이썬의 두 가지 주요 영역인 더 빠른 시작더 빠른 실행 시간 에 중점을 둡니다. 이 프로젝트에서 다루지 않는 최적화 사항은 최적화 아래 별도로 나열됩니다.

더 빠른 시작

얼어붙은(Frozen) 가져오기 / 정적 코드 객체

파이썬은 모듈 로딩을 빠르게 하기 위해 __pycache__ 디렉터리에 bytecode 를 캐싱합니다.

이전의 3.10 버전에서 파이썬 모듈 실행은 다음과 같았습니다:

__pycache__ 읽기 -> 역직렬화(Unmarshal) -> 힙에 할당된 코드 객체 -> 평가

파이썬 3.11에서 파이썬 시작에 필수적인 핵심 모듈들은 “얼어붙은(frozen)” 상태입니다. 이는 해당 모듈의 코드 객체 (및 바이트코드)가 인터프리터에 의해 정적으로 할당됨을 의미합니다. 이로 인해 모듈 실행 과정이 다음과 같이 단축됩니다:

정적으로 할당된 코드 객체 -> 평가

파이썬 3.11에서 인터프리터 시작 속도가 10~15% 빨라졌습니다. 이는 파이썬을 사용하는 실행 시간이 짧은 프로그램에 큰 영향을 미칩니다.

(여러 이슈를 통해 Eric Snow, Guido van Rossum 및 Kumar Aditya가 기여함.)

더 빠른 실행 시간

더 가볍고 지연된(lazy) 파이썬 프레임

실행 정보를 보유하는 파이썬 프레임은 파이썬이 파이썬 함수를 호출할 때마다 생성됩니다. 다음은 새로운 프레임 최적화 사항입니다:

  • 프레임 생성 프로세스를 간소화했습니다.

  • C 스택에서 프레임 공간을 적극적으로 재사용하여 메모리 할당을 줄였습니다.

  • 내부 프레임 구조를 필수 정보만 포함하도록 간소화했습니다. 이전의 프레임은 추가적인 디버깅 및 메모리 관리 정보를 포함하고 있었습니다.

구식 frame objects 는 이제 디버거나 sys._getframe()inspect.currentframe() 과 같은 파이썬 introspection 함수에 의해 요청될 때만 생성됩니다. 대부분의 사용자 코드에서는 프레임 객체가 전혀 생성되지 않습니다. 그 결과, 거의 모든 파이썬 함수 호출 속도가 상당히 향상되었습니다. pyperformance를 통해 3~7%의 성능 향상을 측정했습니다.

(Mark Shannon이 bpo-44590 에서 기여함.)

파이썬 함수 호출 인라인화

파이썬 함수 호출 중에 파이썬은 해당 함수의 코드를 해석하기 위해 평가용 C 함수를 호출합니다. 이는 순수 파이썬 재귀를 C 스택에서 안전한 범위로 제한하는 효과가 있습니다.

3.11에서 CPython이 파이썬 코드가 다른 파이썬 함수를 호출하는 것을 감지하면 새로운 프레임을 설정하고 새 프레임 내의 새 코드로 “점프”합니다. 이를 통해 C 해석 함수를 호출하는 과정을 완전히 생략합니다.

대부분의 파이썬 함수 호출이 이제 C 스택 공간을 소모하지 않아 속도가 향상되었습니다. 피보나치나 팩토리얼과 같은 단순한 재귀 함수에서 1.7배의 속도 향상을 확인했습니다. 이는 또한 사용자가 sys.setrecursionlimit() 으로 재귀 제한을 늘릴 경우, 재귀 함수가 훨씬 더 깊게 실행될 수 있음을 의미합니다. pyperformance에서 1-3%의 개선이 측정되었습니다.

(Pablo Galindo와 Mark Shannon이 bpo-45256 에서 기여했습니다.)

PEP 659: 특수화된 적응형 인터프리터

PEP 659 은 Faster CPython 프로젝트의 핵심 부분 중 하나입니다. 일반적인 개념은 파이썬이 동적 언어임에도 불구하고, 대부분의 코드에는 객체와 타입이 거의 변하지 않는 영역이 존재한다는 것입니다. 이 개념을 타입 안정성(type stability) 이라고 합니다.

실행 시점에 파이썬은 일반적인 패턴과 실행 중인 코드의 타입 안정성을 찾으려고 시도할 것입니다. 그런 다음 현재 연산을 보다 특화된 연산으로 대체합니다. 이 특화된 연산은 오직 해당 사용 사례/타입에만 사용 가능한 빠른 경로를 이용하며, 일반적으로 범용 대응물보다 성능이 우수합니다. 이는 또한 인라인 캐싱 이라는 또 다른 개념을 가져오는데, 파이썬이 비용이 많이 드는 연산 결과를 바이트코드 내부에 직접 캐시하는 것입니다.

특수화 도구는 또한 특정 공통 명령어 쌍을 하나의 슈퍼인스트럭션(superinstruction)으로 결합하여 실행 중 발생하는 오버헤드를 줄입니다.

파이썬은 코드가 “핫(hot)”(여러 번 실행됨)한 경우에만 특수화를 수행합니다. 이를 통해 파이썬이 한 번만 실행되는 코드에 시간을 낭비하는 것을 방지합니다. 또한 코드가 너무 동적이거나 사용 방식이 변경되면 파이썬은 비특수화(de-specialize)를 수행할 수 있습니다. 특수화 시도는 주기적으로 수행되며, 이러한 시도 자체가 비용이 크지 않기 때문에 새로운 상황에 맞춰 적응할 수 있습니다.

(Stefan Brunthaler의 아이디어에서 영감을 받아 Mark Shannon이 작성한 PEP입니다. 자세한 내용은 PEP 659 를 참조하십시오. 구현은 Mark Shannon과 Brandt Bucher가 담당했으며, Irit Katriel과 Dennis Sweeney가 추가로 도왔습니다.)

연산

형태

특수화

연산 속도 향상 (최대)

기여도

이항 연산

x + x

x - x

x * x

int, float, str 와 같은 일반적인 타입에 대한 이항 덧셈, 곱셈 및 뺄셈은 해당 기본 타입에 대한 전용 빠른 경로를 사용합니다.

10%

Mark Shannon, Donghee Na, Brandt Bucher, Dennis Sweeney

서브스크립트

a[i]

list, tuple, dict 와 같은 컨테이너 타입을 서브스크립팅할 때 기본 데이터 구조를 직접 인덱싱합니다.

사용자 정의 __getitem__() 서브스크립팅 또한 파이썬 함수 호출 인라인화 와 유사하게 인라인화됩니다.

10-25%

Irit Katriel, Mark Shannon

서브스크립트 저장

a[i] = z

위의 서브스크립팅 특수화와 유사합니다.

10-25%

Dennis Sweeney

호출

f(arg)

C(arg)

len()str 과 같은 일반적인 내장(C) 함수 및 타입에 대한 호출은 해당 기반 C 버전을 직접 호출합니다. 이를 통해 내부 호출 규약을 거치는 과정을 생략합니다.

20%

Mark Shannon, Ken Jin

전역 변수 로드

print

len

globals/builtins 네임스페이스에서 객체의 인덱스가 캐시됩니다. 따라서 전역 변수 및 내장 함수를 로드할 때 네임스페이스 조회가 필요하지 않습니다.

[1]

Mark Shannon

어트리뷰트 로드

o.attr

전역 변수 로드와 유사합니다. 클래스/객체 네임스페이스 내의 어트리뷰트 인덱스가 캐시됩니다. 대부분의 경우 어트리뷰트 로드 시 네임스페이스 조회가 필요하지 않습니다.

[2]

Mark Shannon

호출을 위한 메서드 로드

o.meth()

메서드의 실제 주소가 캐시됩니다. 이제 긴 상속 체인을 가진 클래스를 포함하여 메서드 로드 시 네임스페이스 조회가 발생하지 않습니다.

10-20%

Ken Jin, Mark Shannon

어트리뷰트 저장

o.attr = z

어트리뷰트 로드 최적화와 유사합니다.

pyperformance에서 2%

Mark Shannon

시퀀스 언팩

*seq

listtuple 과 같은 일반적인 컨테이너를 위해 특수화되었습니다. 내부 호출 규약을 피합니다.

8%

Brandt Bucher

기타

  • 객체 네임스페이스가 지연 생성됨에 따라 객체가 사용하는 메모리가 줄어들었습니다. 이제 네임스페이스 딕셔너리들도 키를 더 자유롭게 공유합니다. (Mark Shannon이 bpo-45340bpo-40116 에서 기여했습니다.)

  • “제로 비용(Zero-cost)” 예외가 구현되어, 예외가 발생하지 않을 때 try 문에서 발생하는 비용이 제거되었습니다. (Mark Shannon이 bpo-40222 에서 기여했습니다.)

  • 인터프리터 내의 예외 표현이 더 간결해지면서 예외를 포착하는 데 필요한 시간이 약 10% 단축되었습니다. (Irit Katriel이 bpo-45711 에서 기여했습니다.)

  • re 의 정규 표현식 매칭 엔진이 일부 리팩토링되었으며, 이제 지원되는 플랫폼에서 computed gotos(또는 “threaded code”)를 사용합니다. 그 결과, Python 3.11은 pyperformance 정규 표현식 벤치마크 를 Python 3.10보다 최대 10% 더 빠르게 실행합니다. (Brandt Bucher가 gh-91404 에서 기여했습니다.)

자주 묻는 질문(FAQ)

이러한 속도 향상을 활용하려면 코드를 어떻게 작성해야 합니까?

일반적인 모범 사례를 따르는 파이썬다운 코드를 작성하십시오. 여러분의 코드를 굳이 수정할 필요는 없습니다. Faster CPython 프로젝트는 우리가 관찰하는 일반적인 코드 패턴을 최적화합니다.

CPython 3.11이 더 많은 메모리를 사용합니까?

그렇지 않을 수 있습니다. 메모리 사용량이 3.10보다 20% 이상 증가할 것으로 예상하지 않습니다. 이는 앞서 언급한 프레임 객체 및 객체 딕셔너리에 대한 메모리 최적화로 상쇄됩니다.

제 작업량에서 속도 향상이 보이지 않습니다. 이유가 무엇입니까?

특정 코드에서는 눈에 띄는 이점이 없을 수 있습니다. 코드가 대부분의 시간을 I/O 작업에 소비하거나, 이미 NumPy와 같은 C 확장 라이브러리에서 대부분의 계산을 수행하는 경우 속도 향상이 크지 않을 것입니다. 현재로서는 이 프로젝트가 순수 파이썬(pure-Python) 워크로드에서 가장 큰 효과를 냅니다.

또한, pyperformance 수치는 기하 평균입니다. pyperformance 벤치마크 내에서도 일부 벤치마크는 약간 느려진 반면, 다른 것들은 거의 2배나 빨라졌습니다!

JIT 컴파일러가 있습니까?

아니요. 우리는 아직 다른 최적화 방안을 탐색하고 있습니다.

정보

Faster CPython은 CPython 을 위한 최적화 기법을 연구합니다. 메인 팀은 Microsoft의 후원을 받아 전업으로 이 업무를 수행하며, Pablo Galindo Salgado는 Bloomberg LP의 지원을 받아 파트타임으로 프로젝트에 참여합니다. 마지막으로, 많은 기여자가 커뮤니티 자원봉사자들입니다.

CPython 바이트코드 변경 사항

바이트 코드에 이제 새로운 CACHE 명령어로 구성된 인라인 캐시 항목이 포함됩니다. 많은 opcode가 정확한 수의 캐시를 뒤따를 것을 예상하며, 실행 시 인터프리터에 이들을 건너뛰도록 지시합니다. 채워진 캐시는 임의의 명령어로 보일 수 있으므로, 가속화된 데이터를 포함하는 원시 적응형 바이트 코드를 읽거나 수정할 때는 주의가 필요합니다.

새로운 opcode

교체된 opcode

교체된 opcode(들)

새로운 opcode(들)

참고 사항

BINARY_*
INPLACE_*

BINARY_OP

모든 숫자형 이항/인플레이스 opcode를 단일 opcode로 교체

CALL_FUNCTION
CALL_FUNCTION_KW
CALL_METHOD
KW_NAMES
PRECALL

메서드의 인자 이동을 키워드 인자 처리와 분리하여, 호출에 대한 더 나은 특수화가 가능하도록 함

DUP_TOP
DUP_TOP_TWO
ROT_TWO
ROT_THREE
ROT_FOUR
ROT_N

스택 조작 명령

JUMP_IF_NOT_EXC_MATCH

이제 검사를 수행하지만 점프하지 않음

JUMP_ABSOLUTE
POP_JUMP_IF_FALSE
POP_JUMP_IF_TRUE
POP_JUMP_BACKWARD_IF_*
POP_JUMP_FORWARD_IF_*

See [3]; TRUE, FALSE, NONE and NOT_NONE variants for each direction

SETUP_WITH
SETUP_ASYNC_WITH

BEFORE_WITH

with 블록 설정

변경/제거된 opcode

  • MATCH_CLASSMATCH_KEYS 를 변경하여 성공/실패를 나타내기 위해 추가적인 불리언 값을 푸시하지 않도록 했습니다. 대신 실패 시 추출된 값의 튜플 대신 None 을 푸시합니다.

  • 예외와 상호작용하는 opcode를 변경하여, 이제 예외가 스택에서 세 항목이 아닌 하나의 항목으로 표현되는 것을 반영합니다(참조: gh-89874).

  • COPY_DICT_WITHOUT_KEYS, GEN_START, POP_BLOCK, SETUP_FINALLYYIELD_FROM 을 삭제했습니다.

폐지됨

이 섹션은 Python 3.11에서 폐지된 Python API 목록을 나열합니다.

폐지된 C API는 별도로 나열되어 있습니다.

언어/내장 기능

  • 연쇄(Chaining) classmethod 디스크립터(어휘: bpo-19072)가 이제 폐지되었습니다. 더 이상 property 와 같은 다른 디스크립터를 래핑하는 데 사용할 수 없습니다. 이 기능의 핵심 설계에 결함이 있어 여러 하위 문제를 야기했습니다. classmethod 를 “전달(pass-through)”하려면 Python 3.10에서 추가된 __wrapped__ 속성을 사용하는 것을 고려하십시오. (Raymond Hettinger가 gh-89519 에서 기여했습니다.)

  • 값이 0o377 (십진수 255)을 초과하는 문자열 및 바이트 리터럴의 8진수 이스케이프는 이제 DeprecationWarning 을 생성합니다. 향후 Python 버전에서는 SyntaxWarning 을 발생시키고 결국에는 SyntaxError 를 일으킬 것입니다. (Serhiy Storchaka가 gh-81548 에서 기여했습니다.)

  • int()__trunc__() 로 전달하는 기능이 이제 폐지되었습니다. type(a)__trunc__() 를 구현하지만 __int__() 또는 __index__() 를 구현하지 않는 경우에 int(a) 를 호출하면 이제 DeprecationWarning 이 발생합니다. (Zackery Spytz가 bpo-44977 에서 기여했습니다.)

모듈

  • PEP 594 로 인해 다음 모듈들이 폐지되었으며, 이들은 Python 3.13에서 제거될 예정입니다:

    aifc

    chunk

    msilib

    pipes

    telnetlib

    audioop

    crypt

    nis

    sndhdr

    uu

    cgi

    imghdr

    nntplib

    spwd

    xdrlib

    cgitb

    mailcap

    ossaudiodev

    sunau

    (Brett Cannon이 bpo-47061 에서, Victor Stinner가 gh-68966 에서 기여했습니다.)

  • asynchat, asyncoresmtpd 모듈은 최소 Python 3.6부터 폐지되었습니다. 이들의 문서와 폐지 경고가 이제 Python 3.12에서 제거될 것임을 알리는 내용으로 업데이트되었습니다. (Hugo van Kemenade가 bpo-47022 에서 기여했습니다.)

  • lib2to3 패키지와 2to3 도구는 이제 폐지되었으며 Python 3.10 이상 버전을 파싱하지 못할 수 있습니다. 자세한 내용은 새로운 PEG 파서 도입에 관한 PEP 617 을 참조하십시오. (Victor Stinner가 bpo-40360 에서 기여했습니다.)

  • 문서화되지 않은 모듈인 sre_compile, sre_constants, sre_parse 가 이제 폐지되었습니다. (Serhiy Storchaka가 bpo-47152 에서 기여했습니다.)

표준 라이브러리

  • 다음 항목들은 Python 3.2부터 configparser 에서 폐지되었습니다. 이들의 폐지 경고는 이제 Python 3.12에서 제거될 것임을 알리는 내용으로 업데이트되었습니다:

    • configparser.SafeConfigParser 클래스

    • configparser.ParsingError.filename 속성

    • configparser.RawConfigParser.readfp() 메서드

    (Hugo van Kemenade가 bpo-45173 에서 기여했습니다.)

  • configparser.LegacyInterpolation 은 Python 3.2부터 독스트링에서 폐지되었으며, configparser 문서에 포함되지 않습니다. 이제 DeprecationWarning 을 생성하며 Python 3.13에서 제거될 예정입니다. 대신 configparser.BasicInterpolation 또는 configparser.ExtendedInterpolation 을 사용하십시오. (Hugo van Kemenade가 bpo-46607 에서 기여했습니다.)

  • 과거의 importlib.resources 함수 세트는 패키지 하위 디렉터리에 위치한 리소스를 지원하지 않기 때문에 폐지되었으며, Python 3.9에 추가된 대체 기능들이 도입되었습니다. 이들은 향후 Python 버전에서 제거될 예정입니다.

    • importlib.resources.contents()

    • importlib.resources.is_resource()

    • importlib.resources.open_binary()

    • importlib.resources.open_text()

    • importlib.resources.read_binary()

    • importlib.resources.read_text()

    • importlib.resources.path()

  • locale.getdefaultlocale() 함수는 폐지되었으며 Python 3.15에서 제거될 예정입니다. 대신 locale.setlocale(), locale.getpreferredencoding(False)locale.getlocale() 함수를 사용하십시오. (Victor Stinner가 gh-90817 에서 기여했습니다.)

  • locale.resetlocale() 함수는 폐지되었으며 Python 3.13에서 제거될 예정입니다. 대신 locale.setlocale(locale.LC_ALL, "") 를 사용하십시오. (Victor Stinner가 gh-90817 에서 기여했습니다.)

  • 정규 표현식 에서 숫자 그룹 참조 및 그룹 이름에 대해 더 엄격한 규칙이 적용됩니다. 이제 숫자 참조로 ASCII 숫자의 시퀀스만 허용되며, bytes 패턴 및 치환 문자열의 그룹 이름은 ASCII 영문자, 숫자, 밑줄(_)만 포함할 수 있습니다. 현재는 이 규칙을 위반하는 구문에 대해 폐지 경고가 발생합니다. (Serhriy Storchaka가 gh-91760 에서 기여했습니다.)

  • re 모듈에서 문서화되지 않았고 명확한 목적이 없던 re.template() 함수와 그에 해당하는 re.TEMPLATE, re.T 플래그가 폐지되었습니다. 이들은 Python 3.13에서 제거될 예정입니다. (Serhiy Storchaka와 Miro Hrončok이 gh-92728 에서 기여했습니다.)

  • turtle.settiltangle() 은 Python 3.1부터 폐지되었으며, 이제 폐지 경고를 생성하고 Python 3.13에서 제거될 예정입니다. 대신 turtle.tiltangle() 을 사용하십시오 (이전에 잘못이 폐지된 것으로 표시되어 있었으나 현재는 설명문이 수정되었습니다). (Hugo van Kemenade가 bpo-45837 에서 기여했습니다.)

  • typing.Text 는 오직 Python 2와 Python 3 코드 간의 호환성 지원을 제공하기 위해 존재하며, 이제 폐지되었습니다. 당장 제거될 계획은 없으나 사용자는 가능한 경우 대신 str 을 사용하는 것이 권장됩니다. (Alex Waygood이 gh-92332 에서 기여했습니다.)

  • typing.TypedDict 형을 구성할 때 사용하는 키워드 인자 구문이 이제 폐지되었습니다. 지원 기능은 Python 3.13에서 제거될 예정입니다. (Jingchen Ye가 gh-90224 에서 기여했습니다.)

  • webbrowser.MacOSX 는 폐지되었으며 Python 3.13에서 제거될 예정입니다. 이 클래스는 테스트되지 않았고, 문서화되지 않았으며, webbrowser 모듈 자체에서도 사용되지 않습니다. (Donghee Na가 bpo-42255 에서 기여했습니다.)

  • TestCaseIsolatedAsyncioTestCase 테스트 메서드에서 기본값인 None 이외의 값을 반환하는 동작이 이제 폐지되었습니다.

  • 다음과 같이 공식적으로 문서화되지 않은 unittest 기능들이 폐지되었으며, Python 3.13에서 제거될 예정입니다:

    • unittest.findTestCases()

    • unittest.makeSuite()

    • unittest.getTestCaseNames()

    대신 TestLoader 메서드를 사용하십시오:

    (Erlend E. Aasland가 bpo-5846 에서 기여했습니다.)

  • unittest.TestProgram.usageExit() 이 폐지된 것으로 표시되었으며, 3.13에서 제거될 예정입니다. (Carlos Damázio가 gh-67048 에서 기여했습니다.)

Python 3.12에서 제거 예정인 기능들

다음 Python API들은 이전 버전에서 폐지되었으며, Python 3.12에서 제거될 예정입니다.

제거 예정인 C API는 별도로 나열되어 있습니다.

  • asynchat 모듈

  • asyncore 모듈

  • distutils 패키지 전체

  • imp 모듈

  • typing.io 네임스페이스

  • typing.re 네임스페이스

  • cgi.log()

  • importlib.find_loader()

  • importlib.abc.Loader.module_repr()

  • importlib.abc.MetaPathFinder.find_module()

  • importlib.abc.PathEntryFinder.find_loader()

  • importlib.abc.PathEntryFinder.find_module()

  • importlib.machinery.BuiltinImporter.find_module()

  • importlib.machinery.BuiltinLoader.module_repr()

  • importlib.machinery.FileFinder.find_loader()

  • importlib.machinery.FileFinder.find_module()

  • importlib.machinery.FrozenImporter.find_module()

  • importlib.machinery.FrozenLoader.module_repr()

  • importlib.machinery.PathFinder.find_module()

  • importlib.machinery.WindowsRegistryFinder.find_module()

  • importlib.util.module_for_loader()

  • importlib.util.set_loader_wrapper()

  • importlib.util.set_package_wrapper()

  • pkgutil.ImpImporter

  • pkgutil.ImpLoader

  • pathlib.Path.link_to()

  • sqlite3.enable_shared_cache()

  • sqlite3.OptimizedUnicode()

  • PYTHONTHREADDEBUG 환경 변수

  • unittest 의 다음 폐지된 별칭들:

    폐지된 에일리어스

    메서드 이름

    사용 지원 중단 버전

    failUnless

    assertTrue()

    3.1

    failIf

    assertFalse()

    3.1

    failUnlessEqual

    assertEqual()

    3.1

    failIfEqual

    assertNotEqual()

    3.1

    failUnlessAlmostEqual

    assertAlmostEqual()

    3.1

    failIfAlmostEqual

    assertNotAlmostEqual()

    3.1

    failUnlessRaises

    assertRaises()

    3.1

    assert_

    assertTrue()

    3.2

    assertEquals

    assertEqual()

    3.2

    assertNotEquals

    assertNotEqual()

    3.2

    assertAlmostEquals

    assertAlmostEqual()

    3.2

    assertNotAlmostEquals

    assertNotAlmostEqual()

    3.2

    assertRegexpMatches

    assertRegex()

    3.2

    assertRaisesRegexp

    assertRaisesRegex()

    3.2

    assertNotRegexpMatches

    assertNotRegex()

    3.5

제거됨

이 섹션은 Python 3.11에서 제거된 Python API 목록을 나열합니다.

제거된 C API는 별도로 나열되어 있습니다.

  • Removed the @asyncio.coroutine() decorator enabling legacy generator-based coroutines to be compatible with async / await code. The function has been deprecated since Python 3.8 and the removal was initially scheduled for Python 3.10. Use async def instead. (Contributed by Illia Volochii in bpo-43216.)

  • 디버그 모드에서 레거시 제너레이터 기반 코루틴 객체를 래핑하는 데 사용되는 asyncio.coroutines.CoroWrapper 를 제거했습니다. (Illia Volochii가 bpo-43216 에서 기여했습니다.)

  • 심각한 보안 문제로 인해, Python 3.9에서 비활성화되었던 asyncio.loop.create_datagram_endpoint()reuse_address 매개 변수가 이제 완전히 제거되었습니다. 이는 UDP에서의 소켓 옵션 SO_REUSEADDR 동작 때문입니다. (Hugo van Kemenade가 bpo-45129 에서 기여했습니다.)

  • Python 3.9에서 폐지된 binhex 모듈을 제거했습니다. 또한 이와 관련되어 마찬가지로 폐지된 binascii 기능들도 제거했습니다.

    • binascii.a2b_hqx()

    • binascii.b2a_hqx()

    • binascii.rlecode_hqx()

    • binascii.rldecode_hqx()

    binascii.crc_hqx() 함수는 여전히 사용할 수 있습니다.

    (Victor Stinner가 bpo-45085 에서 기여했습니다.)

  • Python 3.9에서 폐지된 distutilsbdist_msi 명령을 제거했습니다. 대신 bdist_wheel (휠 패키지)을 사용하십시오. (Hugo van Kemenade가 bpo-45124 에서 기여했습니다.)

  • Python 3.9부터 폐지된 xml.dom.pulldom.DOMEventStream, wsgiref.util.FileWrapper, fileinput.FileInput__getitem__() 메서드를 제거했습니다. (Hugo van Kemenade가 bpo-45132 에서 기여했습니다.)

  • Removed the deprecated gettext functions lgettext(), ldgettext(), lngettext() and ldngettext(). Also removed the bind_textdomain_codeset() function, the NullTranslations.output_charset() and NullTranslations.set_output_charset() methods, and the codeset parameter of translation() and install(), since they are only used for the l*gettext() functions. (Contributed by Donghee Na and Serhiy Storchaka in bpo-44235.)

  • inspect 모듈에서 다음을 제거했습니다:

    • Python 3.0부터 폐지된 getargspec() 함수를 제거했습니다. 대신 inspect.signature() 또는 inspect.getfullargspec() 을 사용하십시오.

    • Python 3.5부터 폐지된 formatargspec() 함수를 제거했습니다. 대신 inspect.signature() 함수나 inspect.Signature 객체를 직접 사용하십시오.

    • Python 3.5부터 폐지된 문서화되지 않은 Signature.from_builtin()Signature.from_function() 메서드를 제거했습니다. 대신 Signature.from_callable() 메서드를 사용하십시오.

    (Hugo van Kemenade가 bpo-45320 을 통해 기여함.)

  • 사용되지 않으면서 이전 버전에서 실수로 추가된 __class_getitem__() 메서드를 pathlib.PurePath 에서 제거했습니다. (Nikita Sobolev가 bpo-46483 을 통해 기여함.)

  • 외부 mailman 패키지 없이는 사용할 수 없는 smtpd 모듈의 MailmanProxy 클래스를 제거했습니다. (Donghee Na가 bpo-35800 을 통해 기여함.)

  • _tkinter.TkappType 의 폐지된 split() 메서드를 제거했습니다. (Erlend E. Aasland가 bpo-38371 을 통해 기여함.)

  • unittest 디스커버리에서 네임스페이스 패키지(namespace package) 지원을 제거했습니다. 이 기능은 Python 3.4에서 도입되었으나 Python 3.7부터 문제가 발생해 왔습니다. (Inada Naoki가 bpo-23882 를 통해 기여함.)

  • 문서화되지 않은 비공개 float.__set_format__() 메서드(Python 3.7에서 float.__setformat__() 으로 알려짐)를 제거했습니다. 해당 메서드의 독스트링은 “이 함수를 사용하지 않는 것이 좋습니다. 이 기능은 주로 Python 테스트 스위트에서 사용됩니다.”라고 명시되어 있었습니다. (Victor Stinner가 bpo-46852 를 통해 기여함.)

  • --experimental-isolated-subinterpreters 구성 플래그(및 관련 EXPERIMENTAL_ISOLATED_SUBINTERPRETERS 매크로)가 제거되었습니다.

  • Pynche — 파이썬 방식의 자연스러운 색상 및 색조 편집기 —가 Tools/scripts 에서 이동되었으며, 현재는 파이썬 소스 트리에서 분리되어 독립적으로 개발되고 있습니다. <https://gitlab.com/warsaw/pynche/-/tree/main>

Python 3.11로 이식

이 섹션은 앞서 설명한 변경 사항과 사용자의 파이썬 코드 수정을 요구할 수 있는 다른 Python API 버그 수정 목록을 나열합니다.

C API 포팅 노트는 별도로 목록화되었습니다 _

  • open(), io.open(), codecs.open()fileinput.FileInput 에서 더 이상 파일 모드로 'U'' (“유니버설 줄 바꿈”)를 허용하지 않습니다. Python 3에서는 파일을 텍스트 모드로 열 때 기본적으로 “유니버설 줄 바꿈” 모드가 사용되며, 'U' 플래그는 Python 3.3부터 폐지되었습니다. 이들 함수의 newline 매개변수 가 유니버설 줄 바꿈 작동 방식을 제어합니다. (Victor Stinner가 bpo-37330 을 통해 기여함.)

  • ast.AST 노드 위치가 compile() 및 기타 관련 함수에 제공될 때 검증됩니다. 유효하지 않은 위치가 감지되면 ValueError 가 발생합니다. (Pablo Galindo가 gh-93351 을 통해 기여함)

  • Python 3.8에서 폐지된 이후, asyncio.loop.set_default_executor()concurrent.futures.ThreadPoolExecutor 이 아닌 실행자를 전달하는 것이 금지됩니다. (Illia Volochii가 bpo-43234 를 통해 기여함.)

  • calendar: calendar.LocaleTextCalendarcalendar.LocaleHTMLCalendar 클래스는 이제 로캘이 지정되지 않은 경우 locale.getdefaultlocale() 대신 locale.getlocale() 를 사용합니다. (Victor Stinner가 bpo-46659 을 통해 기여함.)

  • pdb 모듈은 이제 .pdbrc 설정 파일을 'UTF-8' 인코딩으로 읽습니다. (Srinivas Reddy Thatiparthy가 bpo-41137 을 통해 기여함.)

  • random.sample()population 매개변수는 반드시 시퀀스여야 하며, setlist 로 자동 변환하는 기능은 더 이상 지원되지 않습니다. 또한 샘플 크기가 population 크기보다 크면 ValueError 가 발생합니다. (Raymond Hettinger가 bpo-40465 를 통해 기여함.)

  • random.shuffle() 의 선택적 매개변수 random 이 제거되었습니다. 이전에는 셔플에 사용할 임의의 랜덤 함수였으나, 이제는 기존 기본값인 random.random() 이 항상 사용됩니다.

  • re 정규식 문법 에서 전역 인라인 플래그(예: (?i))는 이제 정규 표현식의 시작 부분에서만 사용할 수 있습니다. 다른 위치에서 사용하는 것은 Python 3.6부터 폐지되었습니다. (Serhiy Storchaka가 bpo-47066 을 통해 기여함.)

  • re 모듈에서 드문 경우에 캡처 그룹이 잘못된 결과를 반환하게 만들 수 있는 몇 가지 오래된 버그들을 수정했습니다. 따라서 이러한 경우의 캡처 결과가 변경될 수 있습니다. (Ma Lin이 bpo-35859 을 통해 기여함.)

빌드 변경 사항

  • CPython은 이제 WebAssembly <https://webassembly.org/> 플랫폼인 Emscripten <https://emscripten.org/> (wasm32-unknown-emscripten, 즉 브라우저용 Python) 및 WebAssembly System Interface (WASI) <https://wasi.dev/> (wasm32-unknown-wasi)를 위한 PEP 11 Tier 3 지원 을 제공합니다. 이 노력은 Pyodide <https://pyodice.org/> 와 같은 이전 연구에서 영감을 받았습니다. 이러한 플랫폼은 제한된 범위의 POSIX API를 제공하므로, 네트워킹, 프로세스, 스레딩, 시그널, mmap, 유저/그룹과 관련된 Python 표준 라이브러리 기능 및 모듈을 사용할 수 없거나 작동하지 않습니다. (Emscripten은 Christian Heimes와 Ethan Smith가 gh-84461 에서 기여했고, WASI는 Christian Heimes가 gh-90473 에서 기여했으며, 플랫폼은 gh-95085 에서 승격되었습니다.)

  • CPython을 빌드하려면 이제 다음이 필요합니다:

  • Py_NO_NAN 매크로가 제거되었습니다. 이제 CPython이 IEEE 754 부동 소수점을 요구하므로, NaN 값이 항상 사용 가능합니다. (Victor Stinner가 bpo-46656 을 통해 기여함.)

  • tkinter 패키지는 이제 Tcl/Tk <https://www.tcl.tk> 버전 8.5.12 이상을 요구합니다. (Serhiy Storchaka가 bpo-46996 을 통해 기여함.)

  • 대부분의 표준 라이브러리 확장 모듈에 대한 빌드 의존성, 컴파일러 플래그 및 링커 플래그를 이제 configure 가 감지합니다. libffi, libnsl, libsqlite3, zlib, bzip2, liblzma, libcrypt, Tcl/Tk, uuid 플래그는 (사용 가능한 경우) pkg-config 를 통해 감지됩니다. tkinter 는 이제 Tcl/Tk 헤더와 라이브러리의 개발 설정을 감지하기 위해 pkg-config 명령이 필요합니다. (Christian Heimes 및 Erlend Egeberg Aasland가 bpo-45847, bpo-45747, bpo-45763 을 통해 기여함.)

  • libpython이 더 이상 libcrypt에 링크되지 않습니다. (Mike Gilbert가 bpo-45433 에서 기여함.)

  • 이제 --with-ltothin 을 전달하여(즉, --with-lto=thin) ThinLTO 옵션으로 CPython을 빌드할 수 있습니다. (Donghee Na 및 Brett Holman이 bpo-44340 을 통해 기여함.)

  • 객체 구조체를 위한 Freelist를 이제 비활성화할 수 있습니다. 새로운 configure 옵션인 --without-freelists 를 사용하여 빈 튜플 싱글렛을 제외한 모든 freelist를 비활성화할 수 있습니다. (Christian Heimes가 bpo-45522 을 통해 기여함.)

  • Modules/SetupModules/makesetup 이 개선되고 정리되었습니다. 이제 확장 모듈을 makesetup 을 통해 빌드할 수 있습니다. 일부 테스트 모듈을 제외한 모든 모듈을 메인 바이너리나 라이브러리에 정적으로 링크할 수 있습니다. (Brett Cannon 및 Christian Heimes가 bpo-45548, bpo-45570, bpo-45571, bpo-43974 를 통해 기여함.)

    참고

    Tcl/Tk 헤더와 라이브러리의 위치를 수동으로 지정하려면 환경 변수 TCLTK_CFLAGSTCLTK_LIBS`를 사용하십시오. :program:`configure 옵션인 --with-tcltk-includes`와 :option:!–with-tcltk-libs`는 제거되었습니다.

    RHEL 7 및 CentOS 7에서는 개발 패키지가 tcl.pctk.pc``를 제공하지 않으므로, ``TCLTK_LIBS="-ltk8.5 -ltkstub8.5 -ltcl8.5"``를 사용하십시오. ``Misc/rhel7 디렉터리에는 .pc 파일과 RHEL 7 및 CentOS 7의 Tcl/Tk와 OpenSSL을 사용하여 Python을 빌드하는 방법에 대한 지침이 포함되어 있습니다.

  • CPython은 이제 Python int 구현에 기본으로 30비트 숫자를 사용합니다. 이전에는 SIZEOF_VOID_P >= 8 인 플랫폼에서는 30비트 숫자를, 그 외의 경우에는 15비트 숫자를 사용하는 것이 기본이었습니다. 여전히 configure 스크립트의 --enable-big-digits 옵션이나 (Windows의 경우) PC/pyconfig.hPYLONG_BITS_IN_DIGIT 변수를 통해 명시적으로 15비트 숫자를 사용하도록 요청할 수 있지만, 이 옵션은 향후 특정 시점에 제거될 수 있습니다. (Mark Dickinson이 bpo-45569 을 통해 기여함.)

C API 변경 사항

새로운 기능

Python 3.11로 이식

  • 매크로의 문제점(<https://gcc.gnu.org/onlinedocs/cpp/Macro-Pitfalls.html>)을 피하기 위해 일부 매크로를 정적 인라인 함수로 변환했습니다. 대체된 함수들이 정적 타입 검사로 인한 컴파일러 경고를 방지하기 위해 인수를 예상되는 유형으로 캐스팅하므로, 이 변경 사항은 사용자에게 거의 투명하게 적용됩니다. 하지만 제한된 C API가 >=3.11로 설정된 경우 이러한 캐스팅이 수행되지 않으므로 호출자가 인수를 예상되는 유형으로 직접 캐스트해야 합니다. 자세한 내용은 PEP 670 을 참조하십시오. (Victor Stinner와 Erlend E. Aasland가 gh-89653 에서 기여함.)

  • PyErr_SetExcInfo() 는 더 이상 typetraceback 인수를 사용하지 않으며, 인터프리터가 이제 해당 값들을 예외 인스턴스(value 인자)로부터 도출합니다. 이 함수는 여전히 세 인자 모두에 대한 참조를 가로챕니다. (Irit Katriel이 bpo-45711 에서 기여함.)

  • PyErr_GetExcInfo() 는 이제 결과의 typetraceback 필드를 예외 인스턴스(value 필드)로부터 도출합니다. (Irit Katriel이 bpo-45711 에서 기여함.)

  • _frozen 은 frozen 모듈이 패키지인지 여부를 나타내는 새로운 is_package 필드를 갖습니다. 이전에는 size 필드의 음수 값이 이를 나타냈으나, 이제는 size 에 비음수 값만 사용됩니다. (Kumar Aditya가 bpo-46608 에서 기여함.)

  • _PyFrameEvalFunction() 은 이제 두 번째 파라미터로 PyFrameObject* 대신 _PyInterpreterFrame* 를 받습니다. 이 함수 포인터 유형의 사용법에 대한 자세한 내용은 PEP 523 을 참조하십시오.

  • PyCode_New()PyCode_NewWithPosOnlyArgs`는 이제 추가적인 ``exception_table`() 인자를 받습니다. 가능하면 이 함수들의 사용을 피해야 합니다. 커스텀 코드 객체를 얻으려면 컴파일러를 사용하여 코드 객체를 생성한 다음, replace 메서드를 통해 수정된 버전을 얻으십시오.

  • PyCodeObject 는 더 이상 co_code, co_varnames, co_cellvarsco_freevars 필드를 포함하지 않습니다. 대신 C API를 통해 이들에 접근하려면 각각 PyCode_GetCode(), PyCode_GetVarnames(), PyCode_GetCellvars()PyCode_GetFreevars() 를 사용하십시오. (Brandt Bucher가 bpo-46841, Ken Jin이 gh-92154, gh-94936 에서 기여함.)

  • 기존 trashcan 매크로(Py_TRASHCAN_SAFE_BEGIN/Py_TRASHCAN_SAFE_END)는 이제 폐지되었습니다. 이들은 새로운 매크로인 Py_TRASHCAN_BEGINPy_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 은 해당 매크로가 포함된 할당 해제 함수여야 하는 두 번째 인수를 가진다는 점에 유의하십시오.

    동일한 코드베이스에서 이전 파이썬 버전을 지원하려면 다음 매크로를 정의하고 전체 코드에서 사용할 수 있습니다(출처: 이들은 mypy 코드베이스에서 복사되었습니다:

    #if PY_VERSION_HEX >= 0x03080000
    #  define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc)
    #  define CPy_TRASHCAN_END(op) Py_TRASHCAN_END
    #else
    #  define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op)
    #  define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op)
    #endif
    
  • PyType_Ready() 함수는 이제 타입이 Py_TPFLAGS_HAVE_GC 플래그가 설정된 상태에서 traverse 함수(PyTypeObject.tp_traverse)가 없는 경우 오류를 발생시킵니다. (Victor Stinner가 bpo-44263 에서 기여함.)

  • Py_TPFLAGS_IMMUTABLETYPE 플래그를 가진 Heap 타입은 이제 PEP 590 vectorcall 프로토콜을 상속할 수 있습니다. 이전에는 이 기능이 정적 타입 에서만 가능했습니다. (Erlend E. Aasland가 bpo-43908 에서 기여함)

  • Py_TYPE() 이 인라인 정적 함수로 변경됨에 따라, Py_TYPE(obj) = new_typePy_SET_TYPE(obj, new_type) 으로 교체되어야 합니다. Py_SET_TYPE() 함수를 참조하십시오 (파이썬 3.9부터 사용 가능). 하위 호환성을 위해 이 매크로를 사용할 수 있습니다:

    #if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE)
    static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type)
    { ob->ob_type = type; }
    #define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type)
    #endif
    

    (Victor Stinner가 bpo-39573 을 통해 기여함.)

  • Py_SIZE() 가 인라인 정적 함수로 변경됨에 따라, Py_SIZE(obj) = new_sizePy_SET_SIZE(obj, new_size) 로 교체되어야 합니다. Py_SET_SIZE() 함수를 참조하십시오 (파이썬 3.9부터 사용 가능). 하위 호환성을 위해 이 매크로를 사용할 수 있습니다:

    #if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE)
    static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size)
    { ob->ob_size = size; }
    #define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size)
    #endif
    

    (Victor Stinner가 bpo-39573 을 통해 기여함.)

  • Py_LIMITED_API 매크로가 0x030b0000 (파이썬 3.11) 이상으로 설정된 경우, <Python.h> 는 더 이상 <stdlib.h>, <stdio.h>, <errno.h><string.h> 헤더 파일을 포함하지 않습니다. C 확장은 #include <Python.h> ` 뒤에 해당 헤더 파일들을 명시적으로 포함해야 합니다. (Victor Stinner가 bpo-45434 에서 기여함.)

  • 제한되지 않은 API 파일인 cellobject.h, classobject.h, code.h, context.h, funcobject.h, genobject.hlongintrepr.hInclude/cpython 디렉토리로 이동되었습니다. 또한, eval.h 헤더 파일이 제거되었습니다. 이 파일들은 Python.h 에 이미 포함되어 있으므로 직접 포함해서는 안 됩니다: 포함 파일. 만약 이를 직접 포함했다면 대신 Python.h 를 포함하는 것을 고려하십시오. (Victor Stinner가 bpo-35134 에서 기여함.)

  • PyUnicode_CHECK_INTERNED() 매크로가 제한된 C API에서 제외되었습니다. 이 기능은 제한된 C API에서 사용할 수 없는 내부 구조를 사용했기 때문입니다. (Victor Stinner가 bpo-46007 에서 기여함.)

  • The following frame functions and type are now directly available with #include <Python.h>, it’s no longer needed to add #include <frameobject.h>:

    (Victor Stinner가 gh-93937 에서 기여함.)

  • PyFrameObject 구조체 멤버가 공개 C API에서 제거되었습니다.

    문서에 언급된 바와 같이 PyFrameObject 필드는 언제든 변경될 수 있지만, 오랫동안 안정적으로 유지되었으며 여러 인기 있는 확장 프로그램에서 사용되어 왔습니다.

    파이썬 3.11에서 성능 최적화를 위해 프레임 구조가 재조직되었습니다. 일부 필드는 이전 구현의 세부 사항이었으므로 완전히 제거되었습니다.

    PyFrameObject 필드:

    • f_back: PyFrame_GetBack() 을 사용하십시오.

    • f_blockstack: 제거됨.

    • f_builtins: PyFrame_GetBuiltins() 를 사용하십시오.

    • f_code: PyFrame_GetCode() 를 사용하십시오.

    • f_gen: PyFrame_GetGenerator() 를 사용하십시오.

    • f_globals: PyFrame_GetGlobals() 를 사용하십시오.

    • f_iblock: 제거됨.

    • f_lasti: PyFrame_GetLasti() 를 사용하십시오. f_lastiPyCode_Addr2Line() 을 사용하는 코드는 대신 PyFrame_GetLineNumber() 를 사용해야 합니다. 이 방식이 더 빠를 수 있습니다.

    • f_lineno: PyFrame_GetLineNumber() 사용

    • f_locals: PyFrame_GetLocals() 를 사용하십시오.

    • f_stackdepth: 제거됨.

    • f_state: 공개 API 없음 (f_frame.f_state 로 이름 변경).

    • f_trace: 공개 API 없음.

    • f_trace_lines: PyObject_GetAttrString((PyObject*)frame, "f_trace_lines") 를 사용하십시오.

    • f_trace_opcodes: PyObject_GetAttrString((PyObject*)frame, "f_trace_opcodes") 를 사용하십시오.

    • f_localsplus: 공개 API 없음 (f_frame.localsplus 로 이름 변경).

    • f_valuestack: 제거됨.

    Python 프레임 객체가 이제 지연 생성됩니다. 이로 인한 부작용으로 f_back 멤버도 현재는 지연 계산되므로 직접 액세스해서는 안 됩니다. 대신 PyFrame_GetBack() 함수를 호출해야 합니다.

    f_locals 에 직접 액세스하던 디버거는 이제 반드시 PyFrame_GetLocals() 를 호출해야 합니다. 이들은 더 이상 PyFrame_FastToLocalsWithError()PyFrame_LocalsToFast() 를 호출할 필요가 없으며, 실제로 해당 함수들을 호출해서도 안 됩니다. 프레임의 필요한 업데이트는 이제 가상 머신에서 관리합니다.

    Python 3.8 이하 버전에서 PyFrame_GetCode() 를 정의하는 코드:

    #if PY_VERSION_HEX < 0x030900B1
    static inline PyCodeObject* PyFrame_GetCode(PyFrameObject *frame)
    {
        Py_INCREF(frame->f_code);
        return frame->f_code;
    }
    #endif
    

    Python 3.8 이하 버전에서 PyFrame_GetBack() 을 정의하는 코드:

    #if PY_VERSION_HEX < 0x030900B1
    static inline PyFrameObject* PyFrame_GetBack(PyFrameObject *frame)
    {
        Py_XINCREF(frame->f_back);
        return frame->f_back;
    }
    #endif
    

    또는 pythoncapi_compat project\를 사용하여 이 두 함수를 이전 버전의 파이썬에서 가져올 수 있습니다.

  • PyThreadState 구조체 멤버의 변경 사항:

    파이썬 3.8 및 이전 버전에서 PyThreadState_GetFrame() 을 정의하는 코드:

    #if PY_VERSION_HEX < 0x030900B1
    static inline PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate)
    {
        Py_XINCREF(tstate->frame);
        return tstate->frame;
    }
    #endif
    

    파이썬 3.10 및 이전 버전에서 PyThreadState_EnterTracing()PyThreadState_LeaveTracing() 을 정의하는 코드:

    #if PY_VERSION_HEX < 0x030B00A2
    static inline void PyThreadState_EnterTracing(PyThreadState *tstate)
    {
        tstate->tracing++;
    #if PY_VERSION_HEX >= 0x030A00A1
        tstate->cframe->use_tracing = 0;
    #else
        tstate->use_tracing = 0;
    #endif
    }
    
    static inline void PyThreadState_LeaveTracing(PyThreadState *tstate)
    {
        int use_tracing = (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL);
        tstate->tracing--;
    #if PY_VERSION_HEX >= 0x030A00A1
        tstate->cframe->use_tracing = use_tracing;
    #else
        tstate->use_tracing = use_tracing;
    #endif
    }
    #endif
    

    또는 the pythoncapi-compat project\를 사용하여 이전 버전의 함수에서 이 함수들을 가져오십시오.

  • 배포자는 최적화된 Blake2 라이브러리인 libb2 를 사용하여 파이썬을 빌드할 것을 권장합니다.

  • PyConfig.module_search_paths_set 필드는 이제 초기화 시 PyConfig.module_search_paths 를 사용하여 sys.path 를 초기화하려면 1로 설정되어야 합니다. 그렇지 않으면, 초기화 과정에서 경로를 다시 계산하고 module_search_paths 에 추가된 모든 값을 대체하게 됩니다.

  • PyConfig_Read() 는 더 이상 초기 검색 경로를 계산하지 않으며, PyConfig.module_search_paths 에 아무런 값도 채우지 않습니다. 기본 경로를 계산한 후 수정하려면 초기화를 완료하고 PySys_GetObject() 를 사용하여 sys.path 를 파이썬 리스트 객체로 가져와 직접 수정하십시오.

폐지됨

  • 파이썬 초기화 구성을 설정하는 다음 함수들을 폐지합니다:

    • PySys_AddWarnOptionUnicode()

    • PySys_AddWarnOption()

    • PySys_AddXOption()

    • PySys_HasWarnOptions()

    • PySys_SetArgvEx()

    • PySys_SetArgv()

    • PySys_SetPath()

    • Py_SetPath()

    • Py_SetProgramName()

    • Py_SetPythonHome()

    • Py_SetStandardStreamEncoding()

    • _Py_SetProgramFullPath()

    대신 파이썬 초기화 구성 의 새로운 PyConfig API를 사용하십시오(PEP 587). (Victor Stinner가 gh-88279 에서 기여함.)

  • PyBytesObjectob_shash 멤버를 폐지합니다. 대신 PyObject_Hash() 을 사용하십시오. (Inada Naoki가 bpo-46864 에서 기여함.)

Python 3.12에서 제거 예정인 기능들

다음 C API들은 이전 파이썬 버전에서 폐지되었으며, 파이썬 3.12에서 제거될 예정입니다.

  • PyUnicode_AS_DATA()

  • PyUnicode_AS_UNICODE()

  • PyUnicode_AsUnicodeAndSize()

  • PyUnicode_AsUnicode()

  • PyUnicode_FromUnicode()

  • PyUnicode_GET_DATA_SIZE()

  • PyUnicode_GET_SIZE()

  • PyUnicode_GetSize()

  • PyUnicode_IS_COMPACT()

  • PyUnicode_IS_READY()

  • PyUnicode_READY()

  • PyUnicode_WSTR_LENGTH()

  • _PyUnicode_AsUnicode()

  • PyUnicode_WCHAR_KIND

  • PyUnicodeObject

  • PyUnicode_InternImmortal()

제거됨

  • PyFrame_BlockSetup()PyFrame_BlockPop() 이 제거되었습니다. (Mark Shannon이 bpo-40222 에서 기여함.)

  • errno 변수를 사용하는 다음 수학 매크로를 제거합니다:

    • Py_ADJUST_ERANGE1()

    • Py_ADJUST_ERANGE2()

    • Py_OVERFLOWED()

    • Py_SET_ERANGE_IF_OVERFLOW()

    • Py_SET_ERRNO_ON_MATH_ERROR()

    (Victor Stinner가 bpo-45412 에서 기여함.)

  • 파이썬 3.3부터 폐지된 Py_UNICODE_COPYPy_UNICODE_FILL 매크로를 제거합니다. 대신 PyUnicode_CopyCharacters() 또는 memcpy() (wchar_t* 문자열), 그리고 PyUnicode_Fill() 함수를 사용하십시오. (Victor Stinner가 bpo-41123 에서 기여함.)

  • pystrhex.h 헤더 파일을 제거합니다. 이 파일은 비공개 함수만 포함하고 있습니다. C 확장 프로그램은 기본적으로 <Python.h> 헤더 파일만 포함해야 합니다. (Victor Stinner가 bpo-45434 에서 기여함.)

  • Py_FORCE_DOUBLE() 매크로를 제거합니다. 이 매크로는 Py_IS_INFINITY() 매크로에 의해 사용되었습니다. (Victor Stinner가 bpo-45440 에서 기여함.)

  • Py_LIMITED_API 가 정의된 경우 다음 항목들을 더 이상 사용할 수 없습니다:

    이들은 제한된 API 의 일부가 아닙니다.

    (Victor Stinner가 bpo-45474 에서 기여함.)

  • PyWeakref_GET_OBJECT() 를 제한된 C API에서 제외합니다. 이는 제한된 C API에서 PyWeakReference 구조가 불투명(opaque)하기 때문에 작동한 적이 없었습니다. (Victor Stinner가 bpo-35134 에서 기여함.)

  • PyHeapType_GET_MEMBERS() 매크로를 제거합니다. 이 매크로는 실수로 공개 C API에 노출되었으며, 파이썬 내부에서만 사용되어야 합니다. 대신 PyTypeObject.tp_members 멤버를 사용하십시오. (Victor Stinner가 bpo-40170 에서 기여함.)

  • HAVE_PY_SET_53BIT_PRECISION 매크로를 제거합니다(내부 C API로 이동). (Victor Stinner가 bpo-45412 에서 기여함.)

  • Py_UNICODE 인코더 API를 제거합니다. 이들은 파이썬 3.3부터 폐지되었으며, 거의 사용되지 않고 권장되는 대체 방식에 비해 비효율적입니다.

    제거된 함수는 다음과 같습니다:

    • PyUnicode_Encode()

    • PyUnicode_EncodeASCII()

    • PyUnicode_EncodeLatin1()

    • PyUnicode_EncodeUTF7()

    • PyUnicode_EncodeUTF8()

    • PyUnicode_EncodeUTF16()

    • PyUnicode_EncodeUTF32()

    • PyUnicode_EncodeUnicodeEscape()

    • PyUnicode_EncodeRawUnicodeEscape()

    • PyUnicode_EncodeCharmap()

    • PyUnicode_TranslateCharmap()

    • PyUnicode_EncodeDecimal()

    • PyUnicode_TransformDecimalToASCII()

    자세한 내용은 PEP 624마이그레이션 가이드 를 참조하십시오. (Inada Naoki가 bpo-44029 에서 기여함.)

3.11.4의 주요 변경 사항

타르파일

  • tarfile 의 추출 메서드와 shutil.unpack_archive() 에 대상 디렉터리 외부에 파일을 생성하는 등 예상치 못한 동작이나 위험한 tar 기능을 제한할 수 있는 새로운 filter 인수가 추가되었습니다. 자세한 내용은 추출 필터 를 참조하십시오. Python 3.12부터는 filter 인수 없이 사용하는 경우 DeprecationWarning 이 표시됩니다. Python 3.14에서는 기본값이 'data' 로 변경됩니다. (Petr Viktorin이 PEP 706 에서 기여).

3.11.5의 주요 변경 사항

OpenSSL

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

분실물 보관소