Có gì mới trong Python 3.12

Biên tập viên:

Adam Turner

Bài viết này giải thích các tính năng mới trong Python 3.12, so với 3.11. Python 3.12 được phát hành vào ngày 2 tháng 10 năm 2023. Để biết thông tin chi tiết đầy đủ, hãy xem changelog.

Xem thêm

PEP 693 -- Lịch phát hành Python 3.12

Tóm tắt -- Phát hành điểm nổi bật

Python 3.12 là bản phát hành ổn định của ngôn ngữ lập trình Python, với sự kết hợp của các thay đổi về ngôn ngữ và thư viện chuẩn. Những thay đổi về thư viện tập trung vào việc dọn dẹp các API không được dùng nữa, khả năng sử dụng và tính chính xác. Đáng chú ý, gói distutils đã bị xóa khỏi thư viện chuẩn. Hỗ trợ hệ thống tập tin trong ospathlib đã có một số cải tiến và một số mô-đun có hiệu suất tốt hơn.

Những thay đổi về ngôn ngữ tập trung vào khả năng sử dụng, vì f-strings đã được loại bỏ nhiều hạn chế và các đề xuất 'Ý bạn là ...' tiếp tục được cải thiện. Câu lệnh type parameter syntaxtype mới cải thiện tính tiện dụng khi sử dụng generic typestype aliases với bộ kiểm tra kiểu tĩnh.

Bài viết này không cố gắng cung cấp thông số kỹ thuật đầy đủ của tất cả các tính năng mới mà thay vào đó cung cấp một cái nhìn tổng quan thuận tiện. Để biết chi tiết đầy đủ, bạn nên tham khảo tài liệu, chẳng hạn như Library ReferenceLanguage Reference. Nếu bạn muốn hiểu lý do thiết kế và triển khai đầy đủ cho một thay đổi, hãy tham khảo PEP để biết một tính năng mới cụ thể; nhưng lưu ý rằng PEP thường không được cập nhật khi một tính năng đã được triển khai đầy đủ.


Các tính năng cú pháp mới:

  • PEP 695, gõ cú pháp tham số và câu lệnh type

Các tính năng ngữ pháp mới:

Cải tiến trình thông dịch:

Cải tiến mô hình dữ liệu Python:

Những cải tiến đáng kể trong thư viện tiêu chuẩn:

Cải tiến bảo mật:

  • Thay thế các triển khai hashlib dựng sẵn của SHA1, SHA3, SHA2-384, SHA2-512 và MD5 bằng mã được xác minh chính thức từ dự án HACL*. Các triển khai dựng sẵn này vẫn ở dạng dự phòng và chỉ được sử dụng khi OpenSSL không cung cấp chúng.

C API cải tiến:

  • PEP 697, bậc C API không ổn định

  • PEP 683, vật thể bất tử

Cải tiến triển khai CPython:

  • PEP 709, nội tuyến hiểu

  • CPython support cho trình lược tả perf của Linux

  • Triển khai bảo vệ chống tràn ngăn xếp trên các nền tảng được hỗ trợ

Tính năng gõ mới:

Những trường hợp ngừng sử dụng, xóa hoặc hạn chế quan trọng:

  • PEP 623: Xóa wstr khỏi các đối tượng Unicode trong C API của Python, giảm kích thước của mọi đối tượng str ít nhất 8 byte.

  • PEP 632: Xóa gói distutils. Xem the migration guide để được tư vấn thay thế các API mà nó cung cấp. Gói Setuptools của bên thứ ba tiếp tục cung cấp distutils, nếu bạn vẫn yêu cầu gói này trong Python 3.12 trở lên.

  • gh-95299: Không cài đặt sẵn setuptools trong môi trường ảo được tạo bằng venv. Điều này có nghĩa là distutils, setuptools, pkg_resourceseasy_install sẽ không còn khả dụng theo mặc định; để truy cập các lệnh chạy pip install setuptools này trong môi trường ảo activated.

  • Các mô-đun asynchat, asyncoreimp đã bị xóa cùng với một số unittest.TestCase method aliases.

Tính năng mới

PEP 695: Cú pháp tham số kiểu

Các lớp và hàm chung trong PEP 484 được khai báo bằng cú pháp dài dòng khiến phạm vi của các tham số loại không rõ ràng và yêu cầu khai báo phương sai rõ ràng.

PEP 695 giới thiệu một cách mới, nhỏ gọn và rõ ràng hơn để tạo generic classesfunctions:

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

danh sách lớp [T]:
    def __getitem__(self, index: int, /) -> T:
        ...

    def nối thêm (tự, phần tử: T) -> Không :
        ...

Ngoài ra, PEP còn giới thiệu một cách mới để khai báo type aliases bằng cách sử dụng câu lệnh type, tạo ra một phiên bản của TypeAliasType:

 Điểm = tuple[float, float]

Bí danh loại cũng có thể là generic:

 Điểm[T] = tuple[T, T]

Cú pháp mới cho phép khai báo tham số TypeVarTupleParamSpec, cũng như tham số TypeVar có giới hạn hoặc ràng buộc:

 IntFunc[**P] =  thể gọi được[P, int] # ParamSpec
 LabeledTuple[*Ts] = tuple[str, *Ts] # TypeVarTuple
loại HashableSequence[T: Hashable] = Sequence[T] # TypeVar có giới hạn
 IntOrStrSequence[T: (int, str)] = Sequence[T] # TypeVar với các ràng buộc

Giá trị của bí danh loại cũng như giới hạn và ràng buộc của các biến loại được tạo thông qua cú pháp này chỉ được đánh giá theo yêu cầu (xem lazy evaluation). Điều này có nghĩa là bí danh loại có thể tham chiếu đến các loại khác được xác định sau trong tệp.

Các tham số loại được khai báo thông qua danh sách tham số loại sẽ hiển thị trong phạm vi khai báo và mọi phạm vi lồng nhau, nhưng không hiển thị ở phạm vi bên ngoài. Ví dụ, chúng có thể được sử dụng trong các chú thích kiểu cho các phương thức của một lớp chung hoặc trong nội dung lớp. Tuy nhiên, chúng không thể được sử dụng trong phạm vi mô-đun sau khi lớp được xác định. Xem Nhập danh sách tham số để biết mô tả chi tiết về ngữ nghĩa thời gian chạy của các tham số loại.

Để hỗ trợ ngữ nghĩa phạm vi này, một loại phạm vi mới được giới thiệu, annotation scope. Phạm vi chú thích phần lớn hoạt động giống như phạm vi hàm, nhưng tương tác khác với phạm vi lớp kèm theo. Trong Python 3.13, annotations cũng sẽ được đánh giá trong phạm vi chú thích.

Xem PEP 695 để biết thêm chi tiết.

(PEP được viết bởi Eric Traut. Thực hiện bởi Jelle Zijlstra, Eric Traut và những người khác trong gh-103764.)

PEP 701: Hình thức hóa cú pháp của chuỗi f

PEP 701 dỡ bỏ một số hạn chế đối với việc sử dụng f-strings. Các thành phần biểu thức bên trong chuỗi f giờ đây có thể là bất kỳ biểu thức Python hợp lệ nào, bao gồm các chuỗi sử dụng lại cùng một trích dẫn như chuỗi f chứa, biểu thức nhiều dòng, nhận xét, dấu gạch chéo ngược và chuỗi thoát unicode. Hãy trình bày chi tiết những điều này:

  • Tái sử dụng trích dẫn: trong Python 3.11, việc sử dụng lại các dấu ngoặc kép giống như chuỗi f kèm theo sẽ tăng SyntaxError, buộc người dùng phải sử dụng các dấu ngoặc kép có sẵn khác (như sử dụng dấu ngoặc kép hoặc dấu ngoặc kép nếu chuỗi f sử dụng dấu ngoặc đơn). Trong Python 3.12, giờ đây bạn có thể thực hiện những việc như thế này:

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

    Lưu ý rằng trước khi thay đổi này không có giới hạn rõ ràng về cách lồng các chuỗi f, nhưng thực tế là các dấu ngoặc kép chuỗi không thể được sử dụng lại bên trong thành phần biểu thức của chuỗi f khiến cho việc lồng các chuỗi f một cách tùy ý là không thể. Trên thực tế, đây là chuỗi f lồng nhau nhất có thể được viết:

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

    Vì hiện tại, các chuỗi f có thể chứa bất kỳ biểu thức Python hợp lệ nào bên trong các thành phần biểu thức, nên giờ đây có thể lồng các chuỗi f một cách tùy ý:

    >>> f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}"
    '2'
    
  • Biểu thức và nhận xét nhiều dòng: Trong Python 3.11, biểu thức chuỗi f phải được xác định trên một dòng, ngay cả khi biểu thức trong chuỗi f thường có thể trải dài trên nhiều dòng (như danh sách hằng được xác định trên nhiều dòng), khiến chúng khó đọc hơn. Trong Python 3.12, giờ đây bạn có thể xác định chuỗi f trải dài trên nhiều dòng và thêm nhận xét nội tuyến:

    >>> f"This is the playlist: {", ".join([
    ...     'Take me back to Eden',  # My, my, those eyes like fire
    ...     'Alkaline',              # Not acid nor alkaline
    ...     'Ascensionism'           # Take to the broken skies at last
    ... ])}"
    'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
    
  • Dấu gạch chéo ngược và ký tự unicode: trước biểu thức chuỗi f Python 3.12 không được chứa bất kỳ ký tự \ nào. Điều này cũng ảnh hưởng đến unicode escape sequences (chẳng hạn như \N{snowman}) vì chúng chứa phần \N mà trước đây không thể là một phần của các thành phần biểu thức của chuỗi f. Bây giờ, bạn có thể định nghĩa các biểu thức như thế này:

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

Xem PEP 701 để biết thêm chi tiết.

Là một tác dụng phụ tích cực về cách triển khai tính năng này (bằng cách phân tích chuỗi f bằng the PEG parser), giờ đây các thông báo lỗi cho chuỗi f đã chính xác hơn và bao gồm vị trí chính xác của lỗi. Ví dụ: trong Python 3.11, chuỗi f sau tăng SyntaxError:

>>> my_string = f"{x z y}" + f"{1 + 1}"
  Tệp "<stdin>", dòng 1
    (x z y)
     ^^^
Lỗi cú pháp: chuỗi f: cú pháp không hợp lệ. Có lẽ bạn quên dấu phẩy?

nhưng thông báo lỗi không bao gồm vị trí chính xác của lỗi trong dòng và cũng có biểu thức được bao quanh bởi dấu ngoặc đơn một cách giả tạo. Trong Python 3.12, vì chuỗi f được phân tích cú pháp bằng trình phân tích cú pháp PEG, các thông báo lỗi có thể chính xác hơn và hiển thị toàn bộ dòng:

>>> my_string = f"{x z y}" + f"{1 + 1}"
  Tệp "<stdin>", dòng 1
    my_string = f"{x z y}" + f"{1 + 1}"
                   ^^^
Lỗi cú pháp: cú pháp không hợp lệ. Có lẽ bạn quên dấu phẩy?

(Được đóng góp bởi Pablo Galindo, Batuhan Taskaya, Lysandros Nikolaou, Cristián Maureira-Fredes và Marta Gómez trong gh-102856. PEP được viết bởi Pablo Galindo, Batuhan Taskaya, Lysandros Nikolaou và Marta Gómez).

PEP 684: Một phiên dịch viên GIL

PEP 684 giới thiệu GIL cho mỗi thông dịch viên, do đó, giờ đây, các thông dịch viên phụ có thể được tạo bằng một GIL duy nhất cho mỗi thông dịch viên. Điều này cho phép các chương trình Python tận dụng tối đa nhiều lõi CPU. Tính năng này hiện chỉ khả dụng thông qua C-API, mặc dù API của Python là anticipated for 3.13.

Sử dụng hàm Py_NewInterpreterFromConfig() mới để tạo trình thông dịch với GIL của riêng nó:

Cấu hình PyInterpreterConfig = {
    .check_multi_interp_extensions = 1,
    .gil = PyInterpreterConfig_OWN_GIL,
};
PyThreadState *tstate = NULL;
Trạng thái PyStatus = Py_NewInterpreterFromConfig(&tstate, &config);
if (PyStatus_Exception(trạng thái)) {
    trả về -1;
}
/* Trình thông dịch mới hiện đang hoạt động trong luồng hiện tại. */

Để biết thêm ví dụ về cách sử dụng C-API cho thông dịch viên phụ với GIL trên mỗi thông dịch viên, hãy xem Modules/_xxsubinterpretersmodule.c.

(Được đóng góp bởi Eric Snow trong gh-104210, v.v.)

PEP 669: Giám sát tác động thấp cho CPython

PEP 669 định nghĩa một API mới cho trình lược tả, trình gỡ lỗi và các công cụ khác để theo dõi các sự kiện trong CPython. Nó bao gồm một loạt các sự kiện, bao gồm các cuộc gọi, trả lại, dòng, ngoại lệ, bước nhảy, v.v. Điều này có nghĩa là bạn chỉ trả tiền cho những gì bạn sử dụng, cung cấp hỗ trợ cho các công cụ bảo hiểm và trình gỡ lỗi có chi phí gần như bằng không. Xem sys.monitoring để biết chi tiết.

(Được đóng góp bởi Mark Shannon trong gh-103082.)

PEP 688: Làm cho giao thức bộ đệm có thể truy cập được bằng Python

PEP 688 giới thiệu cách sử dụng buffer protocol từ mã Python. Các lớp triển khai phương thức __buffer__() hiện có thể sử dụng được làm loại bộ đệm.

