Python 3.10

Python 3.10.0 (최종)은 2021년 10월 4일에 출시되었습니다. 3.10의 기능은 PEP 619 에 정의되어 있으며, 변경 사항에 대한 자세한 설명은 What’s New in Python 3.10 에서 확인할 수 있습니다.

새로운 구문 기능

상태

PEP 634

구조적 패턴 매칭: 명세

[1]

PEP 635

구조적 패턴 매칭: 동기와 근거

[1]

PEP 636

구조적 패턴 매칭: 튜토리얼

[1]

bpo-12782

괄호로 묶인 컨텍스트 관리자가 이제 공식적으로 허용됩니다

표준 라이브러리의 새로운 기능

PEP 618

zip에 선택적 길이 검사 추가

인터프리터 개선

PEP 626

디버깅 및 기타 도구를 위한 정확한 줄 번호

새로운 타이핑 기능

PEP 604

유니온 타입을 X | Y 형태로 작성 허용

PEP 613

명시적 타입 별칭

PEP 612

매개변수 명세 변수

중요한 사용 중단, 제거 또는 제한 사항

PEP 644

OpenSSL 1.1.1 이상 요구

PEP 632

distutils 모듈 사용 중단.

해당 없음

PEP 623

PyUnicodeObject의 wstr 멤버 제거를 위한 사용 중단 및 준비.

해당 없음

PEP 624

Py_UNICODE 인코더 API 제거

해당 없음

PEP 597

선택적 EncodingWarning 추가

기타 언어 변경 사항:

int 타입에 새로운 메서드 int.bit_count() 가 추가되어, 주어진 정수의 이진 전개에서 1의 개수(population count라고도 함)를 반환합니다.

dict.keys(), dict.values(), dict.items() 가 반환하는 뷰는 이제 모두 mapping 속성을 가지며, 이는 원본 딕셔너리를 감싸는 types.MappingProxyType 객체를 제공합니다.

PEP 618: zip() 함수에 이제 선택적 strict 플래그가 추가되어, 모든 이터러블의 길이가 동일하도록 요구하는 데 사용됩니다.

정수 인수를 받는 내장 함수와 확장 함수는 더 이상 Decimal, Fraction및 손실 없이는 정수로 변환할 수 없는 기타 객체(예: __int__() 메서드는 있지만 __index__() 메서드는 없는 객체)를 받지 않습니다.

object.__ipow__()NotImplemented 를 반환하면, 연산자는 예상대로 object.__pow__()object.__rpow__() 로 올바르게 폴백합니다.

할당 표현식을 이제 집합 리터럴과 집합 컴프리헨션 내에서, 그리고 시퀀스 인덱스(슬라이스는 제외)에서 괄호 없이 사용할 수 있습니다.

함수에 새로운 __builtins__ 속성이 추가되어, 함수가 실행될 때 __globals__['__builtins__'] 를 조회하는 대신 이 속성으로 내장 심볼을 찾습니다. 이 속성은 __globals__["__builtins__"] 가 존재하면 그것으로 초기화되며, 그렇지 않으면 현재 내장 객체로부터 초기화됩니다.

두 개의 새로운 내장 함수 aiter()anext() 가 추가되어, 각각 iter()next() 의 비동기 대응 함수를 제공합니다.

정적 메서드(@staticmethod)와 클래스 메서드(@classmethod)는 이제 메서드 속성(__module__, __name__, __qualname__, __doc__, __annotations__)을 상속하며 새로운 __wrapped__ 속성을 가집니다. 또한 정적 메서드는 이제 일반 함수처럼 호출할 수 있습니다.

복합 대상(PEP 526 에서 정의한 simple name 대상 이외의 모든 것)에 대한 어노테이션은 from __future__ import annotations 가 적용된 경우 더 이상 런타임 효과를 일으키지 않습니다.

클래스 및 모듈 객체는 이제 필요할 때 비어 있는 어노테이션 딕셔너리를 지연 생성합니다. 어노테이션 딕셔너리는 하위 호환성을 위해 객체의 __dict__ 에 저장됩니다. 이는 __annotations__ 작업에 대한 모범 사례를 개선합니다.

yield, yield from, await 또는 명명된 표현식으로 구성된 어노테이션은 부작용 때문에 이제 from __future__ import annotations 가 적용된 경우 금지됩니다.

바인딩되지 않은 변수, super() 및 어노테이션으로서 심볼 테이블 처리를 변경할 수 있는 기타 표현식의 사용은 이제 from __future__ import annotations 가 적용된 경우 효과가 없습니다.

