Python 3.10

Python 3.10.0 (bản cuối) được phát hành vào ngày 4 tháng 10 năm 2021. Các tính năng của phiên bản 3.10 được định nghĩa trong PEP 619 và mô tả chi tiết về các thay đổi có thể tìm thấy tại What's New in Python 3.10.

Tính năng cú pháp mới

Trạng thái

PEP 634

Structural Pattern Matching: Đặc tả kỹ thuật

[1]

PEP 635

Structural Pattern Matching: Động lực và Căn cứ

[1]

PEP 636

Structural Pattern Matching: Hướng dẫn sử dụng

[1]

bpo-12782

Trình quản lý ngữ cảnh có dấu ngoặc đơn nay được chính thức cho phép

Tính năng mới trong thư viện chuẩn

PEP 618

Thêm kiểm tra độ dài tùy chọn cho zip

Cải tiến bộ thông dịch

PEP 626

Số dòng chính xác cho gỡ lỗi và các công cụ khác

Tính năng kiểu dữ liệu mới

PEP 604

Cho phép viết kiểu hợp nhất dạng X | Y

PEP 613

Bí danh kiểu tường minh

PEP 612

Biến đặc tả tham số

Các lỗi thời, loại bỏ hoặc hạn chế quan trọng

PEP 644

Yêu cầu OpenSSL 1.1.1 trở lên

PEP 632

Đánh dấu lỗi thời module distutils.

Không liên quan

PEP 623

Đánh dấu lỗi thời và chuẩn bị loại bỏ thành viên wstr trong PyUnicodeObject.

Không liên quan

PEP 624

Loại bỏ API mã hóa Py_UNICODE

Không liên quan

PEP 597

Thêm EncodingWarning tùy chọn

Các thay đổi ngôn ngữ khác:

Kiểu int có thêm phương thức mới int.bit_count(), trả về số lượng bit 1 trong biểu diễn nhị phân của một số nguyên cho trước, còn được gọi là population count.

Các view trả về bởi dict.keys(), dict.values()dict.items() nay đều có thuộc tính mapping cho phép lấy đối tượng types.MappingProxyType bọc từ điển gốc.

PEP 618: Hàm zip() nay có cờ tùy chọn strict, dùng để yêu cầu tất cả các iterable phải có độ dài bằng nhau.

Các hàm dựng sẵn và hàm mở rộng nhận tham số nguyên không còn chấp nhận Decimals, Fractions và các đối tượng khác chỉ có thể chuyển đổi sang số nguyên kèm mất mát (ví dụ: có phương thức __int__() nhưng không có __index__()).

Nếu object.__ipow__() trả về NotImplemented, toán tử sẽ đúng đắn chuyển sang dùng object.__pow__()object.__rpow__() như mong đợi.

Biểu thức gán nay có thể được dùng không có dấu ngoặc đơn bên trong tập hợp và biểu thức tập hợp, cũng như trong chỉ số chuỗi (nhưng không phải slice).

Các hàm có thuộc tính __builtins__ mới dùng để tìm kiếm ký hiệu dựng sẵn khi hàm thực thi, thay vì tra cứu trong __globals__['__builtins__']. Thuộc tính được khởi tạo từ __globals__["__builtins__"] nếu tồn tại, ngược lại từ builtins hiện tại.

Hai hàm dựng sẵn mới -- aiter()anext() được thêm vào để cung cấp các đối tác bất đồng bộ tương ứng với iter()next().

Các phương thức tĩnh (@staticmethod) và phương thức lớp (@classmethod) nay kế thừa các thuộc tính phương thức (__module__, __name__, __qualname__, __doc__, __annotations__) và có thuộc tính __wrapped__ mới. Ngoài ra, các phương thức tĩnh nay có thể gọi như hàm thông thường.

Các chú thích cho đích phức tạp (tất cả trừ đích simple name được định nghĩa bởi PEP 526) không còn gây ra hiệu ứng thời gian chạy với from __future__ import annotations.

Các đối tượng lớp và module nay tạo từ điển chú thích rỗng theo yêu cầu. Các từ điển chú thích được lưu trong __dict__ của đối tượng để tương thích ngược. Điều này cải thiện các thực hành tốt nhất khi làm việc với __annotations__.

Các chú thích chứa yield, yield from, await hoặc biểu thức có tên nay bị cấm khi dùng from __future__ import annotations do tác dụng phụ của chúng.

Việc sử dụng biến chưa gán, super() và các biểu thức khác có thể thay đổi xử lý bảng ký hiệu như chú thích nay không có hiệu lực với from __future__ import annotations.