collections.abc.Buffer ABC mới cung cấp một cách tiêu chuẩn để biểu diễn các đối tượng đệm, ví dụ như trong các chú thích kiểu. Enum inspect.BufferFlags mới đại diện cho các cờ có thể được sử dụng để tùy chỉnh việc tạo bộ đệm. (Được đóng góp bởi Jelle Zijlstra trong gh-102500.)

PEP 709: Nội tuyến hiểu

Việc hiểu từ điển, danh sách và tập hợp hiện được nội tuyến, thay vì tạo một đối tượng hàm sử dụng một lần mới cho mỗi lần thực hiện việc hiểu. Điều này tăng tốc độ thực hiện việc hiểu lên đến hai lần. Xem PEP 709 để biết thêm chi tiết.

Các biến lặp của việc hiểu vẫn được tách biệt và không ghi đè lên một biến có cùng tên ở phạm vi bên ngoài và chúng cũng không hiển thị sau khi hiểu. Nội tuyến dẫn đến một số thay đổi hành vi có thể nhìn thấy:

  • Không còn khung riêng biệt để hiểu trong truy nguyên và việc theo dõi/lập hồ sơ không còn hiển thị mức độ hiểu dưới dạng lệnh gọi hàm.

  • Mô-đun symtable sẽ không còn tạo ra các bảng ký hiệu con cho mỗi lần hiểu; thay vào đó, các giá trị cục bộ của mức hiểu sẽ được đưa vào bảng ký hiệu của hàm cha.

  • Việc gọi locals() bên trong phần hiểu hiện bao gồm các biến từ bên ngoài phần hiểu và không còn bao gồm biến .0 tổng hợp cho "đối số" phần hiểu.

  • Quá trình đọc hiểu lặp lại trực tiếp trên locals() (ví dụ: [k for k in locals()]) có thể thấy "RuntimeError: kích thước từ điển đã thay đổi trong quá trình lặp" khi chạy trong chế độ theo dõi (ví dụ: đo phạm vi mã). Đây là hành vi tương tự đã thấy trong ví dụ: for k in locals():. Để tránh lỗi, trước tiên hãy tạo danh sách các khóa để lặp lại: keys = list(locals()); [k for k in keys].

(Được đóng góp bởi Carl Meyer và Vladimir Matveev trong PEP 709.)

Thông báo lỗi được cải thiện

  • Các mô-đun từ thư viện chuẩn hiện có khả năng được đề xuất như một phần của thông báo lỗi được trình thông dịch hiển thị khi NameError được nâng lên mức cao nhất. (Được đóng góp bởi Pablo Galindo trong gh-98254.)

    >>> sys.version_info
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'sys' is not defined. Did you forget to import 'sys'?
    
  • Cải thiện đề xuất lỗi cho các trường hợp ngoại lệ NameError. Bây giờ, nếu NameError được nêu ra trong một phương thức và phiên bản có thuộc tính chính xác bằng tên trong ngoại lệ, thì đề xuất sẽ bao gồm self.<NAME> thay vì kết quả khớp gần nhất trong phạm vi phương thức. (Được đóng góp bởi Pablo Galindo trong gh-99139.)

    >>> class A:
    ...    def __init__(self):
    ...        self.blech = 1
    ...
    ...    def foo(self):
    ...        somethin = blech
    ...
    >>> A().foo()
    Traceback (most recent call last):
      File "<stdin>", line 1
        somethin = blech
                   ^^^^^
    NameError: name 'blech' is not defined. Did you mean: 'self.blech'?
    
  • Cải thiện thông báo lỗi SyntaxError khi người dùng gõ import x from y thay vì from y import x. (Được đóng góp bởi Pablo Galindo trong gh-98931.)

    >>> import a.y.z from b.y.z
    Traceback (most recent call last):
      File "<stdin>", line 1
        import a.y.z from b.y.z
        ^^^^^^^^^^^^^^^^^^^^^^^
    SyntaxError: Did you mean to use 'from ... import ...' instead?
    
  • Các ngoại lệ ImportError được tạo ra từ các câu lệnh from <module> import <name> không thành công hiện bao gồm các đề xuất về giá trị của <name> dựa trên các tên có sẵn trong <module>. (Được đóng góp bởi Pablo Galindo trong gh-91058.)

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

Những thay đổi ngôn ngữ khác

  • Trình phân tích cú pháp hiện tăng SyntaxError khi phân tích mã nguồn chứa byte rỗng. (Được đóng góp bởi Pablo Galindo trong gh-96670.)

  • Cặp ký tự dấu gạch chéo ngược không phải là chuỗi thoát hợp lệ hiện tạo ra SyntaxWarning, thay vì DeprecationWarning. Ví dụ: re.compile("\d+\.\d+") hiện phát ra SyntaxWarning ("\d" là chuỗi thoát không hợp lệ, hãy sử dụng chuỗi thô cho biểu thức chính quy: re.compile(r"\d+\.\d+")). Trong phiên bản Python tương lai, SyntaxError cuối cùng sẽ được nâng lên, thay vì SyntaxWarning. (Được đóng góp bởi Victor Stinner trong gh-98401.)

  • Thoát bát phân có giá trị lớn hơn 0o377 (ví dụ: "\477"), không được dùng nữa trong Python 3.11, hiện tạo ra SyntaxWarning, thay vì DeprecationWarning. Trong phiên bản Python tương lai, cuối cùng chúng sẽ là SyntaxError. (Được đóng góp bởi Victor Stinner trong gh-98401.)

  • Các biến được sử dụng trong phần mục tiêu của phần hiểu không được lưu trữ giờ đây có thể được sử dụng trong biểu thức gán (:=). Ví dụ: trong [(b := 1) for a, b.prop in some_iter], việc gán cho b hiện được cho phép. Lưu ý rằng việc gán cho các biến được lưu trữ trong phần mục tiêu của mức độ hiểu (như a) vẫn không được phép, theo PEP 572. (Được đóng góp bởi Nikita Sobolev trong gh-100581.)

  • Các ngoại lệ được nêu ra trong phương thức __set_name__ của một lớp hoặc loại không còn được bao bọc bởi RuntimeError nữa. Thông tin ngữ cảnh được thêm vào ngoại lệ dưới dạng ghi chú PEP 678. (Được đóng góp bởi Irit Katriel trong gh-77757.)

  • Khi cấu trúc try-except* xử lý toàn bộ ExceptionGroup và đưa ra một ngoại lệ khác, ngoại lệ đó không còn được bao bọc trong ExceptionGroup nữa. Cũng thay đổi trong phiên bản 3.11.4. (Được đóng góp bởi Irit Katriel trong gh-103590.)

  • Trình thu gom rác hiện chỉ chạy trên cơ chế ngắt eval của vòng đánh giá mã byte Python thay vì phân bổ đối tượng. GC cũng có thể chạy khi PyErr_CheckSignals() được gọi nên các tiện ích mở rộng C cần chạy trong thời gian dài mà không thực thi bất kỳ mã Python nào cũng có cơ hội thực thi GC định kỳ. (Được đóng góp bởi Pablo Galindo trong gh-97922.)

  • Tất cả các lệnh gọi dựng sẵn và mở rộng mong đợi các tham số boolean giờ đây chấp nhận các đối số thuộc bất kỳ loại nào thay vì chỉ boolint. (Được đóng góp bởi Serhiy Storchaka trong gh-60203.)

  • memoryview hiện hỗ trợ loại nửa float (mã định dạng "e"). (Được đóng góp bởi Donghee Na và Antoine Pitrou trong gh-90751.)

  • Các đối tượng slice hiện có thể băm được, cho phép chúng được sử dụng làm khóa chính tả và các mục đã đặt. (Được đóng góp bởi Will Bradshaw, Furkan Onder và Raymond Hettinger trong gh-101264.)

  • sum() hiện sử dụng phép tính tổng Neumaier để cải thiện độ chính xác và tính giao hoán khi tính tổng số float hoặc số nguyên hỗn hợp và số float. (Được đóng góp bởi Raymond Hettinger trong gh-100425.)

  • ast.parse() hiện tăng SyntaxError thay vì ValueError khi phân tích mã nguồn chứa byte rỗng. (Được đóng góp bởi Pablo Galindo trong gh-96670.)

  • Các phương thức trích xuất trong tarfileshutil.unpack_archive() có một đối số filter mới cho phép hạn chế các tính năng tar có thể gây ngạc nhiên hoặc nguy hiểm, chẳng hạn như tạo tệp bên ngoài thư mục đích. Xem tarfile extraction filters để biết chi tiết. Trong Python 3.14, mặc định sẽ chuyển sang 'data'. (Được đóng góp bởi Petr Viktorin trong PEP 706.)

  • Các phiên bản types.MappingProxyType hiện có thể băm được nếu ánh xạ cơ bản có thể băm được. (Được đóng góp bởi Serhiy Storchaka trong gh-87995.)

  • Thêm support for the perf profiler thông qua biến môi trường mới PYTHONPERFSUPPORT và tùy chọn dòng lệnh -X perf, cũng như các hàm sys.activate_stack_trampoline(), sys.deactivate_stack_trampoline()sys.is_stack_trampoline_active() mới. (Thiết kế của Pablo Galindo. Được đóng góp bởi Pablo Galindo và Christian Heimes với sự đóng góp của Gregory P. Smith [Google] và Mark Shannon trong gh-96123.)

Mô-đun mới

  • Không.

Mô-đun cải tiến

mảng

asyncio

  • Hiệu suất ghi vào ổ cắm trong asyncio đã được cải thiện đáng kể. asyncio hiện tránh việc sao chép không cần thiết khi ghi vào ổ cắm và sử dụng sendmsg() nếu nền tảng hỗ trợ. (Được đóng góp bởi Kumar Aditya trong gh-91166.)

  • Thêm các hàm asyncio.eager_task_factory()asyncio.create_eager_task_factory() để cho phép chọn vòng lặp sự kiện để thực thi nhiệm vụ háo hức, giúp một số trường hợp sử dụng nhanh hơn gấp 2 đến 5 lần. (Được đóng góp bởi Jacob Bower & Itamar Oren trong gh-102853, gh-104140gh-104138)

  • Trên Linux, asyncio sử dụng asyncio.PidfdChildWatcher theo mặc định nếu os.pidfd_open() khả dụng và hoạt động thay vì asyncio.ThreadedChildWatcher. (Được đóng góp bởi Kumar Aditya trong gh-98024.)

  • Vòng lặp sự kiện hiện sử dụng trình theo dõi con tốt nhất hiện có cho mỗi nền tảng (asyncio.PidfdChildWatcher nếu được hỗ trợ và asyncio.ThreadedChildWatcher nếu không), do đó, không nên định cấu hình trình theo dõi con theo cách thủ công. (Được đóng góp bởi Kumar Aditya trong gh-94597.)

  • Thêm tham số loop_factory vào asyncio.run() để cho phép chỉ định nhà máy vòng lặp sự kiện tùy chỉnh. (Được đóng góp bởi Kumar Aditya trong gh-99388.)

  • Thêm C triển khai asyncio.current_task() để tăng tốc 4x-6x. (Được đóng góp bởi Itamar Oren và Pranav Thulasiram Bhat trong gh-100344.)

  • asyncio.iscoroutine() hiện trả về False cho các trình tạo vì asyncio không hỗ trợ các coroutine dựa trên trình tạo cũ. (Được đóng góp bởi Kumar Aditya trong gh-102748.)

  • asyncio.wait()asyncio.as_completed() hiện chấp nhận các tác vụ tạo năng suất. (Được đóng góp bởi Kumar Aditya trong gh-78530.)

lịch

csv

dis

  • Các mã lệnh giả (được trình biên dịch sử dụng nhưng không xuất hiện trong mã byte thực thi) hiện được hiển thị trong mô-đun dis. HAVE_ARGUMENT vẫn liên quan đến các opcode thực, nhưng nó không hữu ích cho các lệnh giả. Thay vào đó hãy sử dụng bộ sưu tập dis.hasarg mới. (Được đóng góp bởi Irit Katriel trong gh-94216.)

  • Thêm bộ sưu tập dis.hasexc để biểu thị các hướng dẫn đặt trình xử lý ngoại lệ. (Được đóng góp bởi Irit Katriel trong gh-94216.)

phân số

  • Các đối tượng thuộc loại fractions.Fraction hiện hỗ trợ định dạng kiểu float. (Được đóng góp bởi Mark Dickinson trong gh-100161.)

importlib.resource

kiểm tra

itertools

  • Thêm itertools.batched() để thu thập thành các bộ dữ liệu có kích thước chẵn trong đó lô cuối cùng có thể ngắn hơn các bộ còn lại. (Được đóng góp bởi Raymond Hettinger trong gh-98363.)

môn toán

  • Thêm math.sumprod() để tính tổng sản phẩm. (Được đóng góp bởi Raymond Hettinger trong gh-100485.)

  • Mở rộng math.nextafter() để bao gồm đối số steps để di chuyển lên hoặc xuống nhiều bước cùng một lúc. (Được đóng góp bởi Matthias Goergens, Mark Dickinson và Raymond Hettinger trong gh-94906.)

