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 os và pathlib đã 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 syntax và type mới cải thiện tính tiện dụng khi sử dụng generic types và type 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 Reference và Language 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:
Các tính năng ngữ pháp mới:
Cải tiến trình thông dịch:
PEP 669, giám sát tác động thấp
Improved 'Did you mean ...' suggestions cho các ngoại lệ
NameError,ImportErrorvàSyntaxError
Cải tiến mô hình dữ liệu Python:
PEP 688, sử dụng buffer protocol từ Python
Những cải tiến đáng kể trong thư viện tiêu chuẩn:
Lớp
pathlib.Pathhiện hỗ trợ phân lớpMô-đun
osđã nhận được một số cải tiến để hỗ trợ WindowsMột command-line interface đã được thêm vào mô-đun
sqlite3Kiểm tra
isinstance()vớiruntime-checkable protocolsđược tăng tốc từ hai đến 20 lầnGói
asynciođã có một số cải tiến về hiệu suất, với một số điểm chuẩn cho thấy tốc độ tăng 75%.Một command-line interface đã được thêm vào mô-đun
uuidDo những thay đổi trong PEP 701, việc tạo mã thông báo thông qua mô-đun
tokenizenhanh hơn tới 64%.
Cải tiến bảo mật:
Thay thế các triển khai
hashlibdự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:
Cải tiến triển khai CPython:
PEP 709, nội tuyến hiểu
CPython support cho trình lược tả
perfcủa LinuxTriể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:
PEP 698, trang trí
typing.override()
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
wstrkhỏ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ượngstrí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ấpdistutils, 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
setuptoolstrong môi trường ảo được tạo bằngvenv. Điều này có nghĩa làdistutils,setuptools,pkg_resourcesvàeasy_installsẽ không còn khả dụng theo mặc định; để truy cập các lệnh chạypip install setuptoolsnày trong môi trường ảo activated.Các mô-đun
asynchat,asyncorevàimpđã bị xóa cùng với một sốunittest.TestCasemethod 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 classes và functions:
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 có:
...
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:
gõ Điểm = tuple[float, float]
Bí danh loại cũng có thể là generic:
gõ Điểm[T] = tuple[T, T]
Cú pháp mới cho phép khai báo tham số TypeVarTuple và ParamSpec, cũng như tham số TypeVar có giới hạn hoặc ràng buộc:
gõ IntFunc[**P] = Có thể gọi được[P, int] # ParamSpec
gõ LabeledTuple[*Ts] = tuple[str, *Ts] # TypeVarTuple
loại HashableSequence[T: Hashable] = Sequence[T] # TypeVar có giới hạn
gõ 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\Nmà 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
symtablesẽ 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.0tổ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ếuNameErrorđượ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ồmself.<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
SyntaxErrorkhi người dùng gõimport x from ythay 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ệnhfrom <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
SyntaxErrorkhi 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 raSyntaxWarning("\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,SyntaxErrorcuố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 raSyntaxWarning, 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 chobhiệ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ởiRuntimeErrornữ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ộExceptionGroupvà đưa ra một ngoại lệ khác, ngoại lệ đó không còn được bao bọc trongExceptionGroupnữ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ỉ
boolvàint. (Được đóng góp bởi Serhiy Storchaka trong gh-60203.)memoryviewhiệ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
slicehiệ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ăngSyntaxErrorthay vìValueErrorkhi 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
tarfilevàshutil.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.MappingProxyTypehiệ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
PYTHONPERFSUPPORTvà tùy chọn dòng lệnh-X perf, cũng như các hàmsys.activate_stack_trampoline(),sys.deactivate_stack_trampoline()và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¶
Lớp
array.arrayhiện hỗ trợ đăng ký, biến nó thành generic type. (Được đóng góp bởi Jelle Zijlstra trong gh-98658.)
asyncio¶
Hiệu suất ghi vào ổ cắm trong
asynciođã được cải thiện đáng kể.asynciohiện tránh việc sao chép không cần thiết khi ghi vào ổ cắm và sử dụngsendmsg()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()và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-104140 và gh-104138)Trên Linux,
asynciosử dụngasyncio.PidfdChildWatchertheo mặc định nếuos.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.PidfdChildWatchernếu được hỗ trợ vàasyncio.ThreadedChildWatchernế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ềFalsecho các trình tạo vìasynciokhô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()và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¶
Thêm enum
calendar.Monthvàcalendar.Dayxác định các tháng trong năm và các ngày trong tuần. (Được đóng góp bởi Hoàng tử Roshan trong gh-103636.)
csv¶
Thêm cờ
csv.QUOTE_NOTNULLvàcsv.QUOTE_STRINGSđể cung cấp khả năng kiểm soát chi tiết hơn đối vớiNonevà các chuỗi trống của các đối tượngreadervàwriter.
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_ARGUMENTvẫ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ậpdis.hasargmớ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.Fractionhiện hỗ trợ định dạng kiểu float. (Được đóng góp bởi Mark Dickinson trong gh-100161.)
importlib.resource¶
importlib.resources.as_file()hiện hỗ trợ các thư mục tài nguyên. (Được đóng góp bởi Jason R. Coombs trong gh-97930.)Đổi tên tham số đầu tiên của
importlib.resources.files()thành anchor. (Được đóng góp bởi Jason R. Coombs trong gh-100598.)
kiểm tra¶
Thêm
inspect.markcoroutinefunction()để đánh dấu các hàm đồng bộ hóa trả về coroutine để sử dụng vớiinspect.iscoroutinefunction(). (Được đóng góp bởi Carlton Gibson trong gh-99247.)Thêm
inspect.getasyncgenstate()vàinspect.getasyncgenlocals()để xác định trạng thái hiện tại của máy phát không đồng bộ. (Được đóng góp bởi Thomas Krennwallner trong gh-79940.)Hiệu suất của
inspect.getattr_static()đã được cải thiện đáng kể. Hầu hết các lệnh gọi hàm phải nhanh hơn ít nhất gấp 2 lần so với trong Python 3.11. (Được đóng góp bởi Alex Waygood trong gh-103193.)
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.DirEntryhiện bao gồm phương thứcos.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()và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()vàos.lstat()hiện chính xác hơn trên Windows. Trườngst_birthtimehiện sẽ chứa thời gian tạo tệp vàst_ctimekhô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_devcó thể lên tới 64 bit vàst_inolên tới 128 bit tùy thuộc vào hệ thống tệp của bạn vàst_rdevluô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¶
Thêm hỗ trợ cho phân lớp
pathlib.PurePathvàpathlib.Path, cùng với các biến thể dành riêng cho Posix và Windows của chúng. Các lớp con có thể ghi đè phương thứcpathlib.PurePath.with_segments()để truyền thông tin giữa các phiên bản đường dẫn.Thêm
pathlib.Path.walk()để duyệt cây thư mục và tạo tất cả tên tệp hoặc thư mục trong đó, tương tự nhưos.walk(). (Được đóng góp bởi Stanislav Zmiev trong gh-90385.)Thêm tham số tùy chọn walk_up vào
pathlib.PurePath.relative_to()để cho phép chèn các mục..vào kết quả; hành vi này phù hợp hơn vớios.path.relpath(). (Được đóng góp bởi Domenico Ragusa trong gh-84538.)Thêm
pathlib.Path.is_junction()làm proxy choos.path.isjunction(). (Được đóng góp bởi Charles Machalow trong gh-99547.)Thêm tham số tùy chọn case_sensitive vào
pathlib.Path.glob(),pathlib.Path.rglob()vàpathlib.PurePath.match()để khớp với độ phân biệt chữ hoa chữ thường của đường dẫn, cho phép kiểm soát chính xác hơn quá trình khớp.
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¶
Thêm
random.binomialvariate(). (Được đóng góp bởi Raymond Hettinger trong gh-81620.)Thêm mặc định
lambd=1.0vàorandom.expovariate(). (Được đóng góp bởi Raymond Hettinger trong gh-100234.)
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ọiNeedCurrentDirectoryForExePathWkhi 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ừPATHEXTtrướ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êm một command-line interface. (Được đóng góp bởi Erlend E. Aasland trong gh-77617.)
Thêm thuộc tính
sqlite3.Connection.autocommitvàosqlite3.Connectionvà tham số autocommit vàosqlite3.connect()để kiểm soát transaction handling tuân thủ PEP 249. (Được đóng góp bởi Erlend E. Aasland trong gh-83638.)Thêm tham số chỉ từ khóa entrypoint vào
sqlite3.Connection.load_extension()để ghi đè điểm nhập tiện ích mở rộng SQLite. (Được đóng góp bởi Erlend E. Aasland trong gh-103015.)Thêm
sqlite3.Connection.getconfig()vàsqlite3.Connection.setconfig()vàosqlite3.Connectionđể thực hiện thay đổi cấu hình cho kết nối cơ sở dữ liệu. (Được đóng góp bởi Erlend E. Aasland trong gh-103489.)
thống kê¶
Mở rộng
statistics.correlation()để đưa vào dưới dạng phương pháprankedđể 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()và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_excchứ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_valuevàsys.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()và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.NamedTemporaryFilecó 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¶
Thêm
threading.settrace_all_threads()vàthreading.setprofile_all_threads()cho phép thiết lập các chức năng 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.)
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), ...và[(x1, y1), (x2, y2), ...]), giống như các phương thứccreate_*(). (Được đóng góp bởi Serhiy Storchaka trong gh-94473.)
mã hóa¶
Mô-đun
tokenizebao 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ô-đuntokenize.
các loại¶
Thêm
types.get_original_bases()để cho phép xem xét sâu hơn về Các loại chung do người dùng xác định khi được phân lớp con. (Được đóng góp bởi James Hilton-Balfe và Alex Waygood trong gh-101827.)
đánh máy¶
isinstance()kiểm traruntime-checkable protocolshiện sử dụnginspect.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 traisinstance()đố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ớiruntime-checkable protocolsđã thay đổi đáng kể. Hầu hết các lần kiểm traisinstance()đố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-74690 và gh-103193.)Tất cả các lớp
typing.TypedDictvàtyping.NamedTuplehiệ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_defaultvàotyping.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¶
Thêm một command-line interface. (Được đóng góp bởi Adam Chhina trong gh-88597.)
Tối ưu hóa¶
Xóa các thành viên
wstrvàwstr_lengthkhỏ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()vàre.subn()và các phương thứcre.Patterntươ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.Taskbằ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()và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ô-đuntokenize. (Đượ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ệnhLOAD_SUPER_ATTRmớ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àoLOAD_ATTR.LOAD_ATTRbây giờ sẽ hoạt động giống như lệnhLOAD_METHODcũ 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_POPvàJUMP_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_SLICEvàSTORE_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_CLEARnhư 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_GLOBALSvàLOAD_LOCALSnhư một phần của quá trình triển khai PEP 695. Xóa opcodeLOAD_CLASSDEREF, có thể thay thế bằngLOAD_LOCALScộng vớiLOAD_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, choices và metavar củaargparse.BooleanOptionalActionkhô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ăngastsau đây không được dùng nữa trong tài liệu kể từ Python 3.8, hiện khiếnDeprecationWarningđượ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.Numast.Strast.Bytesast.NameConstantast.Ellipsis
Thay vào đó hãy sử dụng
ast.Constant. (Được đóng góp bởi Serhiy Storchaka trong gh-90953.)-
Các lớp trình giám sát con
asyncio.MultiLoopChildWatcher,asyncio.FastChildWatcher,asyncio.AbstractChildWatchervàasyncio.SafeChildWatcherkhô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()và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 raDeprecationWarningnế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.Januaryvàcalendar.Februarykhông được dùng nữa và được thay thế bằngcalendar.JANUARYvàcalendar.FEBRUARY. (Được đóng góp bởi Hoàng tử Roshan trong gh-103636.)collections.abc:collections.abc.ByteStringkhông được dùng nữa.Sử dụng
isinstance(obj, collections.abc.Buffer)để kiểm tra xemobjcó triển khai buffer protocol khi chạy hay không. Để sử dụng trong chú thích loại, hãy sử dụngBufferhoặ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).ByteStringban đầ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ảbytesvàbytearray. 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ủaByteStringchư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ưmemoryviewcũng không bao giờ được hiểu là kiểu con củaByteString(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()vàutcfromtimestamp()củadatetime.datetimekhô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ọinow()vàfromtimestamp()với tham số tz được đặt thànhdatetime.UTC. (Được đóng góp bởi Paul Ganssle trong gh-103857.)email: Không dùng tham số isdst trongemail.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.ResourceReaderimportlib.abc.Traversableimportlib.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 độngmultiprocessingmặ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 APIget_context()hoặcset_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()và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ụngimportlib.util.find_spec(). (Được đóng góp bởi Nikita Sobolev trong gh-97850.)pty: Mô-đun này có hai hàmmaster_open()vàslave_open()không có giấy tờ, không được dùng nữa kể từ Python 2 nhưng chỉ đạt đượcDeprecationWarningthí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ởios.stat()và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ườngst_birthtimemớ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 raDeprecationWarningkhi 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ệuos.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
multiprocessinghoặcconcurrent.futures, cách khắc phục là sử dụng phương thức khởi độngmultiprocessingkhác như"spawn"hoặc"forkserver".shutil: Đối số onerror củashutil.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.)-
default adapters and converters hiện không được dùng nữa. Thay vào đó, hãy sử dụng Công thức chuyển đổi và chuyển đổi và điều chỉnh chúng theo nhu cầu của bạn. (Được đóng góp bởi Erlend E. Aasland trong gh-90016.)
Trong
execute(),DeprecationWarninghiện được phát ra khi named placeholders được sử dụng cùng với các tham số được cung cấp dưới dạng sequence thay vìdict. Bắt đầu từ Python 3.14, việc sử dụng trình giữ chỗ được đặt tên với các tham số được cung cấp dưới dạng chuỗi sẽ tạo raProgrammingError. (Được đóng góp bởi Erlend E. Aasland trong gh-101698.)
sys: Các trườngsys.last_type,sys.last_valuevàsys.last_tracebackkhông được dùng nữa. Thay vào đó hãy sử dụngsys.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.Hashablevàtyping.Sized, bí danh tương ứng chocollections.abc.Hashablevàcollections.abc.Sized, không được dùng nữa. (gh-94309.)typing.ByteString, không được dùng nữa kể từ Python 3.9, hiện khiếnDeprecationWarningđược phát ra khi sử dụng. (Được đóng góp bởi Alex Waygood trong gh-91896.)
xml.etree.ElementTree: Mô-đun hiện phát raDeprecationWarningkhi kiểm tra giá trị thực củaxml.etree.ElementTree.Element. Trước đây, quá trình triển khai Python phát raFutureWarningvà 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()và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.)DeprecationWarninghiệ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ụngnotđể 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ủaintcơ 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_lnotabtrê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óDeprecationWarningthí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):
aifcaudioopcgicgitbchunkcryptimghdrmailcapmsilibnisnntplibossaudiodevpipessndhdrspwdsunautelnetlibuuxdrlib
Các mô-đun khác:
lib2to3và chương trình 2to3 (gh-84540)
API:
configparser.LegacyInterpolation(gh-90765)locale.resetlocale()(gh-90817)turtle.RawTurtle.settiltangle()(gh-50096)unittest.findTestCases()(gh-50096)unittest.getTestCaseNames()(gh-50096)unittest.makeSuite()(gh-50096)unittest.TestProgram.usageExit()(gh-67048)webbrowser.MacOSX(gh-86421)chuỗi mô tả
classmethod(gh-89519)
Đang chờ xóa trong Python 3.14¶
argparse: Các tham số type, choices và metavar củaargparse.BooleanOptionalActionkhô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ếnDeprecationWarningđượ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.Numast.Strast.Bytesast.NameConstantast.Ellipsis
Thay vào đó hãy sử dụng
ast.Constant. (Được đóng góp bởi Serhiy Storchaka trong gh-90953.)-
Các lớp trình giám sát con
asyncio.MultiLoopChildWatcher,asyncio.FastChildWatcher,asyncio.AbstractChildWatchervàasyncio.SafeChildWatcherkhô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()và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 raDeprecationWarningnế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 trongemail.utils.localtime(). (Được đóng góp bởi Alan Williams trong gh-72346.)importlib.abccác lớp không dùng nữa:importlib.abc.ResourceReaderimportlib.abc.Traversableimportlib.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.)
itertoolscó 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 APIget_context()hoặcset_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()vàrelative_to(): việc truyền các đối số bổ sung không được dùng nữa.pkgutil:pkgutil.find_loader()vàpkgutil.get_loader()hiện tăngDeprecationWarning; thay vào đó hãy sử dụngimportlib.util.find_spec(). (Được đóng góp bởi Nikita Sobolev trong gh-97850.)pty:master_open(): sử dụngpty.openpty().slave_open(): sử dụngpty.openpty().
-
versionvàversion_info.execute()vàexecutemany()nếu named placeholders được sử dụng và parameters là một chuỗi thay vìdict.
urllib:urllib.parse.Quoterkhô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__.cachedkhô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__.parentkhô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)
-
Hàm
ctypes.SetPointerType()không có giấy tờ đã không được dùng nữa kể từ Python 3.13.
-
CGIHTTPRequestHandlerlỗ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ờ
--cgicho giao diện dòng lệnh python -m http.server đã không được dùng nữa kể từ Python 3.13.
-
Phương pháp
load_module(): thay vào đó hãy sử dụngexec_module().
-
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ụnggetlocale(),setlocale()vàgetencoding(). (Được đóng góp bởi Hugo van Kemenade trong gh-111187.)
-
PurePath.is_reserved()đã không được dùng nữa kể từ Python 3.13. Sử dụngos.path.isreserved()để phát hiện các đường dẫn dành riêng trên Windows.
-
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.
-
Đối số check_home của
sysconfig.is_python_build()đã không được dùng nữa kể từ Python 3.12.
-
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.CodeType: Việc truy cậpco_lnotabkhô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ộtDeprecationWarningthí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.)
-
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ềnNone(TD = TypedDict("TD", None)) đã không được dùng nữa kể từ Python 3.13. Sử dụngclass TD(TypedDict): passhoặcTD = 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ô-đuntyping, 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:Các phương thức
getmark(),setmark()vàgetmarkers()của các lớpWave_readvàWave_writeđã không còn được dùng nữa kể từ Python 3.13.
-
load_module()đã không được dùng nữa kể từ Python 3.10. Thay vào đó hãy sử dụngexec_module(). (Được đóng góp bởi Jiahao Li trong gh-125746.)
Đ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__.loaderkhô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.
-
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.iscoroutinefunction()không được dùng nữa và sẽ bị xóa trong Python 3.16; thay vào đó hãy sử dụnginspect.iscoroutinefunction(). (Được đóng góp bởi Jiahao Li và Kumar Aditya trong gh-122875.)Hệ thống chính sách
asynciokhông được dùng nữa và sẽ bị xóa trong Python 3.16. Cụ thể, các lớp và hàm sau không được dùng nữa:Người dùng nên sử dụng
asyncio.run()hoặcasyncio.Runnervới loop_factory để sử dụng cách triển khai vòng lặp sự kiện mong muốn.Ví dụ: để sử dụng
asyncio.SelectorEventLooptrên Windows:nhập asyncio async def main(): ... asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
(Được đóng góp bởi Kumar Aditya trong gh-127949.)
-
Đảo ngược bit trên các loại boolean,
~Truehoặ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 (-2và-1). Thay vào đó, hãy sử dụngnot 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 sangint(~int(x)).
-
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.
-
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.)
-
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ăngValueErrortrong Python 3.16. (Được đóng góp bởi Hugo van Kemenade trong gh-75223.)
-
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 trongshutilkể từ Python 3.4 và hiện là bí danh củaRuntimeError.
-
Phương thức
Class.get_methodsđã không được dùng nữa kể từ Python 3.14.
sys:Hàm
_enablelegacywindowsfsencoding()đã không được dùng nữa kể từ Python 3.13. Thay vào đó hãy sử dụng biến môi trườngPYTHONLEGACYWINDOWSFSENCODING.
-
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ốvarscủasysconfig.get_paths().
-
Thuộc tính
TarFile.tarfilekhô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.ByteStringđược lên kế hoạch xóa trong Python 3.17.Sử dụng
isinstance(obj, collections.abc.Buffer)để kiểm tra xemobjcó triển khai buffer protocol khi chạy hay không. Để sử dụng trong chú thích loại, hãy sử dụngBufferhoặ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).ByteStringban đầ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ảbytesvàbytearray. 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ủaByteStringchư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ưmemoryviewcũng không bao giờ được hiểu là kiểu con củaByteString(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.)
-
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()và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 xemobjcó triển khai buffer protocol khi chạy hay không. Để sử dụng trong chú thích loại, hãy sử dụngBufferhoặ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).ByteStringban đầ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ảbytesvàbytearray. 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ủaByteStringchư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ưmemoryviewcũng không bao giờ được hiểu là kiểu con củaByteString(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.
-
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.FileTypekhông được dùng nữa.
-
Trình tạo: chữ ký
throw(type, exc, tb)vàathrow(type, exc, tb)không được dùng nữa: thay vào đó hãy sử dụngthrow(exc)và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óaand,else,for,if,in,isvàor. 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__()và__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ủaint.Hỗ trợ phương thức
__float__()trả về một lớp con nghiêm ngặt củafloat: những phương thức này sẽ được yêu cầu để trả về một phiên bản củafloat.Hỗ trợ phương thức
__complex__()trả về một lớp con nghiêm ngặt củacomplex: những phương thức này sẽ được yêu cầu để trả về một phiên bản củacomplex.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.Januaryvàcalendar.Februarykhông được dùng nữa và được thay thế bằngcalendar.JANUARYvàcalendar.FEBRUARY. (Được đóng góp bởi Hoàng tử Roshan trong gh-103636.)codecs: sử dụngopen()thay vìcodecs.open(). (gh-133038)codeobject.co_lnotab: thay vào đó hãy sử dụng phương phápcodeobject.co_lines().-
utcnow(): sử dụngdatetime.datetime.now(tz=datetime.UTC).utcfromtimestamp(): sử dụngdatetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC).
gettext: Giá trị số nhiều phải là số nguyên.-
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.
-
giao diện bộ dữ liệu
EntryPoints.Nonengầm định trên các giá trị trả về.
logging: phương thứcwarn()không được dùng nữa kể từ Python 3.3, thay vào đó hãy sử dụngwarning().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ọios.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_constantsvàsre_parse.shutil: Tham số onerror củarmtree()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.SSLContextkhông có đối số giao thức sẽ không được dùng nữa.ssl.SSLContext:set_npn_protocols()và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_SSLv3ssl.PROTOCOL_TLSssl.PROTOCOL_TLSv1ssl.PROTOCOL_TLSv1_1ssl.PROTOCOL_TLSv1_2ssl.TLSVersion.SSLv3ssl.TLSVersion.TLSv1ssl.TLSVersion.TLSv1_1
phương pháp
threading:threading.Condition.notifyAll(): sử dụngnotify_all().threading.Event.isSet(): sử dụngis_set().threading.Thread.isDaemon(),threading.Thread.setDaemon(): sử dụng thuộc tínhthreading.Thread.daemon.threading.Thread.getName(),threading.Thread.setName(): sử dụng thuộc tínhthreading.Thread.name.threading.currentThread(): sử dụngthreading.current_thread().threading.activeCount(): sử dụngthreading.active_count().
Lớp nội bộ
typing._UnionGenericAliaskhông còn được sử dụng để triển khaityping.Unionnữ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àNonetừ trường hợp thử nghiệm.urllib.parsecá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ủaElementkhô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 tralen(elem)hoặcelem is not Nonerõ ràng.sys._clear_type_cache()không được dùng nữa: thay vào đó hãy sử dụngsys._clear_internal_caches().
Đã xóa¶
asynchat và asyncore¶
trình phân tích cú pháp cấu hình¶
Một số tên không được dùng nữa trong
configparserở phiên bản 3.2 đã bị xóa trên gh-89336:configparser.ParsingErrorkhông còn có thuộc tính hoặc đối sốfilenamenữa. Thay vào đó, hãy sử dụng thuộc tính và đối sốsource.configparserkhông còn có lớpSafeConfigParsernữa. Thay vào đó hãy sử dụng tênConfigParserngắn hơn.configparser.ConfigParserkhông còn có phương thứcreadfpnữa. Thay vào đó hãy sử dụngread_file().
nước cất¶
đảm bảopip¶
Xóa bánh xe setuptools đi kèm khỏi
ensurepipvà ngừng cài đặt setuptools trong môi trường dovenvtạ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ênsetuptools(và dựa trêndistutils) vẫn có thể được sử dụng vớipip install, vì pip sẽ cung cấpsetuptoolstrong 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,setuptoolsvàdistutilskhông còn được cung cấp theo mặc định trong các môi trường được tạo bằngvenvhoặc được khởi động bằngensurepipvì chúng là một phần của góisetuptools. Đối với các dự án dựa vào những điều này trong thời gian chạy, dự ánsetuptoolsphả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ê¶
ftplib¶
gzip¶
Xóa thuộc tính
filenamecủagzip.GzipFilecủagzip, không được dùng nữa kể từ Python 2.6, thay vào đó hãy sử dụng thuộc tínhname. Trong chế độ ghi, thuộc tínhfilenameđã 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ủahashlib, 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ủapbkdf2_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
importlibhiệ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_loadervàimportlib.util.module_for_loaderđều đã bị xóa. (Được đóng góp bởi Brett Cannon và Nikita Sobolev trong gh-65961 và gh-97850.)Hỗ trợ cho API
find_loader()vàfind_module()đã bị xóa. (Được đóng góp bởi Barry Warsaw trong gh-98040.)importlib.abc.Finder,pkgutil.ImpImportervàpkgutil.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.NullImporterChèn
Nonevàosys.path_importer_cacheimp.cache_from_source()imp.find_module()imp.get_magic()imp.get_suffixes()importlib.machinery.SOURCE_SUFFIXES,importlib.machinery.EXTENSION_SUFFIXESvàimportlib.machinery.BYTECODE_SUFFIXESimp.get_tag()imp.load_module()imp.new_module(name)types.ModuleType(name)imp.reload()imp.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) mô-đun = importlib.util.module_from_spec(spec) Mô-đ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(mô-đun) mô-đun trả về
Xóa các chức năng và thuộc tính
impmà 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¶
ngôn ngữ¶
Xóa hàm
locale.format()củalocale, không được dùng nữa trong Python 3.7: thay vào đó hãy sử dụnglocale.format_string(). (Được đóng góp bởi Victor Stinner trong gh-94226.)
smtpd¶
sqlite3¶
Các tính năng
sqlite3khô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.OptimizedUnicodelà bí danh củastrkể từ Python 3.3. Mã trước đây đặt nhà máy văn bản thànhOptimizedUnicodecó thể sử dụngstrmộ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ủassl, không được dùng nữa trong Python 3.6: thay vào đó hãy sử dụngos.urandom()hoặcssl.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àmssl.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ượngssl.SSLContextvà gọi phương thứcssl.SSLContext.wrap_socketcủa nó. Gói nào còn sử dụngssl.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¶
Loại bỏ nhiều tính năng
unittestkhông còn được dùng nữa:Một số bí danh của phương thức
TestCase:Bí danh không được dùng nữa
Tên phương thức
Không được dùng nữa ở
failUnless3.1
failIf3.1
failUnlessEqual3.1
failIfEqual3.1
failUnlessAlmostEqual3.1
failIfAlmostEqual3.1
failUnlessRaises3.1
assert_3.2
assertEquals3.2
assertNotEquals3.2
assertAlmostEquals3.2
assertNotAlmostEquals3.2
assertRegexpMatches3.2
assertRaisesRegexp3.2
assertNotRegexpMatches3,5
Bạn có thể sử dụng https://github.com/isidentical/teyit để tự động hiện đại hóa các bài kiểm tra đơn vị của mình.
Phương thức
TestCasekhông có giấy tờ và bị hỏngassertDictContainsSubset(không được dùng trong Python 3.2).Tham số
TestLoader.loadTestsFromModulekhông có giấy tờ use_load_tests (không được dùng nữa và bị bỏ qua kể từ Python 3.5).Bí danh của lớp
TextTestResult:_TextTestResult(không được dùng trong Python 3.2).
(Được đóng góp bởi Serhiy Storchaka trong gh-89325.)
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àmcopy.copy(). Việc triển khai C củaxml.etree.ElementTreekhông có phương thứccopy(), chỉ có phương thức__copy__(). (Được đóng góp bởi Victor Stinner trong gh-94383.)
nhập khẩu zip¶
Khác¶
Xóa quy tắc
suspiciouskhỏi tài liệuMakefilevàDoc/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ố keyfile và certfile khỏi các mô-đun
ftplib,imaplib,poplibvàsmtplibcũng như các tham số key_file, cert_file và check_hostname khỏi mô-đunhttp.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 trongimaplib). (Được đóng góp bởi Victor Stinner trong gh-94172.)Loại bỏ các bản hack tương thích
Jythonkhỏ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ô-đunctypes. (Đượ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ànhrandrange(10)một cách dễ dàng. Bây giờ, nó tăngTypeError. Ngoài ra, ngoại lệ được đưa ra cho các giá trị không nguyên nhưrandrange(10.5)hoặcrandrange('10')đã được thay đổi từValueErrorthànhTypeError. Đ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ơnrandrange(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ọnfromfile_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
smtpddựa trênasyncorekhô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ênasyncio.shlex.split(): Việc chuyểnNonecho đối số s hiện đưa ra một ngoại lệ, thay vì đọcsys.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
oskhông còn chấp nhận các đường dẫn giống byte, như loạibytearrayvàmemoryview: chỉ loạibyteschí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()và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ỉ khisyslog.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,sysloglà 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
tarfilehoặcshutil.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()và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áoSTRINGkhô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_MIDDLEvàFSTRING_ENDhiệ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 ff"start {1+1} end", phiên bản cũ của mã thông báo đã phát ra1,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
typecủ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ừERRORTOKENthànhOP.Giờ đây, các chuỗi một dòng chưa hoàn chỉnh cũng tăng
tokenize.TokenErrornhư 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.TokenErrorthay vì trả về mã thông báoERRORTOKENtù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
threadinghiện mong đợi mô-đun_threadcó thuộc tính_is_main_interpreter. Đây là một hàm không có đối số trả vềTruenế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
_threadtù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ệnhconfigure. Tiện ích mở rộng được xây dựng bởiMakefile. Hầu hết các tiện ích mở rộng đều sử dụngpkg-configvà 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_OPTStrongMakefileđể ghi đè các tùy chọncompileall(mặc định:-j0) trongmake install. Đồng thời hợp nhất 3 lệnhcompileallthà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_REGENhiệ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ờ:
PyType_Spec.basicsizecó thể bằng 0 hoặc âm để chỉ định kế thừa hoặc mở rộng kích thước lớp cơ sở.PyObject_GetTypeData()vàPyType_GetTypeDataSize()được thêm vào để cho phép truy cập vào dữ liệu phiên bản dành riêng cho lớp con.Py_TPFLAGS_ITEMS_AT_ENDvàPyObject_GetItemData()được thêm vào để cho phép mở rộng một cách an toàn một số loại có kích thước thay đổi nhất định, bao gồmPyType_Type.Py_RELATIVE_OFFSETđược thêm vào để cho phép xác địnhmemberstheo cấu trúc dành riêng cho lớp con.
(Đượ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óaPyType_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_VECTORCALLhiệ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_callhiện kế thừa cờPy_TPFLAGS_HAVE_VECTORCALL. (Được đóng góp bởi Petr Viktorin trong gh-93274.)Cờ
Py_TPFLAGS_MANAGED_DICTvàPy_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()và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ủaPyFunctionObjectnhấ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()và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()và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()và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()và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ủaPyErr_Fetch()và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_ChainExceptionscũ, hiện không được dùng nữa. (Được đóng góp bởi Mark Shannon trong gh-101578.)Thêm
PyException_GetArgs()vàPyException_SetArgs()làm các hàm tiện lợi để truy xuất và sửa đổiargsđượ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ượngnhư bất tử.
_Py_IsImmortalKiể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_REFCNTkhi được sử dụng vớiPy_BUILD_CORE.
SSTATE_INTERNED_IMMORTALMã định danh cho các đối tượng unicode được thực hiệnđó là bất tử.
SSTATE_INTERNED_IMMORTAL_STATICMột mã định danh cho unicode thực tậpnhững vật thể bất tử và tĩnh tại
sys.getunicodeinternedsizeĐiều này trả về tổng số unicodecác đối tượng đã được thực tập. Điều này hiện cần thiết để
refleak.pytheo 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()và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ặcwchar_t*.Các hàm phân tích đối số như
PyArg_ParseTuple()không hỗ trợ định dạng dựa trênPy_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,esvàU.tp_weaklistcho 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ênPyTypeObjectnhư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ụngPyObject_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_tchuỗi C, độ rộng và độ chính xác thay đổi) trongPyUnicode_FromFormat()và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()vàPyUnicode_FromFormatV()hiện đặtSystemError. 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()và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ụngPy_TPFLAGS_MANAGED_DICTvàPy_TPFLAGS_MANAGED_WEAKREFthay vìtp_dictoffsetvàtp_weaklistoffsettương ứng. Việc sử dụngtp_dictoffsetvàtp_weaklistoffsetvẫ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áoPy_TPFLAGS_MANAGED_DICTphải gọi_PyObject_VisitManagedDict()và_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ọiPyObject_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ạibytearrayvàmemoryview: chỉ loạibyteschí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_SETREFvàPy_XSETREFhiệ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_RefTotalkhô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_newkhô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ỏ quatp_newcủ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).Vì
tp_newghi đè hầu hết mọi thứ mà hàmPyType_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ằngtp_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_newtrong đó: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_newcủa nó thànhNULLbằng cờPy_TPFLAGS_DISALLOW_INSTANTIATION. Điều này làm cho chức năngPyType_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_newcó 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ụngwarnings.catch_warnings()từ Python.
PyOS_InputHookvàPyOS_ReadlineFunctionPointerkhô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ủaPyLongObjectlà 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ủaPyLongObjects 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¶
Theo PEP 699, trường
ma_version_tagtrongPyDictObjectkhông được dùng cho các mô-đun mở rộng. Việc truy cập vào trường này sẽ tạo ra cảnh báo trình biên dịch tại thời điểm biên dịch. Trường này sẽ bị xóa trong Python 3.14. (Được đóng góp bởi Ramvikrams và Kumar Aditya trong gh-101193. PEP của Ken Jin.)Không dùng biến cấu hình toàn cầu:
Py_DebugFlag: sử dụngPyConfig.parser_debugPy_VerboseFlag: sử dụngPyConfig.verbosePy_QuietFlag: sử dụngPyConfig.quietPy_InteractiveFlag: sử dụngPyConfig.interactivePy_InspectFlag: sử dụngPyConfig.inspectPy_NoSiteFlag: sử dụngPyConfig.site_importPy_NoUserSiteDirectory: sử dụngPyConfig.user_site_directoryPy_HashRandomizationFlag: sử dụngPyConfig.use_hash_seedvàPyConfig.hash_seedPy_IsolatedFlag: sử dụngPyConfig.isolatedPy_LegacyWindowsFSEncodingFlag: sử dụngPyPreConfig.legacy_windows_fs_encodingPy_LegacyWindowsStdioFlag: sử dụngPyConfig.legacy_windows_stdioPy_FileSystemDefaultEncoding: sử dụngPyConfig.filesystem_encodingPy_HasFileSystemDefaultEncoding: sử dụngPyConfig.filesystem_encodingPy_FileSystemDefaultEncodeErrors: sử dụngPyConfig.filesystem_errorsPy_UTF8Mode: sử dụngPyPreConfig.utf8_mode(xemPy_PreInitialize())
Thay vào đó, nên sử dụng
Py_InitializeFromConfig()API vớiPyConfig. (Được đóng góp bởi Victor Stinner trong gh-77782.)Việc tạo
immutable typesvới các cơ sở có thể thay đổi không được dùng nữa và sẽ bị tắt trong Python 3.14. (gh-95388)Tiêu đề
structmember.hkhông được dùng nữa, mặc dù nó vẫn tiếp tục có sẵn và không có kế hoạch loại bỏ nó.Nội dung của nó hiện có sẵn chỉ bằng cách bao gồm
Python.h, với tiền tốPyđược thêm vào nếu nó bị thiếu:Nhập các macro như
Py_T_INT,Py_T_DOUBLE, v.v. (trước đây làT_INT,T_DOUBLE, v.v.)Các cờ
Py_READONLY(trước đây làREADONLY) vàPy_AUDIT_READ(trước đây đều là chữ hoa)
Một số mục không được hiển thị từ
Python.h:T_OBJECT(dùngPy_T_OBJECT_EX)T_NONE(trước đây không có giấy tờ và khá kỳ quặc)Macro
WRITE_RESTRICTEDkhông làm gì cả.Các macro
RESTRICTEDvàREAD_RESTRICTED, tương đương vớiPy_AUDIT_READ.Trong một số cấu hình,
<stddef.h>không được bao gồm trongPython.h. Nó nên được đưa vào theo cách thủ công khi sử dụngoffsetof().
Tiêu đề không được dùng nữa tiếp tục cung cấp nội dung ban đầu của nó dưới tên ban đầu. Mã cũ của bạn có thể không thay đổi, trừ khi các macro bổ sung bao gồm và không được đặt tên làm phiền bạn rất nhiều.
(Được đóng góp trong gh-47146 bởi Petr Viktorin, dựa trên tác phẩm trước đó của Alexander Belopolsky và Matthias Braun.)
PyErr_Fetch()vàPyErr_Restore()không được dùng nữa. Thay vào đó hãy sử dụngPyErr_GetRaisedException()vàPyErr_SetRaisedException(). (Được đóng góp bởi Mark Shannon trong gh-101578.)PyErr_Display()không được dùng nữa. Thay vào đó hãy sử dụngPyErr_DisplayException(). (Được đóng góp bởi Irit Katriel trong gh-102755)._PyErr_ChainExceptionskhông được dùng nữa. Thay vào đó hãy sử dụng_PyErr_ChainExceptions1. (Được đóng góp bởi Irit Katriel trong gh-102192.)Việc sử dụng
PyType_FromSpec(),PyType_FromSpecWithBases()hoặcPyType_FromModuleAndSpec()để tạo một lớp có siêu dữ liệu ghi đètp_newkhông được dùng nữa. Thay vào đó hãy gọi siêu dữ liệu.
Đang chờ xóa trong Python 3.14¶
Trường
ma_version_tagtrongPyDictObjectdành cho các mô-đun mở rộng (PEP 699; gh-101193).Tạo
immutable typesvới các cơ sở có thể thay đổi (gh-95388).
Đang chờ xóa trong Python 3.15¶
Zz000zz: Thay vào đó hãy sử dụng
PyImport_ImportModule().PyWeakref_GetObject()vàPyWeakref_GET_OBJECT(): Thay vào đó hãy sử dụngPyWeakref_GetRef(). pythoncapi-compat project có thể được sử dụng để nhậnPyWeakref_GetRef()trên Python 3.12 trở lên.loại
Py_UNICODEvà macroPy_UNICODE_WIDE: Thay vào đó hãy sử dụngwchar_t.PyUnicode_AsDecodedObject(): Thay vào đó hãy sử dụngPyCodec_Decode().PyUnicode_AsDecodedUnicode(): Thay vào đó hãy sử dụngPyCodec_Decode(); Lưu ý rằng một số codec (ví dụ: "base64") có thể trả về loại khácstr, chẳng hạn nhưbytes.PyUnicode_AsEncodedObject(): Thay vào đó hãy sử dụngPyCodec_Encode().PyUnicode_AsEncodedUnicode(): Thay vào đó hãy sử dụngPyCodec_Encode(); Lưu ý rằng một số codec (ví dụ: "base64") có thể trả về loại khácbytes, chẳng hạn nhưstr.Các hàm khởi tạo Python, không được dùng nữa trong Python 3.13:
Py_GetPath(): Thay vào đó hãy sử dụngPyConfig_Get("module_search_paths")(sys.path).Py_GetPrefix(): Thay vào đó hãy sử dụngPyConfig_Get("base_prefix")(sys.base_prefix). Sử dụngPyConfig_Get("prefix")(sys.prefix) nếu cần xử lý virtual environments.Py_GetExecPrefix(): Thay vào đó hãy sử dụngPyConfig_Get("base_exec_prefix")(sys.base_exec_prefix). Sử dụngPyConfig_Get("exec_prefix")(sys.exec_prefix) nếu cần xử lý virtual environments.Py_GetProgramFullPath(): Thay vào đó hãy sử dụngPyConfig_Get("executable")(sys.executable).Py_GetProgramName(): Thay vào đó hãy sử dụngPyConfig_Get("executable")(sys.executable).Py_GetPythonHome(): Thay vào đó hãy sử dụngPyConfig_Get("home")hoặc biến môi trườngPYTHONHOME.
pythoncapi-compat project có thể được sử dụng để nhận
PyConfig_Get()trên Python 3.13 trở lên.Các hàm định cấu hình khởi tạo Python, không được dùng nữa trong Python 3.11:
PySys_SetArgvEx(): Thay vào đó hãy đặtPyConfig.argv.PySys_SetArgv(): Thay vào đó hãy đặtPyConfig.argv.Py_SetProgramName(): Thay vào đó hãy đặtPyConfig.program_name.Py_SetPythonHome(): Thay vào đó hãy đặtPyConfig.home.PySys_ResetWarnOptions(): Thay vào đó hãy xóasys.warnoptionsvàwarnings.filters.
Thay vào đó,
Py_InitializeFromConfig()API nên được sử dụng vớiPyConfig.Biến cấu hình toàn cầu:
Py_DebugFlag: Thay vào đó hãy sử dụngPyConfig.parser_debughoặcPyConfig_Get("parser_debug").Py_VerboseFlag: Thay vào đó hãy sử dụngPyConfig.verbosehoặcPyConfig_Get("verbose").Py_QuietFlag: Thay vào đó hãy sử dụngPyConfig.quiethoặcPyConfig_Get("quiet").Py_InteractiveFlag: Thay vào đó hãy sử dụngPyConfig.interactivehoặcPyConfig_Get("interactive").Py_InspectFlag: Thay vào đó hãy sử dụngPyConfig.inspecthoặcPyConfig_Get("inspect").Py_OptimizeFlag: Thay vào đó hãy sử dụngPyConfig.optimization_levelhoặcPyConfig_Get("optimization_level").Py_NoSiteFlag: Thay vào đó hãy sử dụngPyConfig.site_importhoặcPyConfig_Get("site_import").Py_BytesWarningFlag: Thay vào đó hãy sử dụngPyConfig.bytes_warninghoặcPyConfig_Get("bytes_warning").Py_FrozenFlag: Thay vào đó hãy sử dụngPyConfig.pathconfig_warningshoặcPyConfig_Get("pathconfig_warnings").Py_IgnoreEnvironmentFlag: Thay vào đó hãy sử dụngPyConfig.use_environmenthoặcPyConfig_Get("use_environment").Py_DontWriteBytecodeFlag: Thay vào đó hãy sử dụngPyConfig.write_bytecodehoặcPyConfig_Get("write_bytecode").Py_NoUserSiteDirectory: Thay vào đó hãy sử dụngPyConfig.user_site_directoryhoặcPyConfig_Get("user_site_directory").Py_UnbufferedStdioFlag: Thay vào đó hãy sử dụngPyConfig.buffered_stdiohoặcPyConfig_Get("buffered_stdio").Py_HashRandomizationFlag: Thay vào đó hãy sử dụngPyConfig.use_hash_seedvàPyConfig.hash_seedhoặcPyConfig_Get("hash_seed").Py_IsolatedFlag: Thay vào đó hãy sử dụngPyConfig.isolatedhoặcPyConfig_Get("isolated").Py_LegacyWindowsFSEncodingFlag: Thay vào đó hãy sử dụngPyPreConfig.legacy_windows_fs_encodinghoặcPyConfig_Get("legacy_windows_fs_encoding").Py_LegacyWindowsStdioFlag: Thay vào đó hãy sử dụngPyConfig.legacy_windows_stdiohoặcPyConfig_Get("legacy_windows_stdio").Py_FileSystemDefaultEncoding,Py_HasFileSystemDefaultEncoding: Thay vào đó hãy sử dụngPyConfig.filesystem_encodinghoặcPyConfig_Get("filesystem_encoding").Py_FileSystemDefaultEncodeErrors: Thay vào đó hãy sử dụngPyConfig.filesystem_errorshoặcPyConfig_Get("filesystem_errors").Py_UTF8Mode: Thay vào đó hãy sử dụngPyPreConfig.utf8_modehoặcPyConfig_Get("utf8_mode"). (xemPy_PreInitialize())
Nên sử dụng
Py_InitializeFromConfig()API cùng vớiPyConfigđể đặt các tùy chọn này. HoặcPyConfig_Get()có thể được sử dụng để có được các tùy chọn này khi chạy.
Đ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.
Py_TPFLAGS_HAVE_FINALIZE: Không cần thiết kể từ Python 3.8.PyErr_Fetch(): Thay vào đó hãy sử dụngPyErr_GetRaisedException().PyErr_NormalizeException(): Thay vào đó hãy sử dụngPyErr_GetRaisedException().PyErr_Restore(): Thay vào đó hãy sử dụngPyErr_SetRaisedException().PyModule_GetFilename(): Thay vào đó hãy sử dụngPyModule_GetFilenameObject().PyOS_AfterFork(): Thay vào đó hãy sử dụngPyOS_AfterFork_Child().PySlice_GetIndicesEx(): Thay vào đó hãy sử dụngPySlice_Unpack()vàPySlice_AdjustIndices().PyUnicode_READY(): Không cần thiết kể từ Python 3.12PyErr_Display(): Thay vào đó hãy sử dụngPyErr_DisplayException()._PyErr_ChainExceptions(): Thay vào đó hãy sử dụng_PyErr_ChainExceptions1().Thành viên
PyBytesObject.ob_shash: thay vào đó hãy gọiPyObject_Hash().Chủ đề Lưu trữ cục bộ (TLS) API:
PyThread_create_key(): Thay vào đó hãy sử dụngPyThread_tss_alloc().PyThread_delete_key(): Thay vào đó hãy sử dụngPyThread_tss_free().PyThread_set_key_value(): Thay vào đó hãy sử dụngPyThread_tss_set().PyThread_get_key_value(): Thay vào đó hãy sử dụngPyThread_tss_get().PyThread_delete_key_value(): Thay vào đó hãy sử dụngPyThread_tss_delete().PyThread_ReInitTLS(): Không cần thiết kể từ Python 3.7.
Đã 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.hchỉ đượ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_KINDPyUnicode_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.)