float 타입과 decimal.Decimal 타입 모두의 NaN 값 해시는 이제 객체 식별성에 의존합니다. 이전에는 NaN 값들이 서로 같지 않음에도 불구하고 항상 0 으로 해시되었습니다. 이는 여러 NaN을 포함하는 딕셔너리와 집합을 생성할 때 과도한 해시 충돌로 인해 잠재적으로 이차 시간 복잡도의 런타임 동작을 유발했습니다.

__debug__ 상수를 삭제할 때 이제 (NameError 대신) SyntaxError 가 발생합니다.

SyntaxError 예외는 이제 end_linenoend_offset 속성을 가집니다. 결정되지 않은 경우 이들은 None 이 됩니다.

내장 모듈 변경 사항:

asyncio

누락된 connect_accepted_socket() 메서드를 추가합니다.

array

array.arrayindex() 메서드에 이제 선택적 startstop 매개변수가 추가되었습니다.

gc

gc.get_objects(), gc.get_referrers(), gc.get_referents() 에 대한 감사 후크를 추가합니다.

hashlib

hashlib 모듈은 OpenSSL 1.1.1 이상을 요구합니다.

hashlib 모듈은 OpenSSL 3.0.0에 대한 예비 지원을 갖추고 있습니다.

pbkdf2_hmac() 의 순수 Python 폴백은 사용 중단되었습니다. 향후 PBKDF2-HMAC는 Python이 OpenSSL 지원과 함께 빌드된 경우에만 사용할 수 있습니다.

os

VxWorks RTOS에 대한 os.cpu_count() 지원을 추가합니다.

Linux에서 eventfd2 시스템 콜을 감싸는 새로운 함수 os.eventfd() 와 관련 헬퍼를 추가합니다.

커널 주소 공간과 사용자 주소 공간 간의 복사 없이 두 파일 디스크립터 사이에서 데이터를 이동할 수 있는 os.splice() 를 추가합니다. 단, 파일 디스크립터 중 하나는 파이프를 가리켜야 합니다.

macOS용으로 O_EVTONLY, O_FSYNC, O_SYMLINK, O_NOFOLLOW_ANY 를 추가합니다.

platform

freedesktop.org os-release 표준 파일에서 운영 체제 식별 정보를 가져오는 platform.freedesktop_os_release() 를 추가합니다.

socket

socket.timeout 예외는 이제 TimeoutError 의 별칭입니다.

IPPROTO_MPTCP 로 MPTCP 소켓을 생성하는 옵션을 추가합니다.

서비스 유형(ToS) 또는 DSCP/ECN 필드를 수신하는 IP_RECVTOS 옵션을 추가합니다.

ssl

ssl 모듈은 OpenSSL 1.1.1 이상을 요구합니다.

ssl 모듈은 OpenSSL 3.0.0에 대한 예비 지원과 새로운 옵션 OP_IGNORE_UNEXPECTED_EOF 를 갖추고 있습니다.

사용 중단된 함수와 사용 중단된 상수의 사용은 이제 DeprecationWarning 을 발생시킵니다. ssl.SSLContext.options 에는 기본적으로 OP_NO_SSLv2OP_NO_SSLv3 가 설정되어 있으므로 플래그를 다시 설정하는 것에 대해 경고할 수 없습니다.

ssl 모듈은 이제 더 안전한 기본 설정을 갖추고 있습니다. 순방향 비밀성(forward secrecy)이 없거나 SHA-1 MAC을 사용하는 암호 방식은 기본적으로 비활성화됩니다. 보안 수준 2는 112비트 미만의 보안 강도를 가진 취약한 RSA, DH, ECC 키를 금지합니다. SSLContext 는 기본적으로 최소 프로토콜 버전 TLS 1.2로 설정됩니다. 이 설정은 Hynek Schlawack의 연구를 기반으로 합니다.

사용 중단된 프로토콜인 SSL 3.0, TLS 1.0, TLS 1.1은 더 이상 공식적으로 지원되지 않습니다. Python이 이들을 능동적으로 차단하지는 않습니다. 그러나 OpenSSL 빌드 옵션, 배포판 설정, 공급업체 패치, 암호 방식 모음에 따라 성공적인 핸드셰이크가 차단될 수 있습니다.

ssl.get_server_certificate() 함수에 timeout 매개변수를 추가합니다.

ssl 모듈은 힙 타입과 다단계 초기화를 사용합니다.

새로운 검증 플래그 VERIFY_X509_PARTIAL_CHAIN 가 추가되었습니다.

sys

sys.orig_argv 속성을 추가합니다: Python 실행 파일에 전달된 원래 명령줄 인수의 목록입니다.

표준 라이브러리 모듈 이름의 목록을 담은 sys.stdlib_module_names 를 추가합니다.

_thread

_thread.interrupt_main() 은 이제 시뮬레이션할 시그널 번호를 선택적으로 받습니다(기본값은 여전히 signal.SIGINT 입니다).

참고