hệ điều hành

  • Thêm os.PIDFD_NONBLOCK để mở bộ mô tả tệp cho một quy trình có os.pidfd_open() ở chế độ không chặn. (Được đóng góp bởi Kumar Aditya trong gh-93312.)

  • os.DirEntry hiện bao gồm phương thức os.DirEntry.is_junction() để kiểm tra xem mục nhập có phải là điểm nối hay không. (Được đóng góp bởi Charles Machalow trong gh-99547.)

  • Thêm các chức năng os.listdrives(), os.listvolumes()os.listmounts() trên Windows để liệt kê ổ đĩa, ổ đĩa và điểm gắn kết. (Được đóng góp bởi Steve Dower trong gh-102519.)

  • os.stat()os.lstat() hiện chính xác hơn trên Windows. Trường st_birthtime hiện sẽ chứa thời gian tạo tệp và st_ctime không được dùng nữa nhưng vẫn chứa thời gian tạo (nhưng trong tương lai sẽ trả về thay đổi siêu dữ liệu cuối cùng để thống nhất với các nền tảng khác). st_dev có thể lên tới 64 bit và st_ino lên tới 128 bit tùy thuộc vào hệ thống tệp của bạn và st_rdev luôn được đặt thành 0 thay vì giá trị không chính xác. Cả hai chức năng này có thể nhanh hơn đáng kể trên các bản phát hành Windows mới hơn. (Được đóng góp bởi Steve Dower trong gh-99726.)

os.path

  • Thêm os.path.isjunction() để kiểm tra xem đường dẫn đã cho có phải là điểm giao nhau hay không. (Được đóng góp bởi Charles Machalow trong gh-99547.)

  • Thêm os.path.splitroot() để chia đường dẫn thành bộ ba (drive, root, tail). (Được đóng góp bởi Barney Gale trong gh-101000.)

đường dẫn

nền tảng

  • Thêm hỗ trợ phát hiện các bản phát hành Windows 11 và Windows Server trước năm 2012. Trước đây, tra cứu trên nền tảng Windows Server mới hơn Windows Server 2012 và trên Windows 11 sẽ trả về Windows-10. (Được đóng góp bởi Steve Dower trong gh-89545.)

pdb

  • Thêm các biến tiện lợi để giữ giá trị tạm thời cho phiên gỡ lỗi và cung cấp quyền truy cập nhanh vào các giá trị như khung hiện tại hoặc giá trị trả về. (Được đóng góp bởi Tian Gao trong gh-103693.)

ngẫu nhiên

im lặng

  • shutil.make_archive() hiện chuyển đối số root_dir cho các bộ lưu trữ tùy chỉnh hỗ trợ nó. Trong trường hợp này, nó không còn tạm thời thay đổi thư mục làm việc hiện tại của tiến trình thành root_dir để thực hiện lưu trữ. (Được đóng góp bởi Serhiy Storchaka trong gh-74696.)

  • shutil.rmtree() hiện chấp nhận một đối số mới onexc, một trình xử lý lỗi giống như onerror nhưng dự kiến sẽ có một trường hợp ngoại lệ thay vì bộ ba (typ, val, tb). onerror không được dùng nữa. (Được đóng góp bởi Irit Katriel trong gh-102828.)

  • shutil.which() hiện tham khảo biến môi trường PATHEXT để tìm kết quả khớp trong PATH trên Windows ngay cả khi cmd đã cho bao gồm một thành phần thư mục. (Được đóng góp bởi Charles Machalow trong gh-103179.)

    shutil.which() sẽ gọi NeedCurrentDirectoryForExePathW khi truy vấn các tệp thực thi trên Windows để xác định xem thư mục làm việc hiện tại có nên được thêm vào trước đường dẫn tìm kiếm hay không. (Được đóng góp bởi Charles Machalow trong gh-103179.)

    shutil.which() sẽ trả về một đường dẫn khớp với cmd với một thành phần từ PATHEXT trước một kết quả khớp trực tiếp ở nơi khác trong đường dẫn tìm kiếm trên Windows. (Được đóng góp bởi Charles Machalow trong gh-103179.)

sqlite3

thống kê

  • Mở rộng statistics.correlation() để đưa vào dưới dạng phương pháp ranked để tính toán mối tương quan Spearman của dữ liệu được xếp hạng. (Được đóng góp bởi Raymond Hettinger trong gh-95861.)

hệ thống

  • Thêm không gian tên sys.monitoring để hiển thị API giám sát PEP 669 mới. (Được đóng góp bởi Mark Shannon trong gh-103082.)

  • Thêm sys.activate_stack_trampoline()sys.deactivate_stack_trampoline() để kích hoạt và hủy kích hoạt các tấm bạt lò xo của trình thu thập thông tin ngăn xếp và sys.is_stack_trampoline_active() để truy vấn xem các tấm bạt lò xo của trình thu thập thông tin ngăn xếp có đang hoạt động hay không. (Được đóng góp bởi Pablo Galindo và Christian Heimes với sự đóng góp của Gregory P. Smith [Google] và Mark Shannon trong gh-96123.)

  • Thêm sys.last_exc chứa ngoại lệ chưa được xử lý cuối cùng đã được nêu ra (đối với các trường hợp sử dụng gỡ lỗi sau khi xử lý). Không dùng nữa ba trường có cùng thông tin ở dạng cũ: sys.last_type, sys.last_valuesys.last_traceback. (Được đóng góp bởi Irit Katriel trong gh-102778.)

  • sys._current_exceptions() hiện trả về ánh xạ từ thread-id đến một phiên bản ngoại lệ, thay vì tới bộ dữ liệu (typ, exc, tb). (Được đóng góp bởi Irit Katriel trong gh-103176.)

  • sys.setrecursionlimit()sys.getrecursionlimit(). Giới hạn đệ quy hiện chỉ áp dụng cho mã Python. Các hàm dựng sẵn không sử dụng giới hạn đệ quy nhưng được bảo vệ bằng một cơ chế khác nhằm ngăn chặn đệ quy gây ra sự cố máy ảo.

tập tin tạm thời

  • Hàm tempfile.NamedTemporaryFile có tham số tùy chọn mới delete_on_close (Được đóng góp bởi Evgeny Zorin trong gh-58451.)

  • tempfile.mkdtemp() hiện luôn trả về một đường dẫn tuyệt đối, ngay cả khi đối số được cung cấp cho tham số dir là đường dẫn tương đối.

luồng

tkinter

  • tkinter.Canvas.coords() bây giờ đã làm phẳng các đối số của nó. Giờ đây, nó không chỉ chấp nhận tọa độ dưới dạng đối số riêng biệt (x1, y1, x2, y2, ...) và một chuỗi tọa độ ([x1, y1, x2, y2, ...]), mà còn chấp nhận tọa độ được nhóm theo cặp ((x1, y1), (x2, y2), ...[(x1, y1), (x2, y2), ...]), giống như các phương thức create_*(). (Được đóng góp bởi Serhiy Storchaka trong gh-94473.)

mã hóa

  • Mô-đun tokenize bao gồm những thay đổi được giới thiệu trong PEP 701. (Được đóng góp bởi Marta Gómez Macías và Pablo Galindo trong gh-102856.) Xem Chuyển sang Python 3.12 để biết thêm thông tin về những thay đổi đối với mô-đun tokenize.

các loại

đánh máy

  • isinstance() kiểm tra runtime-checkable protocols hiện sử dụng inspect.getattr_static() thay vì hasattr() để tra cứu xem các thuộc tính có tồn tại hay không. Điều này có nghĩa là các bộ mô tả và phương thức __getattr__() không còn được đánh giá bất ngờ trong quá trình kiểm tra isinstance() đối với các giao thức có thể kiểm tra thời gian chạy. Tuy nhiên, điều đó cũng có thể có nghĩa là một số đối tượng từng được coi là phiên bản của giao thức có thể kiểm tra thời gian chạy có thể không còn được coi là phiên bản của giao thức đó trên Python 3.12+ và ngược lại. Hầu hết người dùng khó có thể bị ảnh hưởng bởi sự thay đổi này. (Được đóng góp bởi Alex Waygood trong gh-102433.)

  • Các thành viên của giao thức có thể kiểm tra thời gian chạy hiện được coi là "đóng băng" khi chạy ngay khi lớp được tạo. Các thuộc tính vá khỉ trên giao thức có thể kiểm tra thời gian chạy sẽ vẫn hoạt động nhưng sẽ không có tác động đến việc kiểm tra isinstance() so sánh các đối tượng với giao thức. Ví dụ:

    >>> từ việc nhập Giao thức nhập, thời gian chạy_checkable
    >>> @runtime_checkable
    ... lớp HasX(Giao thức):
    ... x = 1
    ...
    >>> lớp Foo: ...
    ...
    >>> f = Foo()
    >>> isinstance(f, HasX)
    sai
    >>> f.x = 1
    >>> isinstance(f, HasX)
    đúng
    >>> HasX.y = 2
    >>> isinstance(f, HasX) # unchanged, mặc dù HasX hiện cũng có thuộc tính "y"
    đúng
    

    Thay đổi này được thực hiện nhằm tăng tốc độ kiểm tra isinstance() đối với các giao thức có thể kiểm tra thời gian chạy.

  • Hồ sơ hiệu suất của việc kiểm tra isinstance() so với runtime-checkable protocols đã thay đổi đáng kể. Hầu hết các lần kiểm tra isinstance() đối với các giao thức chỉ có một vài thành viên phải nhanh hơn ít nhất gấp 2 lần so với phiên bản 3.11 và một số có thể nhanh hơn 20 lần hoặc hơn. Tuy nhiên, isinstance() kiểm tra các giao thức có nhiều thành viên có thể chậm hơn so với Python 3.11. (Được đóng góp bởi Alex Waygood trong gh-74690gh-103193.)

  • Tất cả các lớp typing.TypedDicttyping.NamedTuple hiện có thuộc tính __orig_bases__. (Được đóng góp bởi Adrian Garcia Badaracco trong gh-103699.)

  • Thêm tham số frozen_default vào typing.dataclass_transform(). (Được đóng góp bởi Erik De Bonte trong gh-99957.)

dữ liệu unicode

  • Cơ sở dữ liệu Unicode đã được cập nhật lên phiên bản 15.0.0. (Được đóng góp bởi Benjamin Peterson trong gh-96734).

nhỏ nhất

Thêm tùy chọn dòng lệnh --durations, hiển thị N trường hợp kiểm thử chậm nhất:

python3 -m unittest --durations=3 lib.tests.test_threading
.....
Thời gian thử nghiệm chậm nhất
----------------------------------------------------------------------
1.210 giây test_timeout (Lib.test.test_threading.BarrierTests)
1,003 giây test_default_timeout (Lib.test.test_threading.BarrierTests)
0,518 giây test_timeout (Lib.test.test_threading.EventTests)

(0,000 thời lượng bị ẩn. Sử dụng -v để hiển thị các thời lượng này.)
----------------------------------------------------------------------
Đã thực hiện 158 bài kiểm tra trong 9,869 giây

Được rồi (bỏ qua=3)

(Được đóng góp bởi Giampaolo Rodola trong gh-48330)

uuid

Tối ưu hóa

  • Xóa các thành viên wstrwstr_length khỏi các đối tượng Unicode. Nó giảm kích thước đối tượng xuống 8 hoặc 16 byte trên nền tảng 64bit. (PEP 623) (Được đóng góp bởi Inada Naoki trong gh-92536.)

  • Thêm hỗ trợ thử nghiệm để sử dụng trình tối ưu hóa nhị phân BOLT trong quá trình xây dựng, giúp cải thiện hiệu suất từ 1-5%. (Được đóng góp bởi Kevin Modzelewski trong gh-90536 và được điều chỉnh bởi Donghee Na trong gh-101525)

  • Tăng tốc độ thay thế biểu thức chính quy (hàm re.sub()re.subn() và các phương thức re.Pattern tương ứng) cho các chuỗi thay thế chứa tham chiếu nhóm lên 2--3 lần. (Được đóng góp bởi Serhiy Storchaka trong gh-91524.)

  • Tăng tốc độ tạo asyncio.Task bằng cách trì hoãn việc định dạng chuỗi đắt tiền. (Được đóng góp bởi Itamar Oren trong gh-103793.)

  • Các chức năng tokenize.tokenize()tokenize.generate_tokens() nhanh hơn tới 64% nhờ tác dụng phụ của những thay đổi cần thiết để áp dụng cho PEP 701 trong mô-đun tokenize. (Được đóng góp bởi Marta Gómez Macías và Pablo Galindo trong gh-102856.)

  • Tăng tốc độ gọi phương thức super() và tải thuộc tính thông qua lệnh LOAD_SUPER_ATTR mới. (Được đóng góp bởi Carl Meyer và Vladimir Matveev trong gh-103497.)

Thay đổi mã byte CPython

  • Xóa hướng dẫn LOAD_METHOD. Nó đã được sáp nhập vào LOAD_ATTR. LOAD_ATTR bây giờ sẽ hoạt động giống như lệnh LOAD_METHOD cũ nếu bit thấp của oparg của nó được đặt. (Được đóng góp bởi Ken Jin trong gh-93429.)

  • Xóa hướng dẫn JUMP_IF_FALSE_OR_POPJUMP_IF_TRUE_OR_POP. (Được đóng góp bởi Irit Katriel trong gh-102859.)

  • Xóa hướng dẫn PRECALL. (Được đóng góp bởi Mark Shannon trong gh-92925.)

  • Thêm hướng dẫn BINARY_SLICESTORE_SLICE. (Được đóng góp bởi Mark Shannon trong gh-94163.)

  • Thêm hướng dẫn CALL_INTRINSIC_1. (Được đóng góp bởi Mark Shannon trong gh-99005.)

  • Thêm lệnh CALL_INTRINSIC_2. (Được đóng góp bởi Irit Katriel trong gh-101799.)

  • Thêm lệnh CLEANUP_THROW. (Được đóng góp bởi Brandt Bucher trong gh-90997.)

  • Thêm lệnh END_SEND. (Được đóng góp bởi Mark Shannon trong gh-103082.)

  • Thêm lệnh LOAD_FAST_AND_CLEAR như một phần của quá trình triển khai PEP 709. (Được đóng góp bởi Carl Meyer trong gh-101441.)

  • Thêm lệnh LOAD_FAST_CHECK. (Được đóng góp bởi Dennis Sweeney trong gh-93143.)

  • Thêm các mã hoạt động LOAD_FROM_DICT_OR_DEREF, LOAD_FROM_DICT_OR_GLOBALSLOAD_LOCALS như một phần của quá trình triển khai PEP 695. Xóa opcode LOAD_CLASSDEREF, có thể thay thế bằng LOAD_LOCALS cộng với LOAD_FROM_DICT_OR_DEREF. (Được đóng góp bởi Jelle Zijlstra trong gh-103764.)

  • Thêm lệnh LOAD_SUPER_ATTR. (Được đóng góp bởi Carl Meyer và Vladimir Matveev trong gh-103497.)

  • Thêm lệnh RETURN_CONST. (Được đóng góp bởi Wenyang Wang trong gh-101632.)