Giá trị băm của NaN của cả kiểu float và kiểu decimal.Decimal nay phụ thuộc vào định danh đối tượng. Trước đây, chúng luôn băm thành 0 dù các giá trị NaN không bằng nhau. Điều này gây ra hành vi thời gian chạy bậc hai tiềm ẩn do va chạm băm quá mức khi tạo từ điển và tập hợp chứa nhiều NaN.

Một SyntaxError (thay vì NameError) sẽ được phát sinh khi xóa hằng __debug__.

Ngoại lệ SyntaxError nay có các thuộc tính end_linenoend_offset. Chúng sẽ là None nếu không xác định được.

Thay đổi đối với các module dựng sẵn:

asyncio

Thêm phương thức connect_accepted_socket() còn thiếu.

array

Phương thức index() của array.array nay có các tham số tùy chọn startstop.

gc

Thêm audit hook cho gc.get_objects(), gc.get_referrers()gc.get_referents().

hashlib

Module hashlib yêu cầu OpenSSL 1.1.1 trở lên.

Module hashlib có hỗ trợ sơ bộ cho OpenSSL 3.0.0.

Phần dự phòng thuần Python của pbkdf2_hmac() bị đánh dấu lỗi thời. Trong tương lai, PBKDF2-HMAC sẽ chỉ khả dụng khi Python được biên dịch với hỗ trợ OpenSSL.

os

Thêm hỗ trợ os.cpu_count() cho VxWorks RTOS.

Thêm hàm mới os.eventfd() và các trợ giúp liên quan để bọc syscall eventfd2 trên Linux.

Thêm os.splice() cho phép di chuyển dữ liệu giữa hai bộ mô tả tệp mà không cần sao chép giữa không gian địa chỉ kernel và không gian địa chỉ người dùng, trong đó một trong các bộ mô tả tệp phải tham chiếu đến pipe.

Thêm O_EVTONLY, O_FSYNC, O_SYMLINKO_NOFOLLOW_ANY cho macOS.

platform

Thêm platform.freedesktop_os_release() để lấy thông tin nhận dạng hệ điều hành từ tệp chuẩn freedesktop.org os-release.

socket

Ngoại lệ socket.timeout nay là bí danh của TimeoutError.

Thêm tùy chọn tạo socket MPTCP với IPPROTO_MPTCP.

Thêm tùy chọn IP_RECVTOS để nhận kiểu dịch vụ (ToS) hoặc trường DSCP/ECN.

ssl

Module ssl yêu cầu OpenSSL 1.1.1 trở lên.

Module ssl có hỗ trợ sơ bộ cho OpenSSL 3.0.0 và tùy chọn mới OP_IGNORE_UNEXPECTED_EOF.

Các hàm và hằng số lỗi thời nay phát sinh DeprecationWarning. ssl.SSLContext.optionsOP_NO_SSLv2OP_NO_SSLv3 được đặt theo mặc định và do đó không thể cảnh báo khi đặt lại cờ này.

Module ssl nay có cài đặt bảo mật mặc định tốt hơn. Các mã hóa không có tính bí mật chuyển tiếp hoặc SHA-1 MAC bị tắt theo mặc định. Mức bảo mật 2 cấm các khóa RSA, DH và ECC yếu có ít hơn 112 bit bảo mật. SSLContext mặc định phiên bản giao thức tối thiểu là TLS 1.2. Cài đặt dựa trên nghiên cứu của Hynek Schlawack.

Các giao thức lỗi thời SSL 3.0, TLS 1.0 và TLS 1.1 không còn được hỗ trợ chính thức. Python không chặn chúng chủ động. Tuy nhiên, các tùy chọn biên dịch OpenSSL, cấu hình distro, bản vá vendor và bộ mã hóa có thể ngăn bắt tay thành công.

Thêm tham số timeout cho hàm ssl.get_server_certificate().

Module ssl sử dụng heap-type và khởi tạo nhiều pha.

Một cờ xác minh mới VERIFY_X509_PARTIAL_CHAIN đã được thêm vào.

sys

Thêm thuộc tính sys.orig_argv: danh sách các đối số dòng lệnh gốc được truyền cho tệp thực thi Python.

Thêm sys.stdlib_module_names, chứa danh sách tên các module thư viện chuẩn.

_thread

_thread.interrupt_main() nay nhận tham số số tín hiệu tùy chọn để mô phỏng (mặc định vẫn là signal.SIGINT).

Ghi chú