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 을 참조하십시오.
새로운 문법 기능:
새로운 내장 기능:
새로운 표준 라이브러리 모듈:
인터프리터 개선 사항:
New
-Pcommand line option andPYTHONSAFEPATHenvironment variable to disable automatically prepending potentially unsafe paths tosys.path
새로운 타이핑 기능:
중요한 폐지, 제거 및 제한 사항:
PEP 594: 많은 레거시 표준 라이브러리 모듈이 폐지되었으며 Python 3.13에서 제거될 예정입니다.
새로운 기능¶
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 와 소스 코드 위치를 연관 지을 수 있습니다. 이 정보는 다음을 사용하여 가져올 수 있습니다.
파이썬의
codeobject.co_positions()메서드.C API의
PyCode_Addr2Location()함수.
자세한 내용은 PEP 657 을 참조하십시오. (Pablo Galindo, Batuhan Taskaya, Ammar Askar가 bpo-43950 에서 기여함.)
참고
이 기능은 코드 객체 에 열 위치를 저장해야 하므로 인터프리터 메모리 사용량과 컴파일된 파이썬 파일의 디스크 사용량이 약간 증가할 수 있습니다. 추가 정보를 저장하지 않고 트레이스백 정보 출력을 비활성화하려면 -X no_debug_ranges 명령줄 옵션이나 PYTHONNODEBUGRANGES 환경 변수를 사용하십시오.
PEP 654: 예외 그룹 및 except*¶
PEP 654 는 프로그램이 여러 개의 서로 관련 없는 예외를 동시에 발생시키고 처리할 수 있게 하는 언어 기능을 도입합니다. 내장 타입인 ExceptionGroup 및 BaseExceptionGroup 을 통해 예외를 그룹화하여 함께 발생시킬 수 있으며, 새로운 except* 구문은 예외 그룹의 하위 그룹과 일치하도록 except 를 일반화합니다.
자세한 내용은 PEP 654 을 참조하십시오.
(Irit Katriel이 bpo-45292 에서 기여함. PEP는 Irit Katriel, Yury Selivanov, Guido van Rossum이 작성함.)
PEP 678: 예외에 노트 추가 가능¶
BaseException 에 add_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 접미사는 이제
이외의 언어 변경 사항¶
별표(*)가 포함된 언패킹 표현식을 이제
for문에서 사용할 수 있습니다. (자세한 내용은 bpo-46725 를 참조하십시오.)비동기 함수 내의 컴프리헨션 안에서 비동기 컴프리헨션 을 사용할 수 있습니다. 이 경우 바깥쪽 컴프리헨션은 암시적으로 비동기가 됩니다. (Serhiy Storchaka가 bpo-33346 에서 기여함.)
객체가 context manager 프로토콜을 지원하지 않는 경우
with문과contextlib.ExitStack.enter_context()에서, 그리고 객체가 asynchronous context manager 프로토콜을 지원하지 않는 경우async with문과contextlib.AsyncExitStack.enter_async_context()에서AttributeError대신TypeError가 발생합니다. (Serhiy Storchaka가 bpo-12022 및 bpo-44471 을 통해 기여함.)__getstate__()메서드의 기본 구현을 제공하는object.__getstate__()가 추가되었습니다. 이제 내장 타입인bytearray,set,frozenset,collections.OrderedDict,collections.deque,weakref.WeakSet, 그리고datetime.tzinfo의 하위 클래스 인스턴스를copy하거나pickle할 때, slots 로 구현된 인스턴스 속성들이 복사 및 피클링됩니다. 이 변경사항은 의도치 않은 부작용이 있습니다:object.__getstate__()가 존재하는 것을 예상하지 못한 소수의 기존 Python 프로젝트에서 문제가 발생할 수 있습니다. 해당 코드가 필요로 하는 해결 방안에 대한 논의는 gh-70766 의 후반부 주석을 참조하십시오. (Serhiy Storchaka가 bpo-26579 를 통해 기여함.)
스크립트를 실행할 때 스크립트 디렉터리나,
-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이 출시될 때까지 아무도 알아차리지 못했습니다. 또한,str과bytes키가 혼재하는 상황에서-b와sys.path_importer_cache사이의 상호작용으로 인해 지원을 다시 도입하는 것은 문제가 될 수 있습니다. (Thomas Grainger가 gh-91181 을 통해 기여함.)
기타 CPython 구현 변경 사항¶
complex를 위한__complex__()와bytes를 위한__bytes__()특수 메서드가 구현되어typing.SupportsComplex및typing.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_type과exc_traceback은exc_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(십진수))에서
int와str간의 변환 시, 문자열 형태의 자릿수가 제한을 초과하면 알고리즘 복잡도로 인한 잠재적인 서비스 거부(DoS) 공격을 방지하기 위해ValueError를 발생시킵니다. 이는 CVE 2020-10735 에 대한 완화 조치입니다. 이 제한은 환경 변수, 명령줄 플래그 또는sysAPI를 통해 설정하거나 비활성화할 수 있습니다. 자세한 내용은 정수 문자열 변환 길이 제한 문서를 참조하십시오. 기본 제한은 문자열 형태에서 4300자입니다.
새로운 모듈¶
개선된 모듈¶
asyncio¶
종료 시 모든 작업을 기다리는 작업 그룹을 보유하는 비동기 컨텍스트 관리자 인
TaskGroup클래스가 추가되었습니다. 새로운 코드를 작성할 때는create_task()나gather()를 직접 사용하는 것보다 이 클래스를 사용하는 것이 권장됩니다. (Yury Selivanov 등이 gh-90908 을 통해 기여함.)Added
timeout(), an asynchronous context manager for setting a timeout on asynchronous operations. For new code this is recommended over usingwait_for()directly. (Contributed by Andrew Svetlov in gh-90927.)run()에서 사용되는 메커니즘을 노출하는Runner클래스가 추가되었습니다. (Andrew Svetlov가 gh-91218 을 통해 기여함.)asyncio 라이브러리의 동기화 기본 요소에
Barrier클래스와 관련된BrokenBarrierError예외가 추가되었습니다. (Yves Duprat와 Andrew Svetlov가 gh-87518 을 통해 기여함.)asyncio.loop.create_connection()에 키워드 인자 all_errors 를 추가하여 여러 개의 연결 오류가ExceptionGroup으로 발생할 수 있도록 했습니다.Added the
asyncio.StreamWriter.start_tls()method for upgrading existing stream-based connections to TLS. (Contributed by Ian Good in bpo-34975.)이벤트 루프에 원시 데이터그램 소켓 기능인
sock_sendto(),sock_recvfrom(), 그리고sock_recvfrom_into()가 추가되었습니다. 이들은SelectorEventLoop와ProactorEventLoop에서 구현됩니다. (Alex Grönholm이 bpo-46805 를 통해 기여함.)Task에cancelling()및uncancel()메서드가 추가되었습니다. 이들은 주로 내부용으로 설계되었으며, 특히TaskGroup에서 사용됩니다.
contextlib¶
dataclasses¶
datetime¶
Add
datetime.UTC, a convenience alias fordatetime.timezone.utc. (Contributed by Kabir Kwatra in gh-91973.)datetime.date.fromisoformat(),datetime.time.fromisoformat(), 그리고datetime.datetime.fromisoformat()을 사용하여 대부분의 ISO 8601 형식을 파싱할 수 있습니다(단, 소수점 단위 시간이나 분을 지원하는 형식은 제외). (Paul Ganssle가 gh-80010 을 통해 기여함.)
enum¶
EnumMeta를EnumType으로 이름을 변경했습니다. (EnumMeta는 별칭으로 유지됩니다.)멤버를 문자열로 사용할 수 있고(반드시 문자열이어야 함)인
StrEnum을 추가했습니다.Added
ReprEnum, which only modifies the__repr__()of members while returning their literal values (rather than names) for__str__()and__format__()(used bystr(),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.RegexFlag의ASCII멤버를'RegexFlag.ASCII'대신're.ASCII'로 표시합니다.Flag을 강화하여 멤버에 대한len(), 반복(iteration), 그리고in/not in연산을 지원합니다. 예를 들어, 이제len(AFlag(3)) == 2 and list(AFlag(3)) == (AFlag.ONE, AFlag.TWO)가 작동합니다.Enum및Flag의 멤버가 이제__init_subclass__()호출 전에 정의되도록 변경되었습니다. 이제dir()은 믹스인(mixed-in) 데이터 타입의 메서드 등을 포함합니다.Flag`이 복합 값(``3`,6,10등)은 별칭으로 간주하고 기본값(2의 거듭제곱)만 표준으로 인식하도록 변경되었습니다. 반전된 플래그는 양수와 동일한 값으로 변환됩니다.
fcntl¶
FreeBSD에서
F_DUP2FD`와 :data:!F_DUP2FD_CLOEXEC` 플래그를 각각 지원하며, 전자는dup2사용과 동일하고 후자는 추가로FD_CLOEXEC플래그를 설정합니다.
fractions¶
functools¶
@functools.singledispatch가 이제 디스패치 인자에 대한 어노테이션으로types.UnionType및typing.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¶
inspect 메듈¶
디스크립터 프로토콜을 통한 동적 조회를 트리거하지 않고 모든 멤버를 반환하는
getmembers_static()를 추가했습니다. (Weipeng Hong이 bpo-30533 에서 기여함.)객체의 형이
MethodWrapperType인지 확인하는ismethodwrapper()를 추가했습니다. (Hakan Çelik이 bpo-29418 에서 기여함.)inspect모듈의 프레임 관련 함수들이 확장된 PEP 657 위치 정보(종료 라인 번호, 열 및 종료 열)를 포함하는 새로운FrameInfo및Traceback클래스 인스턴스를 반환하도록 변경되었습니다(이전의 named tuple 스타일 인터페이스와 하위 호환성이 유지됩니다). 영향을 받는 함수들은 다음과 같습니다:(Pablo Galindo가 gh-88116 에서 기여함.)
locale¶
현재 로케일 인코딩을 가져오는
locale.getencoding()을 추가했습니다. 이는locale.getpreferredencoding(False)와 유사하지만 Python UTF-8 Mode 를 무시합니다.
logging 모듈¶
로깅 레벨 이름(예:
'CRITICAL')을 해당 로깅 수준 값(예: 기본값50)으로 매핑하는getLevelNamesMapping()을 추가했습니다. (Andrei Kulakovin이 gh-88024 에서 기여함.)SysLogHandler에SocketHandler.createSocket()와 일치하도록createSocket()메서드를 추가했습니다. 이 메서드는 핸들러 초기화 시 및 이벤트 발생 시 활성 소켓이 없는 경우 자동으로 호출됩니다. (Kirill Pinchuk가 gh-88457 에서 기여함.)
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¶
set_authorizer()에None을 전달하여 이제 인증자(authorizer)를 비활성화할 수 있습니다. (Erlend E. Aasland가 bpo-44491 에서 기여함.)create_collation()의 정렬(Collation) 이름에 이제 어떤 유니코드 문자도 포함될 수 있습니다. 잘못된 문자가 포함된 정렬 이름은 이제sqlite3.ProgrammingError대신UnicodeEncodeError를 발생시킵니다. (Erlend E. Aasland가 bpo-44688 에서 기여함.)sqlite3예외에 이제 SQLite 확장 오류 코드가sqlite_errorcode로, SQLite 오류 이름이sqlite_errorname으로 포함됩니다. (Aviv Palivoda, Daniel Shahaf 및 Erlend E. Aasland가 bpo-16379 와 bpo-24139 에서 기여함.)연결 기반으로 SQLite 제한을 설정하고 가져오기 위해
sqlite3.Connection에setlimit()및getlimit()을 추가했습니다. (Erlend E. Aasland가 bpo-45243 에서 기여함.)sqlite3가 이제 하부 SQLite 라이브러리가 빌드된 기본 스레딩 모드에 따라sqlite3.threadsafety를 설정합니다. (Erlend E. Aasland가 bpo-45613 에서 기여함.)sqlite3C 콜백은 이제 콜백 추적 정보(traceback)가 활성화된 경우 발생시키기 불가능한 예외를 사용합니다. 사용자는 이제 디버깅 경험을 개선하기 위해unraisable hook handler을 등록할 수 있습니다. (Erlend E. Aasland가 bpo-45828 에서 기여함.)롤백 시 Fetch가 더 이상
InterfaceError를 발생시키지 않습니다. 대신 이러한 사례는 SQLite 라이브러리에서 처리하도록 맡깁니다. (Erlend E. Aasland가 bpo-44092 에서 기여함.)데이터베이스 직렬화 및 역직렬화를 위해
sqlite3.Connection에serialize()및deserialize()를 추가했습니다. (Erlend E. Aasland가 bpo-41930 에서 기여함.)집계 윈도우 함수를 생성하기 위해
sqlite3.Connection에create_window_function()을 추가했습니다. (Erlend E. Aasland가 bpo-34916 에서 기여함.)sqlite3.Connection에blobopen()을 추가했습니다.sqlite3.Blob은 블롭(blob)에 대한 점진적 I/O 작업을 지원합니다. (Aviv Palivoda 및 Erlend E. Aasland가 bpo-24905 에서 기여함.)
문자열¶
string.Template에 각각 유효한 모든 자리표시자와 유효하지 않은 자리표시자의 존재 여부를 반환하는get_identifiers()및is_valid()를 추가했습니다. (Ben Kehoe가 gh-90465 에서 기여함.)
sys¶
sys.exc_info()가 이제value(예외 인스턴스)로부터type및traceback필드를 도출합니다. 따라서 예외가 처리되는 동안 수정되면 그 변경 사항이 이후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 doesvenv. (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¶
TestCase클래스의enterContext()및enterClassContext()메서드,IsolatedAsyncioTestCase클래스의enterAsyncContext()메서드 및unittest.enterModuleContext()함수를 추가했습니다. (Contributed by Serhiy Storchaka in bpo-45046.)
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.Path에stem,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가 추가로 도왔습니다.)
연산 |
형태 |
특수화 |
연산 속도 향상 (최대) |
기여도 |
|---|---|---|---|---|
이항 연산 |
|
|
10% |
Mark Shannon, Donghee Na, Brandt Bucher, Dennis Sweeney |
서브스크립트 |
|
사용자 정의 |
10-25% |
Irit Katriel, Mark Shannon |
서브스크립트 저장 |
|
위의 서브스크립팅 특수화와 유사합니다. |
10-25% |
Dennis Sweeney |
호출 |
|
|
20% |
Mark Shannon, Ken Jin |
전역 변수 로드 |
|
globals/builtins 네임스페이스에서 객체의 인덱스가 캐시됩니다. 따라서 전역 변수 및 내장 함수를 로드할 때 네임스페이스 조회가 필요하지 않습니다. |
Mark Shannon |
|
어트리뷰트 로드 |
|
전역 변수 로드와 유사합니다. 클래스/객체 네임스페이스 내의 어트리뷰트 인덱스가 캐시됩니다. 대부분의 경우 어트리뷰트 로드 시 네임스페이스 조회가 필요하지 않습니다. |
Mark Shannon |
|
호출을 위한 메서드 로드 |
|
메서드의 실제 주소가 캐시됩니다. 이제 긴 상속 체인을 가진 클래스를 포함하여 메서드 로드 시 네임스페이스 조회가 발생하지 않습니다. |
10-20% |
Ken Jin, Mark Shannon |
어트리뷰트 저장 |
|
어트리뷰트 로드 최적화와 유사합니다. |
pyperformance에서 2% |
Mark Shannon |
시퀀스 언팩 |
|
8% |
Brandt Bucher |
기타¶
객체 네임스페이스가 지연 생성됨에 따라 객체가 사용하는 메모리가 줄어들었습니다. 이제 네임스페이스 딕셔너리들도 키를 더 자유롭게 공유합니다. (Mark Shannon이 bpo-45340 및 bpo-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¶
제너레이터 및 코루틴에서 사용되는
ASYNC_GEN_WRAP,RETURN_GENERATOR,SEND.클로저를 위해 호출 측의 특별한 코드가 필요하지 않게 하는
COPY_FREE_VARS.인터럽트 처리가 바람직하지 않은 특정 루프에서 사용되는
JUMP_BACKWARD_NO_INTERRUPT.PEP 654 에서 추가된 새로운 예외 그룹 및 except* 를 처리하기 위한
CHECK_EG_MATCH및PREP_RERAISE_STAR.예외 처리기에서 사용되는
PUSH_EXC_INFO.내부 추적, 디버깅 및 최적화 확인을 위한 no-op인
RESUME.
교체된 opcode¶
교체된 opcode(들) |
새로운 opcode(들) |
참고 사항 |
|---|---|---|
BINARY_*INPLACE_* |
모든 숫자형 이항/인플레이스 opcode를 단일 opcode로 교체 |
|
CALL_FUNCTIONCALL_FUNCTION_KWCALL_METHOD |
메서드의 인자 이동을 키워드 인자 처리와 분리하여, 호출에 대한 더 나은 특수화가 가능하도록 함 |
|
DUP_TOPDUP_TOP_TWOROT_TWOROT_THREEROT_FOURROT_N |
스택 조작 명령 |
|
JUMP_IF_NOT_EXC_MATCH |
이제 검사를 수행하지만 점프하지 않음 |
|
JUMP_ABSOLUTEPOP_JUMP_IF_FALSEPOP_JUMP_IF_TRUE |
See [3];
|
|
SETUP_WITHSETUP_ASYNC_WITH |
|
|
기존의 JUMP_IF_TRUE_OR_POP 및 JUMP_IF_FALSE_OR_POP 을 포함한 모든 점프 opcode가 이제 상대적입니다. 인자는 이제 절대 위치가 아니라 현재 명령으로부터의 오프셋입니다.
변경/제거된 opcode¶
MATCH_CLASS및MATCH_KEYS를 변경하여 성공/실패를 나타내기 위해 추가적인 불리언 값을 푸시하지 않도록 했습니다. 대신 실패 시 추출된 값의 튜플 대신None을 푸시합니다.예외와 상호작용하는 opcode를 변경하여, 이제 예외가 스택에서 세 항목이 아닌 하나의 항목으로 표현되는 것을 반영합니다(참조: gh-89874).
COPY_DICT_WITHOUT_KEYS,GEN_START,POP_BLOCK,SETUP_FINALLY및YIELD_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에서 제거될 예정입니다:
aifcchunkmsilibpipestelnetlibaudioopcryptnissndhdruucgiimghdrnntplibspwdxdrlibcgitbmailcapossaudiodevsunau(Brett Cannon이 bpo-47061 에서, Victor Stinner가 gh-68966 에서 기여했습니다.)
asynchat,asyncore및smtpd모듈은 최소 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 에서 기여했습니다.)TestCase및IsolatedAsyncioTestCase테스트 메서드에서 기본값인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모듈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.ImpImporterpkgutil.ImpLoaderpathlib.Path.link_to()sqlite3.enable_shared_cache()sqlite3.OptimizedUnicode()PYTHONTHREADDEBUG환경 변수unittest의 다음 폐지된 별칭들:폐지된 에일리어스
메서드 이름
사용 지원 중단 버전
failUnless3.1
failIf3.1
failUnlessEqual3.1
failIfEqual3.1
failUnlessAlmostEqual3.1
failIfAlmostEqual3.1
failUnlessRaises3.1
assert_3.2
assertEquals3.2
assertNotEquals3.2
assertAlmostEquals3.2
assertNotAlmostEquals3.2
assertRegexpMatches3.2
assertRaisesRegexp3.2
assertNotRegexpMatches3.5
제거됨¶
이 섹션은 Python 3.11에서 제거된 Python API 목록을 나열합니다.
제거된 C API는 별도로 나열되어 있습니다.
Removed the
@asyncio.coroutine()decorator enabling legacy generator-based coroutines to be compatible withasync/awaitcode. The function has been deprecated since Python 3.8 and the removal was initially scheduled for Python 3.10. Useasync definstead. (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에서 폐지된
distutils의bdist_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
gettextfunctionslgettext(),ldgettext(),lngettext()andldngettext(). Also removed thebind_textdomain_codeset()function, theNullTranslations.output_charset()andNullTranslations.set_output_charset()methods, and the codeset parameter oftranslation()andinstall(), since they are only used for thel*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.LocaleTextCalendar및calendar.LocaleHTMLCalendar클래스는 이제 로캘이 지정되지 않은 경우locale.getdefaultlocale()대신locale.getlocale()를 사용합니다. (Victor Stinner가 bpo-46659 을 통해 기여함.)pdb모듈은 이제.pdbrc설정 파일을'UTF-8'인코딩으로 읽습니다. (Srinivas Reddy Thatiparthy가 bpo-41137 을 통해 기여함.)random.sample()의 population 매개변수는 반드시 시퀀스여야 하며,set을list로 자동 변환하는 기능은 더 이상 지원되지 않습니다. 또한 샘플 크기가 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-lto에thin을 전달하여(즉,--with-lto=thin) ThinLTO 옵션으로 CPython을 빌드할 수 있습니다. (Donghee Na 및 Brett Holman이 bpo-44340 을 통해 기여함.)객체 구조체를 위한 Freelist를 이제 비활성화할 수 있습니다. 새로운 configure 옵션인
--without-freelists를 사용하여 빈 튜플 싱글렛을 제외한 모든 freelist를 비활성화할 수 있습니다. (Christian Heimes가 bpo-45522 을 통해 기여함.)Modules/Setup및Modules/makesetup이 개선되고 정리되었습니다. 이제 확장 모듈을makesetup을 통해 빌드할 수 있습니다. 일부 테스트 모듈을 제외한 모든 모듈을 메인 바이너리나 라이브러리에 정적으로 링크할 수 있습니다. (Brett Cannon 및 Christian Heimes가 bpo-45548, bpo-45570, bpo-45571, bpo-43974 를 통해 기여함.)참고
Tcl/Tk 헤더와 라이브러리의 위치를 수동으로 지정하려면 환경 변수
TCLTK_CFLAGS및TCLTK_LIBS`를 사용하십시오. :program:`configure옵션인--with-tcltk-includes`와 :option:!–with-tcltk-libs`는 제거되었습니다.RHEL 7 및 CentOS 7에서는 개발 패키지가
tcl.pc및tk.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.h의PYLONG_BITS_IN_DIGIT변수를 통해 명시적으로 15비트 숫자를 사용하도록 요청할 수 있지만, 이 옵션은 향후 특정 시점에 제거될 수 있습니다. (Mark Dickinson이 bpo-45569 을 통해 기여함.)
C API 변경 사항¶
새로운 기능¶
형의 짧은 이름을 가져오는 새로운
PyType_GetName()함수를 추가했습니다. (Hai Shi가 bpo-42035 를 통해 기여함.)형의 정규화된(qualified) 이름을 가져오는 새로운
PyType_GetQualName()함수를 추가했습니다. (Hai Shi가 bpo-42035 을 통해 기여함.)추적 및 프로파일링을 중단하고 재개하기 위해 제한된(limited) C API에 새로운
PyThreadState_EnterTracing()및PyThreadState_LeaveTracing()함수를 추가했습니다. (Victor Stinner가 bpo-43760 을 통해 기여함.)PY_VERSION_HEX와 동일한 값을 가지는Py_Version상수를 추가했습니다. (Gabriele N. Tornetta가 bpo-43931 을 통해 기여함.)Py_buffer및 관련 API가 이제 제한된(limited) API 및 안정적인 ABI의 일부입니다:bf_getbuffer및bf_releasebuffer타입 슬롯
(Christian Heimes가 bpo-45459 을 통해 기여함.)
이 정보가 직접(
PyCMethod를 통해) 사용 가능하지 않은 경우, 메서드가 정의된 모듈을 가져오는 데 사용되는PyType_GetModuleByDef()함수를 추가했습니다. (Petr Viktorin이 bpo-46613 을 통해 기여함.)C double을 패킹 및 언패킹(직렬화 및 역직렬화)하는 새로운 함수들을 추가했습니다:
PyFloat_Pack2(),PyFloat_Pack4(),PyFloat_Pack8(),PyFloat_Unpack2(),PyFloat_Unpack4()및PyFloat_Unpack8(). (Victor Stinner가 bpo-46906 에서 기여함.)프레임 객체 속성을 가져오는 새로운 함수들을 추가했습니다:
PyFrame_GetBuiltins(),PyFrame_GetGenerator(),PyFrame_GetGlobals(),PyFrame_GetLasti().활성 예외 인스턴스를 가져오고 설정하는 두 개의 새 함수를 추가했습니다:
PyErr_GetHandledException()및PyErr_SetHandledException(). 이들은 레거시 3-튜플 표현 방식의 예외와 호환되는PyErr_SetExcInfo()및PyErr_GetExcInfo()의 대안입니다. (Irit Katriel이 bpo-46343 에서 기여함.)PyConfig.safe_path멤버를 추가했습니다. (Victor Stinner가 gh-57684 에서 기여함.)
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()는 더 이상type및traceback인수를 사용하지 않으며, 인터프리터가 이제 해당 값들을 예외 인스턴스(value인자)로부터 도출합니다. 이 함수는 여전히 세 인자 모두에 대한 참조를 가로챕니다. (Irit Katriel이 bpo-45711 에서 기여함.)PyErr_GetExcInfo()는 이제 결과의type및traceback필드를 예외 인스턴스(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_cellvars및co_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_BEGIN및Py_TRASHCAN_END로 교체되어야 합니다.기존 매크로를 포함하는 tp_dealloc 함수는 다음과 같습니다:
static void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_SAFE_BEGIN(p); ... Py_TRASHCAN_SAFE_END }
다음과 같이 새로운 매크로로 전환해야 합니다:
static void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_BEGIN(p, mytype_dealloc) ... Py_TRASHCAN_END }
Py_TRASHCAN_BEGIN은 해당 매크로가 포함된 할당 해제 함수여야 하는 두 번째 인수를 가진다는 점에 유의하십시오.동일한 코드베이스에서 이전 파이썬 버전을 지원하려면 다음 매크로를 정의하고 전체 코드에서 사용할 수 있습니다(출처: 이들은
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_type은Py_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_size는Py_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.h및longintrepr.h가Include/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_lasti와PyCode_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구조체 멤버의 변경 사항:frame: 제거됨, 대신PyThreadState_GetFrame()을 사용하십시오(이 함수는 bpo-40429 에 의해 파이썬 3.9에 추가되었습니다). 경고: 이 함수는 strong reference 를 반환하므로,Py_XDECREF()를 호출해야 합니다.tracing: 변경됨, 대신PyThreadState_EnterTracing()및PyThreadState_LeaveTracing()을 사용하십시오(이 함수들은 bpo-43760 에 의해 파이썬 3.11에 추가되었습니다).recursion_depth: 제거됨, 대신(tstate->recursion_limit - tstate->recursion_remaining)를 사용하십시오.stackcheck_counter: 제거됨.
파이썬 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()
대신 파이썬 초기화 구성 의 새로운
PyConfigAPI를 사용하십시오(PEP 587). (Victor Stinner가 gh-88279 에서 기여함.)PyBytesObject의ob_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_WSTR_LENGTH()_PyUnicode_AsUnicode()PyUnicode_WCHAR_KINDPyUnicode_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_COPY및Py_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가 정의된 경우 다음 항목들을 더 이상 사용할 수 없습니다:Py_MARSHAL_VERSION매크로
이들은 제한된 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을 사용합니다.