Bản trình diễn và công cụ

  • Xóa thư mục Tools/demo/ chứa các tập lệnh demo cũ. Một bản sao có thể được tìm thấy trong old-demos project. (Được đóng góp bởi Victor Stinner trong gh-97681.)

  • Xóa các tập lệnh mẫu lỗi thời của thư mục Tools/scripts/. Một bản sao có thể được tìm thấy trong old-demos project. (Được đóng góp bởi Victor Stinner trong gh-97669.)

Không được dùng nữa

  • argparse: Các tham số type, choicesmetavar của argparse.BooleanOptionalAction không được dùng nữa và sẽ bị xóa trong phiên bản 3.14. (Được đóng góp bởi Nikita Sobolev trong gh-92248.)

  • ast: Các tính năng ast sau đây không được dùng nữa trong tài liệu kể từ Python 3.8, hiện khiến DeprecationWarning được phát ra trong thời gian chạy khi chúng được truy cập hoặc sử dụng và sẽ bị xóa trong Python 3.14:

    • ast.Num

    • ast.Str

    • ast.Bytes

    • ast.NameConstant

    • ast.Ellipsis

    Thay vào đó hãy sử dụng ast.Constant. (Được đóng góp bởi Serhiy Storchaka trong gh-90953.)

  • asyncio:

    • Các lớp trình giám sát con asyncio.MultiLoopChildWatcher, asyncio.FastChildWatcher, asyncio.AbstractChildWatcherasyncio.SafeChildWatcher không được dùng nữa và sẽ bị xóa trong Python 3.14. (Được đóng góp bởi Kumar Aditya trong gh-94597.)

    • asyncio.set_child_watcher(), asyncio.get_child_watcher(), asyncio.AbstractEventLoopPolicy.set_child_watcher()asyncio.AbstractEventLoopPolicy.get_child_watcher() không được dùng nữa và sẽ bị xóa trong Python 3.14. (Được đóng góp bởi Kumar Aditya trong gh-94597.)

    • Phương thức get_event_loop() của chính sách vòng lặp sự kiện mặc định hiện phát ra DeprecationWarning nếu không có bộ vòng lặp sự kiện hiện tại và nó quyết định tạo một vòng lặp sự kiện. (Được đóng góp bởi Serhiy Storchaka và Guido van Rossum trong gh-100160.)

  • calendar: Các hằng số calendar.Januarycalendar.February không được dùng nữa và được thay thế bằng calendar.JANUARYcalendar.FEBRUARY. (Được đóng góp bởi Hoàng tử Roshan trong gh-103636.)

  • collections.abc: collections.abc.ByteString không được dùng nữa.

    Sử dụng isinstance(obj, collections.abc.Buffer) để kiểm tra xem obj có triển khai buffer protocol khi chạy hay không. Để sử dụng trong chú thích loại, hãy sử dụng Buffer hoặc liên kết chỉ định rõ ràng các loại mà mã của bạn hỗ trợ (ví dụ: bytes | bytearray | memoryview).

    ByteString ban đầu được dự định là một lớp trừu tượng sẽ đóng vai trò là siêu kiểu của cả bytesbytearray. Tuy nhiên, vì ABC chưa bao giờ có bất kỳ phương thức nào nên việc biết rằng một đối tượng là một thể hiện của ByteString chưa bao giờ thực sự cho bạn biết bất kỳ điều gì hữu ích về đối tượng đó. Các loại bộ đệm phổ biến khác như memoryview cũng không bao giờ được hiểu là kiểu con của ByteString (trong thời gian chạy hoặc bằng trình kiểm tra kiểu tĩnh).

    Xem PEP 688 để biết thêm chi tiết. (Được đóng góp bởi Shantanu Jain trong gh-91896.)

  • datetime: utcnow()utcfromtimestamp() của datetime.datetime không được dùng nữa và sẽ bị xóa trong phiên bản tương lai. Thay vào đó, hãy sử dụng các đối tượng nhận biết múi giờ để biểu thị ngày giờ trong UTC: lần lượt gọi now()fromtimestamp() với tham số tz được đặt thành datetime.UTC. (Được đóng góp bởi Paul Ganssle trong gh-103857.)

  • email: Không dùng tham số isdst trong email.utils.localtime(). (Được đóng góp bởi Alan Williams trong gh-72346.)

  • importlib.abc: Không dùng nữa các lớp sau, được lên lịch xóa trong Python 3.14:

    • importlib.abc.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

    Thay vào đó hãy sử dụng các lớp importlib.resources.abc:

    (Được đóng góp bởi Jason R. Coombs và Hugo van Kemenade trong gh-93963.)

  • itertools: Không còn hỗ trợ các hoạt động sao chép, sao chép sâu và chọn, không có giấy tờ, không hiệu quả, có nhiều lỗi lịch sử và không nhất quán. Điều này sẽ bị loại bỏ trong 3.14 để giảm đáng kể khối lượng mã và gánh nặng bảo trì. (Được đóng góp bởi Raymond Hettinger trong gh-101588.)

  • multiprocessing: Trong Python 3.14, phương thức khởi động multiprocessing mặc định sẽ thay đổi thành phương thức an toàn hơn trên Linux, BSD và các nền tảng POSIX không phải macOS khác, trong đó 'fork' hiện là mặc định (gh-84559). Việc thêm cảnh báo thời gian chạy về vấn đề này được cho là quá rắc rối vì phần lớn mã dự kiến ​​sẽ không được quan tâm. Sử dụng API get_context() hoặc set_start_method() để chỉ định rõ ràng thời điểm mã của bạn requires 'fork'. Xem contexts and start methods.

  • pkgutil: pkgutil.find_loader()pkgutil.get_loader() không được dùng nữa và sẽ bị xóa trong Python 3.14; thay vào đó hãy sử dụng importlib.util.find_spec(). (Được đóng góp bởi Nikita Sobolev trong gh-97850.)

  • pty: Mô-đun này có hai hàm master_open()slave_open() không có giấy tờ, không được dùng nữa kể từ Python 2 nhưng chỉ đạt được DeprecationWarning thích hợp trong 3.12. Loại bỏ chúng trong 3.14. (Được đóng góp bởi Soumendra Ganguly và Gregory P. Smith trong gh-85984.)

  • os:

    • Các trường st_ctime được trả về bởi os.stat()os.lstat() trên Windows không được dùng nữa. Trong bản phát hành trong tương lai, chúng sẽ chứa thời gian thay đổi siêu dữ liệu cuối cùng, nhất quán với các nền tảng khác. Hiện tại, chúng vẫn chứa thời gian tạo, thời gian này cũng có sẵn trong trường st_birthtime mới. (Được đóng góp bởi Steve Dower trong gh-99726.)

    • Trên nền tảng POSIX, os.fork() hiện có thể đưa ra DeprecationWarning khi nó có thể phát hiện việc được gọi từ một quy trình đa luồng. Luôn có sự không tương thích cơ bản với nền tảng POSIX khi làm như vậy. Thậm chí nếu mã appeared như vậy để làm việc. Chúng tôi đã thêm cảnh báo để nâng cao nhận thức vì các vấn đề mà mã thực hiện việc này gặp phải ngày càng thường xuyên hơn. Xem tài liệu os.fork() để biết thêm chi tiết cùng với this discussion on fork being incompatible with threads dành cho why, chúng tôi hiện đang giải quyết vấn đề tương thích nền tảng lâu đời này với các nhà phát triển.

    Khi cảnh báo này xuất hiện do sử dụng multiprocessing hoặc concurrent.futures, cách khắc phục là sử dụng phương thức khởi động multiprocessing khác như "spawn" hoặc "forkserver".

  • shutil: Đối số onerror của shutil.rmtree() không được dùng nữa; thay vào đó hãy sử dụng onexc. (Được đóng góp bởi Irit Katriel trong gh-102828.)

  • sqlite3:

  • sys: Các trường sys.last_type, sys.last_valuesys.last_traceback không được dùng nữa. Thay vào đó hãy sử dụng sys.last_exc. (Được đóng góp bởi Irit Katriel trong gh-102778.)

  • tarfile: Việc trích xuất kho lưu trữ tar mà không chỉ định filter không được dùng nữa cho đến Python 3.14, khi bộ lọc 'data' sẽ trở thành mặc định. Xem Bộ lọc trích xuất để biết chi tiết.

  • typing:

  • xml.etree.ElementTree: Mô-đun hiện phát ra DeprecationWarning khi kiểm tra giá trị thực của xml.etree.ElementTree.Element. Trước đây, quá trình triển khai Python phát ra FutureWarning và quá trình triển khai C không phát ra gì. (Được đóng góp bởi Jacob Walls trong gh-83122.)

  • Chữ ký 3-arg (loại, giá trị, truy nguyên) của coroutine throw(), generator throw()async generator throw() không được dùng nữa và có thể bị xóa trong phiên bản Python trong tương lai. Thay vào đó, hãy sử dụng phiên bản một đối số của các hàm này. (Được đóng góp bởi Ofey Chan trong gh-89874.)

  • DeprecationWarning hiện được nâng lên khi __package__ trên một mô-đun khác với __spec__.parent (trước đây là ImportWarning). (Được đóng góp bởi Brett Cannon trong gh-65961.)

  • Việc đặt __package__ hoặc __cached__ trên mô-đun không được dùng nữa và sẽ không còn được hệ thống nhập trong Python 3.14 đặt hoặc xem xét nữa. (Được đóng góp bởi Brett Cannon trong gh-65961.)

  • Toán tử đảo ngược bitwise (~) trên bool không được dùng nữa. Nó sẽ báo lỗi trong Python 3.16. Thay vào đó, hãy sử dụng not để phủ định logic của bool. Trong trường hợp hiếm hoi mà bạn thực sự cần đảo ngược bitwise của int cơ bản, hãy chuyển đổi thành int một cách rõ ràng: ~int(x). (Được đóng góp bởi Tim Hoffmann trong gh-103487.)

  • Việc truy cập co_lnotab trên các đối tượng mã không được dùng nữa trong Python 3.10 thông qua PEP 626, nhưng nó chỉ có DeprecationWarning thích hợp trong 3.12. Có thể được gỡ bỏ trong 3.15. (Được đóng góp bởi Nikita Sobolev trong gh-101866.)

Đang chờ xóa trong Python 3.13

Các mô-đun (xem PEP 594):

  • aifc

  • audioop

  • cgi

  • cgitb

  • chunk

  • crypt

  • imghdr

  • mailcap

  • msilib

  • nis

  • nntplib

  • ossaudiodev

  • pipes

  • sndhdr

  • spwd

  • sunau

  • telnetlib

  • uu

  • xdrlib

Các mô-đun khác:

  • lib2to3 và chương trình 2to3 (gh-84540)

API:

Đang chờ xóa trong Python 3.14

  • argparse: Các tham số type, choicesmetavar của argparse.BooleanOptionalAction không được dùng nữa và sẽ bị xóa trong phiên bản 3.14. (Được đóng góp bởi Nikita Sobolev trong gh-92248.)

  • ast: Các tính năng sau không được dùng nữa trong tài liệu kể từ Python 3.8, hiện khiến DeprecationWarning được phát ra trong thời gian chạy khi chúng được truy cập hoặc sử dụng và sẽ bị xóa trong Python 3.14:

    • ast.Num

    • ast.Str

    • ast.Bytes

    • ast.NameConstant

    • ast.Ellipsis

    Thay vào đó hãy sử dụng ast.Constant. (Được đóng góp bởi Serhiy Storchaka trong gh-90953.)

  • asyncio:

    • Các lớp trình giám sát con asyncio.MultiLoopChildWatcher, asyncio.FastChildWatcher, asyncio.AbstractChildWatcherasyncio.SafeChildWatcher không được dùng nữa và sẽ bị xóa trong Python 3.14. (Được đóng góp bởi Kumar Aditya trong gh-94597.)

    • asyncio.set_child_watcher(), asyncio.get_child_watcher(), asyncio.AbstractEventLoopPolicy.set_child_watcher()asyncio.AbstractEventLoopPolicy.get_child_watcher() không được dùng nữa và sẽ bị xóa trong Python 3.14. (Được đóng góp bởi Kumar Aditya trong gh-94597.)

    • Phương thức get_event_loop() của chính sách vòng lặp sự kiện mặc định hiện phát ra DeprecationWarning nếu không có bộ vòng lặp sự kiện hiện tại và nó quyết định tạo một vòng lặp sự kiện. (Được đóng góp bởi Serhiy Storchaka và Guido van Rossum trong gh-100160.)

  • email: Không dùng tham số isdst trong email.utils.localtime(). (Được đóng góp bởi Alan Williams trong gh-72346.)

  • importlib.abc các lớp không dùng nữa:

    • importlib.abc.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

    Thay vào đó hãy sử dụng các lớp importlib.resources.abc:

    (Được đóng góp bởi Jason R. Coombs và Hugo van Kemenade trong gh-93963.)

  • itertools có sự hỗ trợ không có giấy tờ, không hiệu quả, có lỗi lịch sử và không nhất quán cho các hoạt động sao chép, sao chép sâu và chọn dưa. Điều này sẽ bị loại bỏ trong 3.14 để giảm đáng kể khối lượng mã và gánh nặng bảo trì. (Được đóng góp bởi Raymond Hettinger trong gh-101588.)

  • multiprocessing: Phương thức khởi động mặc định sẽ thay đổi thành phương thức an toàn hơn trên Linux, BSD và các nền tảng POSIX không phải macOS khác trong đó 'fork' hiện là mặc định (gh-84559). Việc thêm cảnh báo thời gian chạy về vấn đề này được cho là quá rắc rối vì phần lớn mã dự kiến ​​sẽ không được quan tâm. Sử dụng API get_context() hoặc set_start_method() để chỉ định rõ ràng thời điểm mã của bạn requires 'fork'. Xem Bối cảnh và phương pháp bắt đầu.

  • pathlib: is_relative_to()relative_to(): việc truyền các đối số bổ sung không được dùng nữa.

  • pkgutil: pkgutil.find_loader()pkgutil.get_loader() hiện tăng DeprecationWarning; thay vào đó hãy sử dụng importlib.util.find_spec(). (Được đóng góp bởi Nikita Sobolev trong gh-97850.)

  • pty:

  • sqlite3:

  • urllib: urllib.parse.Quoter không được dùng nữa: nó không được dự định là API công khai. (Được đóng góp bởi Gregory P. Smith trong gh-88168.)

Đang chờ xóa trong Python 3.15

  • Hệ thống nhập khẩu:

    • Việc đặt __cached__ trên mô-đun trong khi không đặt được __spec__.cached không được dùng nữa. Trong Python 3.15, __cached__ sẽ không còn được hệ thống nhập hoặc thư viện chuẩn xem xét nữa. (gh-97879)

    • Việc đặt __package__ trên mô-đun trong khi không đặt được __spec__.parent không được dùng nữa. Trong Python 3.15, __package__ sẽ không còn được hệ thống nhập hoặc thư viện chuẩn xem xét nữa. (gh-97879)

  • ctypes:

    • Hàm ctypes.SetPointerType() không có giấy tờ đã không được dùng nữa kể từ Python 3.13.

  • http.server:

    • CGIHTTPRequestHandler lỗi thời và hiếm khi được sử dụng đã không được dùng nữa kể từ Python 3.13. Không có sự thay thế trực tiếp tồn tại. Anything tốt hơn CGI trong việc kết nối máy chủ web với trình xử lý yêu cầu.

    • Cờ --cgi cho giao diện dòng lệnh python -m http.server đã không được dùng nữa kể từ Python 3.13.

  • importlib:

    • Phương pháp load_module(): thay vào đó hãy sử dụng exec_module().

  • locale:

    • Hàm getdefaultlocale() đã không được dùng nữa kể từ Python 3.11. Việc loại bỏ nó ban đầu được lên kế hoạch cho Python 3.13 (gh-90817), nhưng đã bị hoãn lại đối với Python 3.15. Thay vào đó hãy sử dụng getlocale(), setlocale()getencoding(). (Được đóng góp bởi Hugo van Kemenade trong gh-111187.)

  • pathlib:

  • platform:

    • java_ver() đã không được dùng nữa kể từ Python 3.13. Chức năng này chỉ hữu ích khi hỗ trợ Jython, có API khó hiểu và phần lớn chưa được kiểm tra.

  • sysconfig:

  • threading:

    • RLock() sẽ không có đối số trong Python 3.15. Việc truyền bất kỳ đối số nào đã không còn được dùng nữa kể từ Python 3.14, vì phiên bản Python không cho phép bất kỳ đối số nào, nhưng phiên bản C cho phép bất kỳ số lượng đối số vị trí hoặc từ khóa nào, bỏ qua mọi đối số.

  • types:

    • types.CodeType: Việc truy cập co_lnotab không còn được dùng nữa trong PEP 626 kể từ phiên bản 3.10 và dự kiến sẽ bị xóa trong phiên bản 3.12, nhưng nó chỉ nhận được một DeprecationWarning thích hợp trong phiên bản 3.12. Có thể được gỡ bỏ trong 3.15. (Được đóng góp bởi Nikita Sobolev trong gh-101866.)

  • typing:

    • Cú pháp đối số từ khóa không có giấy tờ để tạo các lớp NamedTuple (ví dụ: Point = NamedTuple("Point", x=int, y=int)) đã không được dùng nữa kể từ Python 3.13. Thay vào đó hãy sử dụng cú pháp dựa trên lớp hoặc cú pháp chức năng.

    • Khi sử dụng cú pháp chức năng của TypedDicts, việc không truyền giá trị cho tham số fields (TD = TypedDict("TD")) hoặc truyền None (TD = TypedDict("TD", None)) đã không được dùng nữa kể từ Python 3.13. Sử dụng class TD(TypedDict): pass hoặc TD = TypedDict("TD", {}) để tạo TypedDict với trường bằng 0.

    • Chức năng trang trí typing.no_type_check_decorator() đã không được dùng nữa kể từ Python 3.13. Sau tám năm sử dụng mô-đun typing, nó vẫn chưa được hỗ trợ bởi bất kỳ trình kiểm tra loại chính nào.

  • wave:

  • zipimport:

Đang chờ xóa trong Python 3.16

  • Hệ thống nhập khẩu:

    • Việc đặt __loader__ trên mô-đun trong khi không đặt được __spec__.loader không được dùng nữa. Trong Python 3.16, __loader__ sẽ không còn được thiết lập hoặc xem xét bởi hệ thống nhập hoặc thư viện chuẩn.

  • array:

    • Mã định dạng 'u' (wchar_t) không còn được dùng trong tài liệu kể từ Python 3.3 và trong thời gian chạy kể từ Python 3.13. Thay vào đó, hãy sử dụng mã định dạng 'w' (Py_UCS4) cho các ký tự Unicode.

  • asyncio:

  • builtins:

    • Đảo ngược bit trên các loại boolean, ~True hoặc ~False đã không được dùng nữa kể từ Python 3.12, vì nó tạo ra kết quả đáng ngạc nhiên và không trực quan (-2-1). Thay vào đó, hãy sử dụng not x để phủ định logic của Boolean. Trong trường hợp hiếm hoi mà bạn cần đảo ngược bitwise của số nguyên cơ bản, hãy chuyển đổi rõ ràng sang int (~int(x)).

  • functools:

    • Việc gọi triển khai Python của functools.reduce() bằng function hoặc sequence làm đối số từ khóa đã không được dùng nữa kể từ Python 3.14.

  • logging:

    Hỗ trợ trình xử lý ghi nhật ký tùy chỉnh với đối số strm không được dùng nữa và được lên lịch xóa trong Python 3.16. Thay vào đó, hãy xác định trình xử lý bằng đối số stream. (Được đóng góp bởi Mariusz Felisiak trong gh-115032.)

  • mimetypes:

    • Tiện ích mở rộng hợp lệ bắt đầu bằng dấu '.' hoặc trống cho mimetypes.MimeTypes.add_type(). Các tiện ích mở rộng không có dấu chấm không được dùng nữa và sẽ tăng ValueError trong Python 3.16. (Được đóng góp bởi Hugo van Kemenade trong gh-75223.)

  • shutil:

    • Ngoại lệ ExecError đã không được dùng nữa kể từ Python 3.14. Nó chưa được sử dụng bởi bất kỳ chức năng nào trong shutil kể từ Python 3.4 và hiện là bí danh của RuntimeError.

  • symtable:

    • Phương thức Class.get_methods đã không được dùng nữa kể từ Python 3.14.

  • sys:

  • sysconfig:

    • Hàm sysconfig.expand_makefile_vars() đã không được dùng nữa kể từ Python 3.14. Thay vào đó, hãy sử dụng đối số vars của sysconfig.get_paths().

  • tarfile:

    • Thuộc tính TarFile.tarfile không có giấy tờ và không được sử dụng đã không được dùng nữa kể từ Python 3.13.

Đang chờ xóa trong Python 3.17

  • collections.abc:

    • collections.abc.ByteString được lên kế hoạch xóa trong Python 3.17.

      Sử dụng isinstance(obj, collections.abc.Buffer) để kiểm tra xem obj có triển khai buffer protocol khi chạy hay không. Để sử dụng trong chú thích loại, hãy sử dụng Buffer hoặc liên kết chỉ định rõ ràng các loại mà mã của bạn hỗ trợ (ví dụ: bytes | bytearray | memoryview).

      ByteString ban đầu được dự định là một lớp trừu tượng sẽ đóng vai trò là siêu kiểu của cả bytesbytearray. Tuy nhiên, vì ABC chưa bao giờ có bất kỳ phương thức nào nên việc biết rằng một đối tượng là một thể hiện của ByteString chưa bao giờ thực sự cho bạn biết bất kỳ điều gì hữu ích về đối tượng đó. Các loại bộ đệm phổ biến khác như memoryview cũng không bao giờ được hiểu là kiểu con của ByteString (trong thời gian chạy hoặc bằng trình kiểm tra kiểu tĩnh).

      Xem PEP 688 để biết thêm chi tiết. (Được đóng góp bởi Shantanu Jain trong gh-91896.)

  • typing:

    • Trước Python 3.14, các hợp nhất kiểu cũ đã được triển khai bằng lớp riêng typing._UnionGenericAlias. Lớp này không còn cần thiết cho việc triển khai nhưng nó đã được giữ lại để tương thích ngược, với kế hoạch loại bỏ đối với Python 3.17. Người dùng nên sử dụng các công cụ trợ giúp xem xét nội tâm được ghi lại như typing.get_origin()typing.get_args() thay vì dựa vào các chi tiết triển khai riêng tư.

    • typing.ByteString, không được dùng nữa kể từ Python 3.9, được lên lịch xóa trong Python 3.17.

      Sử dụng isinstance(obj, collections.abc.Buffer) để kiểm tra xem obj có triển khai buffer protocol khi chạy hay không. Để sử dụng trong chú thích loại, hãy sử dụng Buffer hoặc liên kết chỉ định rõ ràng các loại mà mã của bạn hỗ trợ (ví dụ: bytes | bytearray | memoryview).

      ByteString ban đầu được dự định là một lớp trừu tượng sẽ đóng vai trò là siêu kiểu của cả bytesbytearray. Tuy nhiên, vì ABC chưa bao giờ có bất kỳ phương thức nào nên việc biết rằng một đối tượng là một thể hiện của ByteString chưa bao giờ thực sự cho bạn biết bất kỳ điều gì hữu ích về đối tượng đó. Các loại bộ đệm phổ biến khác như memoryview cũng không bao giờ được hiểu là kiểu con của ByteString (trong thời gian chạy hoặc bằng trình kiểm tra kiểu tĩnh).

      Xem PEP 688 để biết thêm chi tiết. (Được đóng góp bởi Shantanu Jain trong gh-91896.)

Đang chờ xóa trong các phiên bản sau

Các API sau sẽ bị xóa trong tương lai, mặc dù hiện tại chưa có ngày dự kiến xóa chúng.

  • argparse:

    • Việc lồng các nhóm đối số và lồng các nhóm loại trừ lẫn nhau không được dùng nữa.

    • Việc chuyển đối số từ khóa không có giấy tờ prefix_chars sang add_argument_group() hiện không được dùng nữa.

    • Bộ chuyển đổi loại argparse.FileType không được dùng nữa.

  • builtins:

    • Trình tạo: chữ ký throw(type, exc, tb)athrow(type, exc, tb) không được dùng nữa: thay vào đó hãy sử dụng throw(exc)athrow(exc), chữ ký đối số duy nhất.

    • Hiện tại Python chấp nhận các ký tự số ngay sau các từ khóa, ví dụ 0in x, 1or x, 0if 1else 2. Nó cho phép các biểu thức khó hiểu và mơ hồ như [0x1for x in y] (có thể hiểu là [0x1 for x in y] hoặc [0x1f or x in y]). Cảnh báo cú pháp sẽ được đưa ra nếu ngay sau chữ số là một trong các từ khóa and, else, for, if, in, isor. Trong bản phát hành sau này, nó sẽ được thay đổi thành lỗi cú pháp. (gh-87999)

    • Hỗ trợ phương thức __index__()__int__() trả về kiểu không phải int: các phương thức này sẽ được yêu cầu trả về một phiên bản của lớp con nghiêm ngặt của int.

    • Hỗ trợ phương thức __float__() trả về một lớp con nghiêm ngặt của float: những phương thức này sẽ được yêu cầu để trả về một phiên bản của float.

    • Hỗ trợ phương thức __complex__() trả về một lớp con nghiêm ngặt của complex: những phương thức này sẽ được yêu cầu để trả về một phiên bản của complex.

    • Việc truyền số phức dưới dạng đối số real hoặc imag trong hàm tạo complex() hiện không được dùng nữa; nó chỉ nên được thông qua dưới dạng một đối số vị trí duy nhất. (Được đóng góp bởi Serhiy Storchaka trong gh-109218.)

  • calendar: Các hằng số calendar.Januarycalendar.February không được dùng nữa và được thay thế bằng calendar.JANUARYcalendar.FEBRUARY. (Được đóng góp bởi Hoàng tử Roshan trong gh-103636.)

  • codecs: sử dụng open() thay vì codecs.open(). (gh-133038)

  • codeobject.co_lnotab: thay vào đó hãy sử dụng phương pháp codeobject.co_lines().

  • datetime:

    • utcnow(): sử dụng datetime.datetime.now(tz=datetime.UTC).

    • utcfromtimestamp(): sử dụng datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC).

  • gettext: Giá trị số nhiều phải là số nguyên.

  • importlib:

    • Tham số cache_from_source() debug_override không được dùng nữa: thay vào đó hãy sử dụng tham số optimization.

  • importlib.metadata:

    • giao diện bộ dữ liệu EntryPoints.

    • None ngầm định trên các giá trị trả về.

  • logging: phương thức warn() không được dùng nữa kể từ Python 3.3, thay vào đó hãy sử dụng warning().

  • mailbox: Việc sử dụng chế độ văn bản và đầu vào StringIO không được dùng nữa, thay vào đó hãy sử dụng BytesIO và chế độ nhị phân.

  • os: Gọi os.register_at_fork() trong quy trình đa luồng.

  • pydoc.ErrorDuringImport: Giá trị bộ dữ liệu cho tham số exc_info không được dùng nữa, hãy sử dụng một phiên bản ngoại lệ.

  • re: Các quy tắc nghiêm ngặt hơn hiện được áp dụng cho tham chiếu nhóm số và tên nhóm trong biểu thức chính quy. Hiện chỉ có chuỗi chữ số ASCII được chấp nhận làm tham chiếu số. Tên nhóm trong mẫu byte và chuỗi thay thế hiện chỉ có thể chứa các chữ cái, chữ số và dấu gạch dưới ASCII. (Được đóng góp bởi Serhiy Storchaka trong gh-91760.)

  • mô-đun sre_compile, sre_constantssre_parse.

  • shutil: Tham số onerror của rmtree() không được dùng nữa trong Python 3.12; thay vào đó hãy sử dụng tham số onexc.

  • Các tùy chọn và giao thức ssl:

    • ssl.SSLContext không có đối số giao thức sẽ không được dùng nữa.

    • ssl.SSLContext: set_npn_protocols()selected_npn_protocol() không được dùng nữa: thay vào đó hãy sử dụng ALPN.

    • tùy chọn ssl.OP_NO_SSL*

    • tùy chọn ssl.OP_NO_TLS*

    • ssl.PROTOCOL_SSLv3

    • ssl.PROTOCOL_TLS

    • ssl.PROTOCOL_TLSv1

    • ssl.PROTOCOL_TLSv1_1

    • ssl.PROTOCOL_TLSv1_2

    • ssl.TLSVersion.SSLv3

    • ssl.TLSVersion.TLSv1

    • ssl.TLSVersion.TLSv1_1

  • phương pháp threading:

  • typing.Text (gh-92332).

  • Lớp nội bộ typing._UnionGenericAlias không còn được sử dụng để triển khai typing.Union nữa. Để duy trì khả năng tương thích với người dùng sử dụng lớp riêng tư này, một miếng chêm tương thích sẽ được cung cấp cho đến ít nhất là Python 3.17. (Được đóng góp bởi Jelle Zijlstra trong gh-105499.)

  • unittest.IsolatedAsyncioTestCase: không được dùng để trả về giá trị không phải là None từ trường hợp thử nghiệm.

  • urllib.parse các hàm không được dùng nữa: thay vào đó là urlparse()

    • splitattr()

    • splithost()

    • splitnport()

    • splitpasswd()

    • splitport()

    • splitquery()

    • splittag()

    • splittype()

    • splituser()

    • splitvalue()

    • to_bytes()

  • wsgiref: SimpleHandler.stdout.write() không nên ghi một phần.

  • xml.etree.ElementTree: Việc kiểm tra giá trị thực của Element không được dùng nữa. Trong bản phát hành sau này, nó sẽ luôn trả về True. Thay vào đó, hãy ưu tiên các bài kiểm tra len(elem) hoặc elem is not None rõ ràng.

  • sys._clear_type_cache() không được dùng nữa: thay vào đó hãy sử dụng sys._clear_internal_caches().

Đã xóa

asynchat và asyncore

  • Hai mô-đun này đã bị xóa theo lịch trình trong PEP 594 và không được dùng nữa trong Python 3.6. Thay vào đó hãy sử dụng asyncio. (Được đóng góp bởi Nikita Sobolev trong gh-96580.)

trình phân tích cú pháp cấu hình

nước cất

  • Xóa gói distutils. Nó không được dùng nữa trong Python 3.10 bởi PEP 632 "Không dùng mô-đun distutils". Đối với các dự án vẫn đang sử dụng distutils và không thể cập nhật lên thứ khác, có thể cài đặt dự án setuptools: nó vẫn cung cấp distutils. (Được đóng góp bởi Victor Stinner trong gh-92584.)

đảm bảopip

  • Xóa bánh xe setuptools đi kèm khỏi ensurepip và ngừng cài đặt setuptools trong môi trường do venv tạo.

    pip (>= 22.1) không yêu cầu cài đặt setuptools trong môi trường. Các gói dựa trên setuptools (và dựa trên distutils) vẫn có thể được sử dụng với pip install, vì pip sẽ cung cấp setuptools trong môi trường xây dựng mà nó sử dụng để xây dựng một gói.

    easy_install, pkg_resources, setuptoolsdistutils không còn được cung cấp theo mặc định trong các môi trường được tạo bằng venv hoặc được khởi động bằng ensurepip vì chúng là một phần của gói setuptools. Đối với các dự án dựa vào những điều này trong thời gian chạy, dự án setuptools phải được khai báo là phần phụ thuộc và được cài đặt riêng (thường sử dụng pip).

    (Được đóng góp bởi Pradyun Gedam trong gh-95299.)

liệt kê

  • Xóa EnumMeta.__getattr__ của enum, không còn cần thiết để truy cập thuộc tính enum. (Được đóng góp bởi Ethan Furman trong gh-95083.)

ftplib

  • Xóa thuộc tính lớp FTP_TLS.ssl_version của ftplib: thay vào đó hãy sử dụng tham số context. (Được đóng góp bởi Victor Stinner trong gh-94172.)

gzip

  • Xóa thuộc tính filename của gzip.GzipFile của gzip, không được dùng nữa kể từ Python 2.6, thay vào đó hãy sử dụng thuộc tính name. Trong chế độ ghi, thuộc tính filename đã thêm phần mở rộng tệp '.gz' nếu nó không có. (Được đóng góp bởi Victor Stinner trong gh-94196.)

hàm băm

  • Xóa việc triển khai Python thuần túy của hashlib.pbkdf2_hmac() của hashlib, không được dùng nữa trong Python 3.10. Python 3.10 trở lên yêu cầu OpenSSL 1.1.1 (PEP 644): phiên bản OpenSSL này cung cấp triển khai C của pbkdf2_hmac() nhanh hơn. (Được đóng góp bởi Victor Stinner trong gh-94199.)

nhập khẩu

  • Nhiều công việc dọn dẹp trước đây không được dùng nữa trong importlib hiện đã được hoàn thành:

    • Các tham chiếu và hỗ trợ cho module_repr() đã bị xóa. (Được đóng góp bởi Barry Warsaw trong gh-97850.)

    • importlib.util.set_package, importlib.util.set_loaderimportlib.util.module_for_loader đều đã bị xóa. (Được đóng góp bởi Brett Cannon và Nikita Sobolev trong gh-65961gh-97850.)

    • Hỗ trợ cho API find_loader()find_module() đã bị xóa. (Được đóng góp bởi Barry Warsaw trong gh-98040.)

    • importlib.abc.Finder, pkgutil.ImpImporterpkgutil.ImpLoader đã bị xóa. (Được đóng góp bởi Barry Warsaw trong gh-98040.)

imp

  • Mô-đun imp đã bị xóa. (Được đóng góp bởi Barry Warsaw trong gh-98040.)

    Để di chuyển, hãy tham khảo bảng tương ứng sau:

    imp

    nhập khẩu

    imp.NullImporter

    Chèn None vào sys.path_importer_cache

    imp.cache_from_source()

    importlib.util.cache_from_source()

    imp.find_module()

    importlib.util.find_spec()

    imp.get_magic()

    importlib.util.MAGIC_NUMBER

    imp.get_suffixes()

    importlib.machinery.SOURCE_SUFFIXES, importlib.machinery.EXTENSION_SUFFIXESimportlib.machinery.BYTECODE_SUFFIXES

    imp.get_tag()

    sys.implementation.cache_tag

    imp.load_module()

    importlib.import_module()

    imp.new_module(name)

    types.ModuleType(name)

    imp.reload()

    importlib.reload()

    imp.source_from_cache()

    importlib.util.source_from_cache()

    imp.load_source()

    See below

    Thay thế imp.load_source() bằng:

    nhập importlib.util
    nhập importlib.machinery
    
    def Load_source(modname, filename):
        bộ nạp = importlib.machinery.SourceFileLoader(tên mod, tên tệp)
        spec = importlib.util.spec_from_file_location(modname, filename, Loader=loader)
        -đun = importlib.util.module_from_spec(spec)
        -đun # The luôn được thực thi và không được lưu vào bộ đệm trong sys.modules.
        # Uncomment dòng sau để lưu trữ mô-đun.
        # sys.modules[module.__name__] = mô-đun
        Loader.exec_module(-đun)
        -đun trả về
    
  • Xóa các chức năng và thuộc tính imp mà không thay thế:

    • Các chức năng không có giấy tờ:

      • imp.init_builtin()

      • imp.load_compiled()

      • imp.load_dynamic()

      • imp.load_package()

    • imp.lock_held(), imp.acquire_lock(), imp.release_lock(): sơ đồ khóa đã thay đổi trong Python 3.3 thành khóa trên mỗi mô-đun.

    • Hằng số imp.find_module(): SEARCH_ERROR, PY_SOURCE, PY_COMPILED, C_EXTENSION, PY_RESOURCE, PKG_DIRECTORY, C_BUILTIN, PY_FROZEN, PY_CODERESOURCE, IMP_HOOK.

io

  • Xóa io.OpenWrapper_pyio.OpenWrapper của io, không được dùng nữa trong Python 3.10: thay vào đó chỉ cần sử dụng open(). Hàm open() (io.open()) là hàm được tích hợp sẵn. Kể từ Python 3.10, _pyio.open() cũng là một phương thức tĩnh. (Được đóng góp bởi Victor Stinner trong gh-94169.)

ngôn ngữ

  • Xóa hàm locale.format() của locale, không được dùng nữa trong Python 3.7: thay vào đó hãy sử dụng locale.format_string(). (Được đóng góp bởi Victor Stinner trong gh-94226.)

smtpd

  • Mô-đun smtpd đã bị xóa theo lịch trình trong PEP 594, không còn được dùng nữa trong Python 3.4.7 và 3.5.4. Thay vào đó, hãy sử dụng mô-đun aiosmtpd PyPI hoặc bất kỳ máy chủ dựa trên asyncio nào khác. (Được đóng góp bởi Oleg Iarygin trong gh-93243.)

sqlite3

  • Các tính năng sqlite3 không có giấy tờ sau đây, không được dùng nữa trong Python 3.10, hiện đã bị xóa:

    • sqlite3.enable_shared_cache()

    • sqlite3.OptimizedUnicode

    Nếu phải sử dụng bộ nhớ đệm dùng chung, hãy mở cơ sở dữ liệu ở chế độ URI bằng tham số truy vấn cache=shared.

    Nhà máy văn bản sqlite3.OptimizedUnicode là bí danh của str kể từ Python 3.3. Mã trước đây đặt nhà máy văn bản thành OptimizedUnicode có thể sử dụng str một cách rõ ràng hoặc dựa vào giá trị mặc định cũng là str.

    (Được đóng góp bởi Erlend E. Aasland trong gh-92548.)

ssl

  • Xóa hàm ssl.RAND_pseudo_bytes() của ssl, không được dùng nữa trong Python 3.6: thay vào đó hãy sử dụng os.urandom() hoặc ssl.RAND_bytes(). (Được đóng góp bởi Victor Stinner trong gh-94199.)

  • Loại bỏ chức năng ssl.match_hostname(). Nó không được dùng nữa trong Python 3.7. OpenSSL thực hiện khớp tên máy chủ kể từ Python 3.7, Python không còn sử dụng hàm ssl.match_hostname() nữa. (Được đóng góp bởi Victor Stinner trong gh-94199.)

  • Xóa hàm ssl.wrap_socket(), không được dùng nữa trong Python 3.7: thay vào đó, hãy tạo một đối tượng ssl.SSLContext và gọi phương thức ssl.SSLContext.wrap_socket của nó. Gói nào còn sử dụng ssl.wrap_socket() đều bị hỏng và không an toàn. Hàm này không gửi phần mở rộng SNI TLS cũng như không xác thực tên máy chủ của máy chủ. Mã phải tuân theo CWE 295 (Xác thực chứng chỉ không đúng). (Được đóng góp bởi Victor Stinner trong gh-94199.)

nhỏ nhất

trình duyệt web

  • Xóa hỗ trợ cho các trình duyệt lỗi thời khỏi webbrowser. Các trình duyệt bị loại bỏ bao gồm: Grail, Khảm, Netscape, Galeon, Skipstone, Iceape, Firebird và Firefox phiên bản 35 trở xuống (gh-102871).

xml.etree.ElementTree

  • Hãy xóa phương thức ElementTree.Element.copy() của cách triển khai Python thuần túy, không được dùng nữa trong Python 3.10, thay vào đó hãy sử dụng hàm copy.copy(). Việc triển khai C của xml.etree.ElementTree không có phương thức copy(), chỉ có phương thức __copy__(). (Được đóng góp bởi Victor Stinner trong gh-94383.)

nhập khẩu zip

  • Xóa các phương thức find_loader()find_module() của zipimport, không được dùng nữa trong Python 3.10: thay vào đó hãy sử dụng phương thức find_spec(). Xem PEP 451 để biết lý do. (Được đóng góp bởi Victor Stinner trong gh-94379.)

Khác

  • Xóa quy tắc suspicious khỏi tài liệu MakefileDoc/tools/rstlint.py, cả hai đều ủng hộ sphinx-lint. (Được đóng góp bởi Julien Palard trong gh-98179.)

  • Xóa các tham số keyfilecertfile khỏi các mô-đun ftplib, imaplib, poplibsmtplib cũng như các tham số key_file, cert_filecheck_hostname khỏi mô-đun http.client, tất cả đều không được dùng nữa kể từ Python 3.6. Thay vào đó, hãy sử dụng tham số context (ssl_context trong imaplib). (Được đóng góp bởi Victor Stinner trong gh-94172.)

  • Loại bỏ các bản hack tương thích Jython khỏi một số mô-đun và thử nghiệm stdlib. (Được đóng góp bởi Nikita Sobolev trong gh-99482.)

  • Xóa cờ _use_broken_old_ctypes_structure_semantics_ khỏi mô-đun ctypes. (Được đóng góp bởi Nikita Sobolev trong gh-99285.)

Chuyển sang Python 3.12

Phần này liệt kê các thay đổi được mô tả trước đây và các bản sửa lỗi khác có thể yêu cầu thay đổi mã của bạn.

Những thay đổi trong Python API

  • Các quy tắc chặt chẽ hơn hiện được áp dụng cho tham chiếu nhóm số và tên nhóm trong biểu thức chính quy. Hiện chỉ có chuỗi chữ số ASCII được chấp nhận làm tham chiếu số. Tên nhóm trong mẫu byte và chuỗi thay thế giờ đây chỉ có thể chứa các chữ cái, chữ số và dấu gạch dưới ASCII. (Được đóng góp bởi Serhiy Storchaka trong gh-91760.)

  • Xóa chức năng randrange() không được dùng nữa kể từ Python 3.10. Trước đây, randrange(10.0) được chuyển đổi thành randrange(10) một cách dễ dàng. Bây giờ, nó tăng TypeError. Ngoài ra, ngoại lệ được đưa ra cho các giá trị không nguyên như randrange(10.5) hoặc randrange('10') đã được thay đổi từ ValueError thành TypeError. Điều này cũng ngăn ngừa các lỗi trong đó randrange(1e25) sẽ âm thầm chọn từ phạm vi lớn hơn randrange(10**25). (Ban đầu được đề xuất bởi Serhiy Storchaka gh-86388.)

  • argparse.ArgumentParser đã thay đổi mã hóa và trình xử lý lỗi để đọc các đối số từ tệp (ví dụ: tùy chọn fromfile_prefix_chars) từ mã hóa văn bản mặc định (ví dụ: locale.getpreferredencoding(False)) sang filesystem encoding and error handler. Các tệp đối số phải được mã hóa trong UTF-8 thay vì ANSI Codepage trên Windows.

  • Xóa mô-đun smtpd dựa trên asyncore không được dùng nữa trong Python 3.4.7 và 3.5.4. Một sự thay thế được đề xuất là mô-đun PyPI aiosmtpd dựa trên asyncio.

  • shlex.split(): Việc chuyển None cho đối số s hiện đưa ra một ngoại lệ, thay vì đọc sys.stdin. Tính năng này không được dùng nữa trong Python 3.9. (Được đóng góp bởi Victor Stinner trong gh-94352.)

  • Mô-đun os không còn chấp nhận các đường dẫn giống byte, như loại bytearraymemoryview: chỉ loại bytes chính xác được chấp nhận cho chuỗi byte. (Được đóng góp bởi Victor Stinner trong gh-98393.)

  • syslog.openlog()syslog.closelog() hiện không thành công nếu được sử dụng trong trình thông dịch phụ. syslog.syslog() vẫn có thể được sử dụng trong trình thông dịch phụ, nhưng bây giờ chỉ khi syslog.openlog() đã được gọi trong trình thông dịch chính. Những hạn chế mới này không áp dụng cho trình thông dịch chính nên chỉ một nhóm rất nhỏ người dùng có thể bị ảnh hưởng. Thay đổi này giúp cách ly trình thông dịch. Hơn nữa, syslog là một trình bao bọc xung quanh các tài nguyên toàn cầu quy trình, được quản lý tốt nhất từ ​​trình thông dịch chính. (Được đóng góp bởi Donghee Na trong gh-99127.)

  • Hành vi khóa không có giấy tờ của cached_property() bị xóa vì nó bị khóa trên tất cả các phiên bản của lớp, dẫn đến xung đột khóa cao. Điều này có nghĩa là hàm getter thuộc tính được lưu trong bộ nhớ cache giờ đây có thể chạy nhiều lần cho một phiên bản, nếu hai luồng chạy đua. Đối với hầu hết các thuộc tính được lưu trong bộ nhớ đệm đơn giản (ví dụ: các thuộc tính bình thường và chỉ cần tính giá trị dựa trên các thuộc tính khác của phiên bản), điều này sẽ ổn. Nếu cần đồng bộ hóa, hãy triển khai khóa trong chức năng lấy thuộc tính được lưu trong bộ nhớ đệm hoặc xung quanh các điểm truy cập đa luồng.

  • sys._current_exceptions() hiện trả về ánh xạ từ thread-id đến một phiên bản ngoại lệ, thay vì tới bộ dữ liệu (typ, exc, tb). (Được đóng góp bởi Irit Katriel trong gh-103176.)

  • Khi giải nén các tệp tar bằng tarfile hoặc shutil.unpack_archive(), hãy chuyển đối số filter để hạn chế các tính năng có thể gây bất ngờ hoặc nguy hiểm. Xem Bộ lọc trích xuất để biết chi tiết.

  • Đầu ra của các hàm tokenize.tokenize()tokenize.generate_tokens() hiện đã thay đổi do những thay đổi được đưa ra trong PEP 701. Điều này có nghĩa là các mã thông báo STRING không còn được phát ra cho chuỗi f nữa và các mã thông báo được mô tả trong PEP 701 hiện được tạo thay thế: FSTRING_START, FSTRING_MIDDLEFSTRING_END hiện được phát ra cho các phần "chuỗi" chuỗi f ngoài các mã thông báo thích hợp để mã hóa trong các thành phần biểu thức. Ví dụ: đối với chuỗi f f"start {1+1} end", phiên bản cũ của mã thông báo đã phát ra

    1,0-1,18: STRING 'f"bắt đầu {1+1} kết thúc"'
    

    trong khi phiên bản mới phát ra

    1,0-1,2: FSTRING_START 'f"'
    1,2-1,8: FSTRING_MIDDLE 'bắt đầu'
    1,8-1,9: OP '{'
    1,9-1,10: NUMBER '1'
    1,10-1,11: OP '+'
    1,11-1,12: NUMBER '1'
    1,12-1,13: OP '}'
    1,13-1,17: FSTRING_MIDDLE 'kết thúc'
    1,17-1,18: FSTRING_END'"'
    

    Ngoài ra, có thể có một số thay đổi nhỏ về hành vi do những thay đổi cần thiết để hỗ trợ PEP 701. Một số thay đổi này bao gồm:

    • Thuộc tính type của mã thông báo được phát ra khi mã hóa một số ký tự Python không hợp lệ như ! đã thay đổi từ ERRORTOKEN thành OP.

    • Giờ đây, các chuỗi một dòng chưa hoàn chỉnh cũng tăng tokenize.TokenError như các chuỗi nhiều dòng chưa hoàn chỉnh.

    • Một số mã Python không đầy đủ hoặc không hợp lệ hiện tăng tokenize.TokenError thay vì trả về mã thông báo ERRORTOKEN tùy ý khi mã hóa nó.

    • Việc trộn các tab và dấu cách dưới dạng thụt lề trong cùng một tệp không được hỗ trợ nữa và sẽ tạo ra TabError.

  • Mô-đun threading hiện mong đợi mô-đun _thread có thuộc tính _is_main_interpreter. Đây là một hàm không có đối số trả về True nếu trình thông dịch hiện tại là trình thông dịch chính.

    Bất kỳ thư viện hoặc ứng dụng nào cung cấp mô-đun _thread tùy chỉnh đều phải cung cấp _is_main_interpreter(). (Xem gh-112826.)

Xây dựng thay đổi

  • Python không còn sử dụng setup.py để xây dựng các mô-đun mở rộng C dùng chung. Các tham số xây dựng như tiêu đề và thư viện được phát hiện trong tập lệnh configure. Tiện ích mở rộng được xây dựng bởi Makefile. Hầu hết các tiện ích mở rộng đều sử dụng pkg-config và quay lại phát hiện thủ công. (Được đóng góp bởi Christian Heimes trong gh-93939.)

  • va_start() với hai tham số, như va_start(args, format), hiện được yêu cầu để xây dựng Python. va_start() không còn được gọi với một tham số duy nhất. (Được đóng góp bởi Kumar Aditya trong gh-93207.)

  • CPython hiện sử dụng tùy chọn ThinLTO làm chính sách tối ưu hóa thời gian liên kết mặc định nếu trình biên dịch Clang chấp nhận cờ. (Được đóng góp bởi Donghee Na trong gh-89536.)

  • Thêm biến COMPILEALL_OPTS trong Makefile để ghi đè các tùy chọn compileall (mặc định: -j0) trong make install. Đồng thời hợp nhất 3 lệnh compileall thành một lệnh duy nhất để xây dựng các tệp .pyc cho tất cả các mức tối ưu hóa (0, 1, 2) cùng một lúc. (Được đóng góp bởi Victor Stinner trong gh-99289.)

  • Thêm bộ ba nền tảng cho LoongArch 64-bit:

    • loongarch64-linux-gnusf

    • loongarch64-linux-gnuf32

    • loongarch64-linux-gnu

    (Được đóng góp bởi Zhang Na trong gh-90656.)

  • PYTHON_FOR_REGEN hiện yêu cầu Python 3.10 hoặc mới hơn.

  • Autoconf 2.71 và aclocal 1.16.4 hiện được yêu cầu để tạo lại configure. (Được đóng góp bởi Christian Heimes trong gh-89886.)

  • Bản dựng Windows và trình cài đặt macOS từ python.org hiện sử dụng OpenSSL 3.0.

C API Thay đổi

Tính năng mới

  • PEP 697: Giới thiệu Unstable C API tier, dành cho các công cụ cấp thấp như trình gỡ lỗi và trình biên dịch JIT. Zz004zz này có thể thay đổi trong mỗi bản phát hành nhỏ của CPython mà không có cảnh báo ngừng sử dụng. Nội dung của nó được đánh dấu bằng tiền tố PyUnstable_ trong tên.

    Các hàm tạo đối tượng mã:

    • PyUnstable_Code_New() (đổi tên từ PyCode_New)

    • PyUnstable_Code_NewWithPosOnlyArgs() (đổi tên từ PyCode_NewWithPosOnlyArgs)

    Dung lượng bổ sung cho các đối tượng mã (PEP 523):

    • PyUnstable_Eval_RequestCodeExtraIndex() (đổi tên từ _PyEval_RequestCodeExtraIndex)

    • PyUnstable_Code_GetExtra() (đổi tên từ _PyCode_GetExtra)

    • PyUnstable_Code_SetExtra() (đổi tên từ _PyCode_SetExtra)

    Tên ban đầu sẽ tiếp tục có sẵn cho đến khi API tương ứng thay đổi.

    (Được đóng góp bởi Petr Viktorin trong gh-101101.)

  • PEP 697: Thêm API để mở rộng các loại có bố cục bộ nhớ phiên bản mờ:

    (Được đóng góp bởi Petr Viktorin trong gh-103509.)

  • Thêm hàm limited C API mới PyType_FromMetaclass(), hàm này tổng quát hóa PyType_FromModuleAndSpec() hiện có bằng cách sử dụng đối số siêu dữ liệu bổ sung. (Được đóng góp bởi Wenzel Jakob trong gh-93012.)

  • API để tạo các đối tượng có thể được gọi bằng the vectorcall protocol đã được thêm vào Limited API:

    Cờ Py_TPFLAGS_HAVE_VECTORCALL hiện đã bị xóa khỏi một lớp khi phương thức __call__() của lớp đó được gán lại. Điều này làm cho vectorcall an toàn khi sử dụng với các loại có thể thay đổi (tức là các loại heap không có cờ bất biến, Py_TPFLAGS_IMMUTABLETYPE). Các loại có thể thay đổi không ghi đè tp_call hiện kế thừa cờ Py_TPFLAGS_HAVE_VECTORCALL. (Được đóng góp bởi Petr Viktorin trong gh-93274.)

    Cờ Py_TPFLAGS_MANAGED_DICTPy_TPFLAGS_MANAGED_WEAKREF đã được thêm vào. Điều này cho phép các lớp tiện ích mở rộng hỗ trợ đối tượng __dict__ và các điểm yếu với ít sổ sách kế toán hơn, sử dụng ít bộ nhớ hơn và truy cập nhanh hơn.

  • API để thực hiện cuộc gọi bằng the vectorcall protocol đã được thêm vào Limited API:

    Điều này có nghĩa là cả đầu vào và đầu ra của giao thức cuộc gọi vectơ hiện đều có sẵn trong Limited API. (Được đóng góp bởi Wenzel Jakob trong gh-98586.)

  • Thêm hai hàm công khai mới, PyEval_SetProfileAllThreads()PyEval_SetTraceAllThreads(), cho phép thiết lập các hàm theo dõi và lập hồ sơ trong tất cả các luồng đang chạy ngoài luồng đang gọi. (Được đóng góp bởi Pablo Galindo trong gh-93503.)

  • Thêm hàm mới PyFunction_SetVectorcall() vào C API để đặt trường vectorcall của PyFunctionObject nhất định. (Được đóng góp bởi Andrew Frost trong gh-92257.)

  • C API hiện cho phép đăng ký lệnh gọi lại thông qua PyDict_AddWatcher(), PyDict_Watch() và các API liên quan bất cứ khi nào từ điển được sửa đổi. Điều này được thiết kế để sử dụng bằng cách tối ưu hóa trình thông dịch, trình biên dịch JIT hoặc trình gỡ lỗi. (Được đóng góp bởi Carl Meyer trong gh-91052.)

  • Thêm PyType_AddWatcher()PyType_Watch() API để đăng ký cuộc gọi lại nhằm nhận thông báo về các thay đổi đối với một loại. (Được đóng góp bởi Carl Meyer trong gh-91051.)

  • Thêm API PyCode_AddWatcher()PyCode_ClearWatcher() để đăng ký lệnh gọi lại nhằm nhận thông báo về việc tạo và hủy đối tượng mã. (Được đóng góp bởi Itamar Oren trong gh-91054.)

  • Thêm các hàm PyFrame_GetVar()PyFrame_GetVarString() để lấy biến khung theo tên của nó. (Được đóng góp bởi Victor Stinner trong gh-91248.)

  • Thêm PyErr_GetRaisedException()PyErr_SetRaisedException() để lưu và khôi phục ngoại lệ hiện tại. Các hàm này trả về và chấp nhận một đối tượng ngoại lệ duy nhất, thay vì ba đối số của PyErr_Fetch()PyErr_Restore() hiện không được dùng nữa. Điều này ít xảy ra lỗi hơn và hiệu quả hơn một chút. (Được đóng góp bởi Mark Shannon trong gh-101578.)

  • Thêm _PyErr_ChainExceptions1, lấy một phiên bản ngoại lệ, để thay thế API _PyErr_ChainExceptions cũ, hiện không được dùng nữa. (Được đóng góp bởi Mark Shannon trong gh-101578.)

  • Thêm PyException_GetArgs()PyException_SetArgs() làm các hàm tiện lợi để truy xuất và sửa đổi args được truyền cho hàm tạo của ngoại lệ. (Được đóng góp bởi Mark Shannon trong gh-101578.)

  • Thêm PyErr_DisplayException(), lấy một phiên bản ngoại lệ, để thay thế PyErr_Display() cũ. (Được đóng góp bởi Irit Katriel trong gh-102755).

  • PEP 683: Giới thiệu Immortal Objects, cho phép các đối tượng bỏ qua số lượng tham chiếu và các thay đổi liên quan đến C-API:

    • _Py_IMMORTAL_REFCNT: Số tham chiếu xác định một đối tượng

      như bất tử.

    • _Py_IsImmortal Kiểm tra xem một đối tượng có số lượng tham chiếu bất tử hay không.

    • PyObject_HEAD_INIT Điều này bây giờ sẽ khởi tạo số tham chiếu thành

      _Py_IMMORTAL_REFCNT khi được sử dụng với Py_BUILD_CORE.

    • SSTATE_INTERNED_IMMORTAL Mã định danh cho các đối tượng unicode được thực hiện

      đó là bất tử.

    • SSTATE_INTERNED_IMMORTAL_STATIC Một mã định danh cho unicode thực tập

      những vật thể bất tử và tĩnh tại

    • sys.getunicodeinternedsize Điều này trả về tổng số unicode

      các đối tượng đã được thực tập. Điều này hiện cần thiết để refleak.py theo dõi chính xác số lượng tham chiếu và các khối được phân bổ

    (Được đóng góp bởi Eddie Elizondo trong gh-84436.)

  • PEP 684: Thêm chức năng Py_NewInterpreterFromConfig() mới và PyInterpreterConfig, có thể được sử dụng để tạo trình thông dịch phụ với GIL của riêng chúng. (Xem PEP 684: Một phiên dịch viên GIL để biết thêm thông tin.) (Được đóng góp bởi Eric Snow trong gh-104110.)

  • Trong phiên bản giới hạn C API 3.12, các hàm Py_INCREF()Py_DECREF() hiện được triển khai dưới dạng lệnh gọi hàm mờ để ẩn chi tiết triển khai. (Được đóng góp bởi Victor Stinner trong gh-105387.)

Chuyển sang Python 3.12

  • API Unicode kế thừa dựa trên biểu diễn Py_UNICODE* đã bị xóa. Vui lòng di chuyển sang API dựa trên UTF-8 hoặc wchar_t*.

  • Các hàm phân tích đối số như PyArg_ParseTuple() không hỗ trợ định dạng dựa trên Py_UNICODE* (ví dụ: u, Z) nữa. Vui lòng chuyển sang các định dạng khác cho Unicode như s, z, esU.

  • tp_weaklist cho tất cả các kiểu dựng sẵn tĩnh luôn là NULL. Đây là trường chỉ dành cho nội bộ trên PyTypeObject nhưng chúng tôi đang chỉ ra sự thay đổi trong trường hợp ai đó tình cờ truy cập trực tiếp vào trường này. Để tránh bị hỏng, hãy cân nhắc sử dụng C-API công khai hiện có hoặc nếu cần, macro _PyObject_GET_WEAKREFS_LISTPTR() (chỉ dành cho nội bộ).

  • Z000zz chỉ dành cho nội bộ này hiện có thể không phải là con trỏ đối tượng hợp lệ. Loại của nó đã được đổi thành void* để phản ánh điều này. Chúng tôi đề cập đến điều này trong trường hợp ai đó tình cờ truy cập trực tiếp vào trường chỉ dành cho nội bộ.

    Để có danh sách các lớp con, hãy gọi phương thức Python __subclasses__() (ví dụ: sử dụng PyObject_CallMethod()).

  • Thêm hỗ trợ nhiều tùy chọn định dạng hơn (căn lề trái, bát phân, thập lục phân viết hoa, intmax_t, ptrdiff_t, wchar_t chuỗi C, độ rộng và độ chính xác thay đổi) trong PyUnicode_FromFormat()PyUnicode_FromFormatV(). (Được đóng góp bởi Serhiy Storchaka trong gh-98836.)

  • Một ký tự định dạng không được nhận dạng trong PyUnicode_FromFormat()PyUnicode_FromFormatV() hiện đặt SystemError. Trong các phiên bản trước, nó khiến tất cả phần còn lại của chuỗi định dạng được sao chép nguyên trạng vào chuỗi kết quả và mọi đối số bổ sung sẽ bị loại bỏ. (Được đóng góp bởi Serhiy Storchaka trong gh-95781.)

  • Sửa sai vị trí ký hiệu trong PyUnicode_FromFormat()PyUnicode_FromFormatV(). (Được đóng góp bởi Philip Georgi trong gh-95504.)

  • Các lớp mở rộng muốn thêm một khe tham chiếu __dict__ hoặc yếu nên sử dụng Py_TPFLAGS_MANAGED_DICTPy_TPFLAGS_MANAGED_WEAKREF thay vì tp_dictoffsettp_weaklistoffset tương ứng. Việc sử dụng tp_dictoffsettp_weaklistoffset vẫn được hỗ trợ, nhưng không hỗ trợ đầy đủ đa kế thừa (gh-95589) và hiệu suất có thể kém hơn. Các lớp khai báo Py_TPFLAGS_MANAGED_DICT phải gọi _PyObject_VisitManagedDict()_PyObject_ClearManagedDict() để duyệt qua và xóa từ điển của phiên bản của chúng. Để xóa các điểm yếu, hãy gọi PyObject_ClearWeakRefs() như trước.

  • Hàm PyUnicode_FSDecoder() không còn chấp nhận các đường dẫn giống byte, như loại bytearraymemoryview: chỉ loại bytes chính xác mới được chấp nhận cho chuỗi byte. (Được đóng góp bởi Victor Stinner trong gh-98393.)

  • Các macro Py_CLEAR, Py_SETREFPy_XSETREF hiện chỉ đánh giá các đối số của chúng một lần. Nếu một đối số có tác dụng phụ thì những tác dụng phụ này sẽ không còn bị trùng lặp nữa. (Được đóng góp bởi Victor Stinner trong gh-98724.)

  • Chỉ báo lỗi của trình thông dịch giờ đây luôn được chuẩn hóa. Điều này có nghĩa là PyErr_SetObject(), PyErr_SetString() và các hàm khác đặt chỉ báo lỗi hiện đã bình thường hóa ngoại lệ trước khi lưu trữ nó. (Được đóng góp bởi Mark Shannon trong gh-101578.)

  • _Py_RefTotal không còn có thẩm quyền nữa và chỉ được giữ lại để tương thích với ABI. Lưu ý rằng đây là bản toàn cầu nội bộ và chỉ khả dụng trên các bản dựng gỡ lỗi. Nếu bạn tình cờ sử dụng nó thì bạn sẽ cần bắt đầu sử dụng _Py_GetGlobalRefTotal().

  • Các hàm sau bây giờ chọn một siêu dữ liệu thích hợp cho loại mới được tạo:

    Việc tạo các lớp có siêu dữ liệu ghi đè tp_new không được dùng nữa và trong Python 3.14+, việc này sẽ không được phép. Lưu ý rằng các hàm này bỏ qua tp_new của siêu dữ liệu, có thể cho phép khởi tạo không đầy đủ.

    Lưu ý rằng PyType_FromMetaclass() (được thêm vào Python 3.12) đã không cho phép tạo các lớp có siêu dữ liệu ghi đè tp_new (__new__() trong Python).

    tp_new ghi đè hầu hết mọi thứ mà hàm PyType_From* thực hiện nên cả hai đều không tương thích với nhau. Hành vi hiện tại -- bỏ qua siêu dữ liệu trong một số bước tạo kiểu -- nói chung là không an toàn, vì các lớp (meta) cho rằng tp_new đã được gọi. Không có cách giải quyết chung đơn giản. Một trong những điều sau đây có thể phù hợp với bạn:

    • Nếu bạn kiểm soát siêu dữ liệu, hãy tránh sử dụng tp_new trong đó:

      • Nếu có thể bỏ qua quá trình khởi tạo thì thay vào đó, nó có thể được thực hiện trong tp_init.

      • Nếu siêu dữ liệu không cần được khởi tạo từ Python, hãy đặt tp_new của nó thành NULL bằng cờ Py_TPFLAGS_DISALLOW_INSTANTIATION. Điều này làm cho chức năng PyType_From* có thể chấp nhận được.

    • Tránh các hàm PyType_From*: nếu bạn không cần các tính năng dành riêng cho C (khe hoặc cài đặt kích thước phiên bản), hãy tạo các loại bằng siêu dữ liệu calling.

    • Nếu bạn know thì tp_new có thể được bỏ qua một cách an toàn, hãy lọc cảnh báo không dùng nữa bằng cách sử dụng warnings.catch_warnings() từ Python.

  • PyOS_InputHookPyOS_ReadlineFunctionPointer không còn được gọi trong subinterpreters nữa. Điều này là do máy khách thường dựa vào trạng thái toàn cầu của toàn bộ quy trình (vì các lệnh gọi lại này không có cách nào khôi phục trạng thái mô-đun mở rộng).

    Điều này cũng tránh được tình huống trong đó các tiện ích mở rộng có thể chạy trong một trình thông dịch phụ mà chúng không hỗ trợ (hoặc chưa được tải vào). Xem gh-104668 để biết thêm thông tin.

  • PyLongObject đã được thay đổi phần bên trong để có hiệu suất tốt hơn. Mặc dù phần bên trong của PyLongObject là riêng tư nhưng chúng được một số mô-đun mở rộng sử dụng. Các trường nội bộ sẽ không còn được truy cập trực tiếp nữa, thay vào đó, nên sử dụng các hàm API bắt đầu từ PyLong_.... Hai hàm unstable API mới được cung cấp để truy cập hiệu quả vào giá trị của PyLongObjects phù hợp với một từ máy duy nhất:

  • Bộ cấp phát tùy chỉnh, được đặt qua PyMem_SetAllocator(), hiện được yêu cầu phải đảm bảo an toàn cho luồng, bất kể miền bộ nhớ. Các bộ cấp phát không có trạng thái riêng, bao gồm cả "hook", sẽ không bị ảnh hưởng. Nếu bộ cấp phát tùy chỉnh của bạn chưa an toàn theo luồng và bạn cần hướng dẫn thì vui lòng tạo một vấn đề GitHub mới và CC @ericsnowcurrently.

Không được dùng nữa

Đang chờ xóa trong Python 3.14

Đang chờ xóa trong Python 3.15

Đang chờ xóa trong Python 3.16

  • Bản sao đi kèm của libmpdec.

Đang chờ xóa trong các phiên bản sau

Các API sau không còn được dùng nữa và sẽ bị xóa, mặc dù hiện tại chưa có ngày dự kiến xóa chúng.

Đã xóa

  • Xóa tệp tiêu đề token.h. Chưa bao giờ có bất kỳ tokenizer công khai nào C API. Tệp tiêu đề token.h chỉ được thiết kế để sử dụng cho nội bộ Python. (Được đóng góp bởi Victor Stinner trong gh-92651.)

  • API Unicode cũ đã bị xóa. Xem PEP 623 để biết chi tiết.

    • PyUnicode_WCHAR_KIND

    • PyUnicode_AS_UNICODE()

    • PyUnicode_AsUnicode()

    • PyUnicode_AsUnicodeAndSize()

    • PyUnicode_AS_DATA()

    • PyUnicode_FromUnicode()

    • PyUnicode_GET_SIZE()

    • PyUnicode_GetSize()

    • PyUnicode_GET_DATA_SIZE()

  • Loại bỏ macro chức năng PyUnicode_InternImmortal(). (Được đóng góp bởi Victor Stinner trong gh-85858.)