Có gì mới trong Python 3.11

Biên tập viên:

Pablo Galindo Salgado

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

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

  • Python 3.11 nhanh hơn Python 3.10 từ 10-60%. Trung bình, chúng tôi đo được mức tăng tốc 1,25 lần trên bộ điểm chuẩn tiêu chuẩn. Xem CPython nhanh hơn để biết chi tiết.

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

Các tính năng tích hợp mới:

Các mô-đun thư viện tiêu chuẩn mới:

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

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

Các trường hợp không dùng nữa, xóa và hạn chế quan trọng:

Tính năng mới

PEP 657: Vị trí lỗi chi tiết trong truy nguyên

Khi in dấu vết, trình thông dịch bây giờ sẽ trỏ đến biểu thức chính xác gây ra lỗi, thay vì chỉ dòng. Ví dụ:

Traceback (cuộc gọi gần đây nhất):
  Tệp "distance.py", dòng 11, trong <module>
    print(manhattan_distance(p1, p2))
          ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^
  Tệp "distance.py", dòng 6,  manhattan_distance
    trả về abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
                           ^^ ^^^ ^^ ^^
AttributionError: Đối tượng 'NoneType' không  thuộc tính 'x'

Các phiên bản trước của trình thông dịch sẽ chỉ trỏ đến dòng, khiến nó không rõ ràng đối tượng nào là None. Các lỗi nâng cao này cũng có thể hữu ích khi xử lý các đối tượng dict được lồng sâu và nhiều lệnh gọi hàm:

Traceback (cuộc gọi gần đây nhất):
  Tệp "query.py", dòng 37, trong <module>
    magic_arithmetic('foo')
  Tệp "query.py", dòng 18, trong magic_arithmetic
    trả về add_counts(x)/25
           ^^ ^^^ ^^ ^^ ^^ ^^ ^^
  Tệp "query.py", dòng 24, trong add_counts
    trả về 25 + query_user(user1) + query_user(user2)
                ^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^
  Tệp "query.py", dòng 32, trong query_user
    trả về 1 + query_count(db, reply['a']['b']['c']['user'], retry=True)
                               ~~~~~~~~~~~~~~~~~~~~ ^^ ^^^
TypeError: Đối tượng 'NoneType' không thể đăng  được

Cũng như các biểu thức số học phức tạp:

Traceback (cuộc gọi gần đây nhất):
  Tệp "computer.py", dòng 54, trong <module>
    kết quả = (x/y/z) * (a/b/c)
              ~~~~~~^~~
ZeroDivisionError: chia cho 0

Ngoài ra, thông tin được sử dụng bởi tính năng truy nguyên nâng cao được cung cấp thông qua API chung, thông tin này có thể được sử dụng để so sánh bytecode instructions với vị trí mã nguồn. Thông tin này có thể được lấy bằng cách sử dụng:

Xem PEP 657 để biết thêm chi tiết. (Được đóng góp bởi Pablo Galindo, Batuhan Taskaya và Ammar Askar trong bpo-43950.)

Ghi chú

Tính năng này yêu cầu lưu trữ các vị trí cột trong Đối tượng mã, điều này có thể dẫn đến mức sử dụng bộ nhớ trình thông dịch và mức sử dụng đĩa cho các tệp Python được biên dịch tăng lên một chút. Để tránh lưu trữ thông tin bổ sung và hủy kích hoạt việc in thông tin truy nguyên bổ sung, hãy sử dụng tùy chọn dòng lệnh -X no_debug_ranges hoặc biến môi trường PYTHONNODEBUGRANGES.

PEP 654: Nhóm ngoại lệ và except*

PEP 654 giới thiệu các tính năng ngôn ngữ cho phép chương trình đưa ra và xử lý đồng thời nhiều trường hợp ngoại lệ không liên quan. Các kiểu dựng sẵn ExceptionGroupBaseExceptionGroup cho phép nhóm các ngoại lệ và nâng chúng lại với nhau, đồng thời cú pháp except* mới khái quát hóa except để khớp với các nhóm con của các nhóm ngoại lệ.

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

(Được đóng góp bởi Irit Katriel trong bpo-45292. PEP được viết bởi Irit Katriel, Yury Selivanov và Guido van Rossum.)

PEP 678: Các ngoại lệ có thể được bổ sung bằng ghi chú

Phương thức add_note() được thêm vào BaseException. Nó có thể được sử dụng để làm phong phú thêm các ngoại lệ bằng thông tin ngữ cảnh không có sẵn tại thời điểm ngoại lệ được đưa ra. Các ghi chú đã thêm sẽ xuất hiện trong truy nguyên mặc định.

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

(Được đóng góp bởi Irit Katriel trong bpo-45607. PEP do Zac Hatfield-Dodds viết.)

Cải tiến trình khởi chạy Windows py.exe

Bản sao của Trình quản lý cài đặt Python đi kèm với Python 3.11 đã được cập nhật đáng kể. Hiện tại, nó hỗ trợ cú pháp công ty/thẻ như được xác định trong PEP 514 bằng cách sử dụng đối số -V:<company>/<tag> thay vì -<major>.<minor> bị giới hạn. Điều này cho phép khởi chạy các bản phân phối khác ngoài PythonCore, bản phân phối được lưu trữ trên python.org.

Khi sử dụng bộ chọn -V:, công ty hoặc thẻ có thể bị bỏ qua, nhưng tất cả các lượt cài đặt sẽ được tìm kiếm. Ví dụ: -V:OtherPython/ sẽ chọn thẻ "tốt nhất" được đăng ký cho OtherPython, trong khi -V:3.11 hoặc -V:/3.11 sẽ chọn phân phối "tốt nhất" với thẻ 3.11.

Khi sử dụng các đối số -<major>, -<major>.<minor>, -<major>-<bitness> hoặc -<major>.<minor>-<bitness> cũ, tất cả hành vi hiện tại phải được giữ nguyên từ các phiên bản trước đây và chỉ các bản phát hành từ PythonCore mới được chọn. Tuy nhiên, hậu tố -64 hiện có nghĩa là "không phải 32-bit" (không nhất thiết phải là x86-64), vì có nhiều nền tảng 64-bit được hỗ trợ. Thời gian chạy 32 bit được phát hiện bằng cách kiểm tra thẻ của thời gian chạy để tìm hậu tố -32. Tất cả các bản phát hành Python kể từ phiên bản 3.5 đều đã đưa tính năng này vào bản dựng 32 bit của chúng.

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

  • Đã thêm tùy chọn dòng lệnh -P và biến môi trường PYTHONSAFEPATH, vô hiệu hóa tính năng tự động thêm vào sys.path của thư mục tập lệnh khi chạy tập lệnh hoặc thư mục hiện tại khi sử dụng -c-m. Điều này đảm bảo chỉ stdlib và các mô-đun đã cài đặt mới được import chọn và tránh các mô-đun che khuất một cách vô ý hoặc cố ý với các mô-đun trong thư mục cục bộ (và thường là người dùng có thể ghi). (Được đóng góp bởi Victor Stinner trong gh-57684.)

  • Tùy chọn "z" đã được thêm vào Đặc tả định dạng ngôn ngữ nhỏ để ép âm thành 0 dương sau khi làm tròn đến độ chính xác của định dạng. Xem PEP 682 để biết thêm chi tiết. (Được đóng góp bởi John Belmonte trong gh-90153.)

  • Byte không còn được chấp nhận trên sys.path. Hỗ trợ bị gián đoạn giữa Python 3.2 và 3.6 mà không ai nhận thấy cho đến sau khi Python 3.10.0 được phát hành. Ngoài ra, việc đưa hỗ trợ trở lại sẽ gặp vấn đề do tương tác giữa -bsys.path_importer_cache khi có sự kết hợp giữa các phím strbytes. (Được đóng góp bởi Thomas Grainger trong gh-91181.)

Những thay đổi triển khai CPython khác

  • Các phương thức đặc biệt __complex__() cho complex__bytes__() cho bytes được triển khai để hỗ trợ các giao thức typing.SupportsComplextyping.SupportsBytes. (Được đóng góp bởi Mark Dickinson và Donghee Na trong bpo-24234.)

  • siphash13 được thêm vào dưới dạng thuật toán băm nội bộ mới. Nó có các đặc tính bảo mật tương tự như siphash24, nhưng nó nhanh hơn một chút đối với các đầu vào dài. str, bytes và một số loại khác hiện sử dụng nó làm thuật toán mặc định cho hash(). PEP 552 hash-based .pyc files bây giờ cũng sử dụng siphash13. (Được đóng góp bởi Inada Naoki trong bpo-29410.)

  • Khi một ngoại lệ đang hoạt động được kích hoạt lại bằng câu lệnh raise không có tham số, thì dấu vết được đính kèm với ngoại lệ này giờ đây luôn là sys.exc_info()[1].__traceback__. Điều này có nghĩa là những thay đổi được thực hiện đối với truy nguyên trong mệnh đề except hiện tại sẽ được phản ánh trong ngoại lệ được nêu lại. (Được đóng góp bởi Irit Katriel trong bpo-45711.)

  • Việc thể hiện các ngoại lệ được xử lý của trạng thái thông dịch viên (còn gọi là exc_info hoặc _PyErr_StackItem) hiện chỉ có trường exc_value; exc_typeexc_traceback đã bị xóa vì chúng có thể bắt nguồn từ exc_value. (Được đóng góp bởi Irit Katriel trong bpo-45711.)

  • Một command line option mới, AppendPath, đã được thêm vào trình cài đặt Windows. Nó hoạt động tương tự như PrependPath, nhưng nối thêm các thư mục cài đặt và tập lệnh thay vì thêm chúng vào trước. (Được đóng góp bởi Bastian Neuburger trong bpo-44934.)

  • Trường PyConfig.module_search_paths_set hiện phải được đặt thành 1 để khởi tạo nhằm sử dụng PyConfig.module_search_paths để khởi tạo sys.path. Nếu không, quá trình khởi tạo sẽ tính toán lại đường dẫn và thay thế mọi giá trị được thêm vào module_search_paths.

  • Đầu ra của tùy chọn --help hiện vừa với 50 dòng/80 cột. Thông tin về các tùy chọn Python environment variables-X hiện có sẵn bằng cách sử dụng cờ --help-env--help-xoptions tương ứng cũng như với --help-all mới. (Được đóng góp bởi Éric Araujo trong bpo-46142.)

  • Chuyển đổi giữa intstr ở các cơ số không phải 2 (nhị phân), 4, 8 (bát phân), 16 (thập lục phân) hoặc 32, chẳng hạn như cơ sở 10 (thập phân) hiện sẽ tăng ValueError nếu số chữ số ở dạng chuỗi vượt quá giới hạn để tránh các cuộc tấn công từ chối dịch vụ tiềm ẩn do độ phức tạp của thuật toán. Đây là biện pháp giảm nhẹ cho CVE 2020-10735. Giới hạn này có thể được định cấu hình hoặc vô hiệu hóa bằng biến môi trường, cờ dòng lệnh hoặc API sys. Xem tài liệu integer string conversion length limitation. Giới hạn mặc định là 4300 chữ số ở dạng chuỗi.

Mô-đun mới

  • tomllib: Để phân tích cú pháp TOML. Xem PEP 680 để biết thêm chi tiết. (Được đóng góp bởi Taneli Hukkinen trong bpo-40059.)

  • wsgiref.types: các loại dành riêng cho WSGI để kiểm tra loại tĩnh. (Được đóng góp bởi Sebastian Rittau trong bpo-42012.)

Mô-đun cải tiến

asyncio

bối cảnh

  • Đã thêm trình quản lý bối cảnh chdir() không an toàn song song để thay đổi thư mục làm việc hiện tại rồi khôi phục nó khi thoát. Trình bao bọc đơn giản xung quanh chdir(). (Được đóng góp bởi Filipe Laíns trong bpo-25625)

các lớp dữ liệu

  • Thay đổi kiểm tra khả năng thay đổi mặc định của trường, chỉ cho phép các giá trị mặc định là hashable thay vì bất kỳ đối tượng nào không phải là phiên bản của dict, list hoặc set. (Được đóng góp bởi Eric V. Smith trong bpo-44674.)

ngày giờ

liệt kê

  • Đổi tên EnumMeta thành EnumType (EnumMeta được giữ làm bí danh).

  • Đã thêm StrEnum, với các thành viên có thể được sử dụng dưới dạng (và phải là) chuỗi.

  • Đã thêm ReprEnum, chỉ sửa đổi __repr__() của các thành viên trong khi trả về giá trị bằng chữ của chúng (chứ không phải tên) cho __str__()__format__() (được sử dụng bởi str(), format()f-strings).

  • Đã thay đổi Enum.__format__() (mặc định cho format(), str.format()f-strings) để luôn tạo ra kết quả tương tự như Enum.__str__(): đối với các enum kế thừa từ ReprEnum, đó sẽ là giá trị của thành viên; đối với tất cả các enum khác, nó sẽ là tên enum và tên thành viên (ví dụ: Color.RED).

  • Đã thêm tham số lớp boundary mới vào enum Flag và enum FlagBoundary cùng với các tùy chọn của nó, để kiểm soát cách xử lý các giá trị cờ ngoài phạm vi.

  • Đã thêm trình trang trí enum verify() và enum EnumCheck cùng với các tùy chọn của nó, để kiểm tra các lớp enum theo một số ràng buộc cụ thể.

  • Đã thêm trình trang trí member()nonmember() để đảm bảo đối tượng được trang trí được/không bị chuyển đổi thành thành viên enum.

  • Đã thêm trình trang trí property(), hoạt động giống như property() ngoại trừ enum. Sử dụng cái này thay vì types.DynamicClassAttribute().

  • Đã thêm trình trang trí enum global_enum(), điều chỉnh __repr__()__str__() để hiển thị các giá trị với tư cách là thành viên của mô-đun thay vì lớp enum. Ví dụ: 're.ASCII' dành cho thành viên ASCII của re.RegexFlag chứ không phải 'RegexFlag.ASCII'.

  • Flag được cải tiến để hỗ trợ len(), iteration và in/not in trên các thành viên của nó. Ví dụ: phần sau đây hiện hoạt động: len(AFlag(3)) == 2 and list(AFlag(3)) == (AFlag.ONE, AFlag.TWO)

  • Đã thay đổi EnumFlag để các thành viên hiện được xác định trước khi __init_subclass__() được gọi; dir() hiện bao gồm các phương thức, v.v., từ các kiểu dữ liệu hỗn hợp.

  • Đã thay đổi Flag để chỉ xem xét các giá trị chính (lũy thừa của hai) chính tắc trong khi các giá trị tổng hợp (3, 6, 10, v.v.) được coi là bí danh; cờ đảo ngược bị ép buộc tương đương tích cực của họ.

fcntl

  • Trên FreeBSD, cờ F_DUP2FDF_DUP2FD_CLOEXEC tương ứng được hỗ trợ, cờ trước tương đương với mức sử dụng dup2 trong khi cờ sau còn đặt cờ FD_CLOEXEC.

phân số

  • Hỗ trợ khởi tạo kiểu PEP 515 của Fraction từ chuỗi. (Được đóng góp bởi Sergey B Kirpichev trong bpo-44258.)

  • Fraction hiện triển khai phương thức __int__ để kiểm tra isinstance(some_fraction, typing.SupportsInt) vượt qua. (Được đóng góp bởi Mark Dickinson trong bpo-44547.)

công cụ chức năng

  • functools.singledispatch() hiện hỗ trợ types.UnionTypetyping.Union làm chú thích cho đối số điều phối.:

    >>> từ functools nhập singledispatch
    >>> @singledispatch
    ... def fun(arg, tiết=False):
    ... nếu dài dòng:
    ... print("Để tôi nói,", end=" ")
    ... in(arg)
    ...
    >>> @fun.register
    ... def _(arg: int | float, chi tiết=False):
    ... nếu dài dòng:
    ... print("Sức mạnh về số lượng, hả?", end=" ")
    ... in(arg)
    ...
    >>> từ cách  import Union
    >>> @fun.register
    ... def _(arg: Union[danh sách, bộ], chi tiết=False):
    ... nếu dài dòng:
    ... print("Liệt kê cái này:")
    ... đối với i, elem trong enumerate(arg):
    ... print(i, elem)
    ...
    

    (Được đóng góp bởi Yurii Karabas trong bpo-46014.)

gzip

  • Hàm gzip.compress() hiện nhanh hơn khi được sử dụng với đối số mtime=0 vì nó ủy quyền hoàn toàn việc nén cho một thao tác zlib.compress() duy nhất. Có một tác dụng phụ của sự thay đổi này: Tiêu đề tệp gzip chứa byte "OS" trong tiêu đề của nó. Theo truyền thống, giá trị đó luôn được đặt thành giá trị 255 đại diện cho "không xác định" bởi mô-đun gzip. Bây giờ, khi sử dụng compress() với mtime=0, nó có thể được đặt thành một giá trị khác bởi thư viện zlib C cơ bản mà Python được liên kết. (Xem gh-112346 để biết chi tiết về tác dụng phụ.)

hàm băm

  • hashlib.blake2b()hashlib.blake2s() hiện thích libb2 hơn bản sao được cung cấp của Python. (Được đóng góp bởi Christian Heimes trong bpo-47095.)

  • Mô-đun _sha3 bên trong với thuật toán SHA3 và SHAKE hiện sử dụng tiny_sha3 thay vì Keccak Code Package để giảm mã và kích thước nhị phân. Mô-đun hashlib ưu tiên triển khai SHA3 và SHAKE được tối ưu hóa từ OpenSSL. Thay đổi này chỉ ảnh hưởng đến các cài đặt không có hỗ trợ OpenSSL. (Được đóng góp bởi Christian Heimes trong bpo-47098.)

  • Thêm hashlib.file_digest(), một chức năng trợ giúp để băm các tệp hoặc các đối tượng giống như tệp một cách hiệu quả. (Được đóng góp bởi Christian Heimes trong gh-89313.)

IDLE và nhàn rỗi

  • Áp dụng tô sáng cú pháp cho các tệp .pyi. (Được đóng góp bởi Alex Waygood và Terry Jan Reedy trong bpo-45447.)

  • Bao gồm các lời nhắc khi lưu Shell với đầu vào và đầu ra. (Được đóng góp bởi Terry Jan Reedy trong gh-95191.)

kiểm tra

ngôn ngữ

khai thác gỗ

  • Đã thêm getLevelNamesMapping() để trả về ánh xạ từ tên cấp ghi nhật ký (ví dụ: 'CRITICAL') sang giá trị của Cấp độ ghi nhật ký tương ứng (ví dụ: 50, theo mặc định). (Được đóng góp bởi Andrei Kulakovin trong gh-88024.)

  • Đã thêm phương thức createSocket() vào SysLogHandler để khớp với SocketHandler.createSocket(). Nó được gọi tự động trong quá trình khởi tạo trình xử lý và khi phát ra một sự kiện, nếu không có ổ cắm hoạt động. (Được đóng góp bởi Kirill Pinchuk trong gh-88457.)

môn toán

  • Thêm math.exp2(): trả về 2 lũy thừa của x. (Được đóng góp bởi Gideon Mitchell trong bpo-45917.)

  • Thêm math.cbrt(): trả về căn bậc ba của x. (Được đóng góp bởi Ajith Ramachandran trong bpo-44357.)

  • Hoạt động của hai vỏ góc math.pow() đã được thay đổi để nhất quán với thông số kỹ thuật IEEE 754. Các hoạt động math.pow(0.0, -math.inf)math.pow(-0.0, -math.inf) bây giờ trả về inf. Trước đây họ đã huy động ValueError. (Được đóng góp bởi Mark Dickinson trong bpo-44339.)

  • Giá trị math.nan hiện luôn có sẵn. (Được đóng góp bởi Victor Stinner trong bpo-46917.)

toán tử

  • Một chức năng mới operator.call đã được thêm vào, chẳng hạn như operator.call(obj, *args, **kwargs) == obj(*args, **kwargs). (Được đóng góp bởi Antony Lee trong bpo-44019.)

hệ điều hành

  • Trên Windows, os.urandom() hiện sử dụng BCryptGenRandom(), thay vì CryptGenRandom() không được dùng nữa. (Được đóng góp bởi Donghee Na trong bpo-44611.)

đường dẫn

  • glob()rglob() chỉ trả về các thư mục nếu pattern kết thúc bằng dấu phân cách thành phần tên đường dẫn: sep hoặc altsep. (Được đóng góp bởi Eisuke Kawasima trong bpo-22276bpo-33392.)

lại

  • Nhóm nguyên tử ((?>...)) và bộ định lượng sở hữu (*+, ++, ?+, {m,n}+) hiện được hỗ trợ trong biểu thức thông thường. (Được đóng góp bởi Jeffrey C. Jacobs và Serhiy Storchaka trong bpo-433030.)

im lặng

  • Thêm tham số tùy chọn dir_fd trong shutil.rmtree(). (Được đóng góp bởi Serhiy Storchaka trong bpo-46245.)

ổ cắm

  • Thêm hỗ trợ Ổ cắm CAN cho NetBSD. (Được đóng góp bởi Thomas Klausner trong bpo-30512.)

  • create_connection() có tùy chọn nâng cao, trong trường hợp không kết nối được, một ExceptionGroup chứa tất cả các lỗi thay vì chỉ đưa ra lỗi cuối cùng. (Được đóng góp bởi Irit Katriel trong bpo-29980.)

sqlite3

  • Bây giờ bạn có thể vô hiệu hóa trình ủy quyền bằng cách chuyển None đến set_authorizer(). (Được đóng góp bởi Erlend E. Aasland trong bpo-44491.)

  • Tên đối chiếu create_collation() hiện có thể chứa bất kỳ ký tự Unicode nào. Tên đối chiếu có ký tự không hợp lệ hiện tăng UnicodeEncodeError thay vì sqlite3.ProgrammingError. (Được đóng góp bởi Erlend E. Aasland trong bpo-44688.)

  • Các ngoại lệ của sqlite3 hiện bao gồm mã lỗi mở rộng SQLite là sqlite_errorcode và tên lỗi SQLite là sqlite_errorname. (Được đóng góp bởi Aviv Palivoda, Daniel Shahaf và Erlend E. Aasland trong bpo-16379bpo-24139.)

  • Thêm setlimit()getlimit() vào sqlite3.Connection để cài đặt và nhận giới hạn SQLite theo cơ sở kết nối. (Được đóng góp bởi Erlend E. Aasland trong bpo-45243.)

  • sqlite3 hiện đặt sqlite3.threadsafety dựa trên chế độ phân luồng mặc định mà thư viện SQLite cơ bản đã được biên dịch. (Được đóng góp bởi Erlend E. Aasland trong bpo-45613.)

  • Lệnh gọi lại sqlite3 C hiện sử dụng các ngoại lệ không thể xử lý được nếu tính năng theo dõi lệnh gọi lại được bật. Người dùng hiện có thể đăng ký unraisable hook handler để cải thiện trải nghiệm gỡ lỗi của mình. (Được đóng góp bởi Erlend E. Aasland trong bpo-45828.)

  • Tìm nạp qua rollback không còn tăng InterfaceError nữa. Thay vào đó, chúng tôi để thư viện SQLite xử lý những trường hợp này. (Được đóng góp bởi Erlend E. Aasland trong bpo-44092.)

  • Thêm serialize()deserialize() vào sqlite3.Connection để tuần tự hóa và giải tuần tự hóa cơ sở dữ liệu. (Được đóng góp bởi Erlend E. Aasland trong bpo-41930.)

  • Thêm create_window_function() vào sqlite3.Connection để tạo các hàm cửa sổ tổng hợp. (Được đóng góp bởi Erlend E. Aasland trong bpo-34916.)

  • Thêm blobopen() vào sqlite3.Connection. sqlite3.Blob cho phép các thao tác I/O tăng dần trên các đốm màu. (Được đóng góp bởi Aviv Palivoda và Erlend E. Aasland trong bpo-24905.)

chuỗi

  • Thêm get_identifiers()is_valid() vào string.Template, tương ứng sẽ trả về tất cả các phần giữ chỗ hợp lệ và liệu có bất kỳ phần giữ chỗ không hợp lệ nào hay không. (Được đóng góp bởi Ben Kehoe trong gh-90465.)

hệ thống

  • sys.exc_info() hiện lấy các trường typetraceback từ value (trường hợp ngoại lệ), do đó, khi một ngoại lệ được sửa đổi trong khi nó đang được xử lý, những thay đổi đó sẽ được phản ánh trong kết quả của các lệnh gọi tiếp theo tới exc_info(). (Được đóng góp bởi Irit Katriel trong bpo-45711.)

  • Thêm sys.exception() trả về phiên bản ngoại lệ đang hoạt động (tương đương với sys.exc_info()[1]). (Được đóng góp bởi Irit Katriel trong bpo-46328.)

  • Thêm cờ sys.flags.safe_path. (Được đóng góp bởi Victor Stinner trong gh-57684.)

cấu hình hệ thống

  • Ba installation schemes mới (posix_venv, nt_venvvenv) đã được thêm vào và được sử dụng khi Python tạo môi trường ảo mới hoặc khi nó chạy từ môi trường ảo. Hai lược đồ đầu tiên (posix_venvnt_venv) dành riêng cho hệ điều hành không phải Windows và Windows, venv về cơ bản là bí danh của một trong số chúng tùy theo hệ điều hành Python chạy trên đó. Điều này hữu ích cho các nhà phân phối hạ nguồn sửa đổi sysconfig.get_preferred_scheme(). Mã của bên thứ ba tạo môi trường ảo mới nên sử dụng sơ đồ cài đặt venv mới để xác định đường dẫn, venv cũng vậy. (Được đóng góp bởi Miro Hrončok trong bpo-45413.)

tập tin tạm thời

  • Các đối tượng SpooledTemporaryFile hiện thực hiện đầy đủ các phương thức của io.BufferedIOBase hoặc io.TextIOBase (tùy thuộc vào chế độ tệp). Điều này cho phép chúng hoạt động chính xác với các API yêu cầu các đối tượng giống tệp, chẳng hạn như mô-đun nén. (Được đóng góp bởi Carey Metcalfe trong gh-70363.)

luồng

  • Trên Unix, nếu chức năng sem_clockwait() có sẵn trong thư viện C (glibc 2.30 trở lên), phương pháp threading.Lock.acquire() hiện sử dụng đồng hồ đơn điệu (time.CLOCK_MONOTONIC) cho thời gian chờ, thay vì sử dụng đồng hồ hệ thống (time.CLOCK_REALTIME), để không bị ảnh hưởng bởi những thay đổi về đồng hồ hệ thống. (Được đóng góp bởi Victor Stinner trong bpo-41710.)

thời gian

  • Trên Unix, time.sleep() hiện sử dụng chức năng clock_nanosleep() hoặc nanosleep(), nếu có, có độ phân giải 1 nano giây (10-9 giây), thay vì sử dụng select() có độ phân giải 1 micro giây (10-6 giây). (Được đóng góp bởi Benjamin Szőke và Victor Stinner trong bpo-21302.)

  • Trên Windows 8.1 trở lên, time.sleep() hiện sử dụng bộ hẹn giờ có thể chờ dựa trên high-resolution timers có độ phân giải 100 nano giây (10-7 giây). Trước đây, nó có độ phân giải 1 mili giây (10-3 giây). (Được đóng góp bởi Benjamin Szőke, Donghee Na, Eryk Sun và Victor Stinner trong bpo-21302bpo-45429.)

tkinter

  • Đã thêm phương thức info_patchlevel() trả về phiên bản chính xác của thư viện Tcl dưới dạng một bộ dữ liệu có tên tương tự như sys.version_info. (Được đóng góp bởi Serhiy Storchaka trong gh-91827.)

truy nguyên

đánh máy

Để biết những thay đổi lớn, hãy xem Các tính năng mới liên quan đến gợi ý loại.

  • Thêm typing.assert_never()typing.Never. typing.assert_never() rất hữu ích khi yêu cầu trình kiểm tra loại xác nhận rằng không thể truy cập được một dòng mã. Khi chạy, nó tăng AssertionError. (Được đóng góp bởi Jelle Zijlstra trong gh-90633.)

  • Thêm typing.reveal_type(). Điều này rất hữu ích khi hỏi bộ kiểm tra kiểu xem nó đã suy ra kiểu gì cho một biểu thức đã cho. Khi chạy, nó in loại giá trị nhận được. (Được đóng góp bởi Jelle Zijlstra trong gh-90572.)

  • Thêm typing.assert_type(). Điều này rất hữu ích khi yêu cầu trình kiểm tra kiểu xác nhận rằng kiểu mà nó đã suy ra cho một biểu thức đã cho khớp với kiểu đã cho. Khi chạy nó chỉ trả về giá trị nhận được. (Được đóng góp bởi Jelle Zijlstra trong gh-90638.)

  • Các loại typing.TypedDict bây giờ có thể là chung chung. (Được đóng góp bởi Samodya Abeysiriwardane trong gh-89026.)

  • Các loại NamedTuple bây giờ có thể là chung chung. (Được đóng góp bởi Serhiy Storchaka trong bpo-43923.)

  • Cho phép phân lớp typing.Any. Điều này hữu ích để tránh các lỗi kiểm tra kiểu liên quan đến lớp có tính năng động cao, chẳng hạn như mô hình. (Được đóng góp bởi Shantanu Jain trong gh-91154.)

  • Trình trang trí typing.final() hiện đặt __final__ được gán trên đối tượng được trang trí. (Được đóng góp bởi Jelle Zijlstra trong gh-90500.)

  • Hàm typing.get_overloads() có thể được sử dụng để xem xét tình trạng quá tải của một hàm. typing.clear_overloads() có thể được sử dụng để xóa tất cả các tình trạng quá tải đã đăng ký của một hàm. (Được đóng góp bởi Jelle Zijlstra trong gh-89263.)

  • Phương thức __init__() của các lớp con Protocol hiện được giữ nguyên. (Được đóng góp bởi Adrian Garcia Badarasco trong gh-88970.)

  • Việc biểu diễn các loại bộ dữ liệu trống (Tuple[()]) được đơn giản hóa. Điều này ảnh hưởng đến sự xem xét nội tâm, ví dụ. get_args(Tuple[()]) hiện đánh giá thành () thay vì ((),). (Được đóng góp bởi Serhiy Storchaka trong gh-91137.)

  • Nới lỏng các yêu cầu về thời gian chạy đối với chú thích loại bằng cách xóa kiểm tra có thể gọi được trong hàm typing._type_check riêng tư. (Được đóng góp bởi Gregory Beauregard trong gh-90802.)

  • typing.get_type_hints() hiện hỗ trợ đánh giá các chuỗi dưới dạng tham chiếu chuyển tiếp trong PEP 585 generic aliases. (Được đóng góp bởi Niklas Rosenstein trong gh-85542.)

  • typing.get_type_hints() không còn thêm Optional vào các tham số có None làm mặc định. (Được đóng góp bởi Nikita Sobolev trong gh-90353.)

  • typing.get_type_hints() hiện hỗ trợ đánh giá các chú thích ClassVar được xâu chuỗi đơn giản. (Được đóng góp bởi Gregory Beauregard trong gh-90711.)

  • typing.no_type_check() không còn sửa đổi các lớp và hàm bên ngoài nữa. Bây giờ nó cũng đánh dấu chính xác các phương thức lớp là không được kiểm tra kiểu. (Được đóng góp bởi Nikita Sobolev trong gh-90729.)

dữ liệu unicode

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

nhỏ nhất

venv

  • Khi môi trường ảo Python mới được tạo, venv sysconfig installation scheme được sử dụng để xác định đường dẫn bên trong môi trường. Khi Python chạy trong môi trường ảo, sơ đồ cài đặt tương tự là mặc định. Điều đó có nghĩa là các nhà phân phối hạ nguồn có thể thay đổi sơ đồ cài đặt sysconfig mặc định mà không thay đổi hành vi của môi trường ảo. Mã của bên thứ ba cũng tạo môi trường ảo mới cũng nên thực hiện tương tự. (Được đóng góp bởi Miro Hrončok trong bpo-45413.)

cảnh báo

tập tin zip

  • Đã thêm hỗ trợ chỉ định mã hóa tên thành viên để đọc siêu dữ liệu trong thư mục và tiêu đề tệp của ZipFile. (Được đóng góp bởi Stephen J. Turnbull và Serhiy Storchaka trong bpo-28080.)

  • Đã thêm ZipFile.mkdir() để tạo thư mục mới bên trong kho lưu trữ ZIP. (Được đóng góp bởi Sam Ezeh trong gh-49083.)

  • Đã thêm stem, suffixsuffixes vào zipfile.Path. (Được đóng góp bởi Miguel Brito trong gh-88261.)

Tối ưu hóa

Phần này bao gồm các tối ưu hóa cụ thể độc lập với dự án CPython nhanh hơn, được đề cập trong phần riêng.

  • Trình biên dịch hiện tối ưu hóa printf-style % formatting đơn giản trên các chuỗi ký tự chỉ chứa các mã định dạng %s, %r%a và làm cho nó nhanh như biểu thức f-string tương ứng. (Được đóng góp bởi Serhiy Storchaka trong bpo-28307.)

  • Phép chia số nguyên (//) được điều chỉnh tốt hơn để tối ưu hóa bởi trình biên dịch. Hiện tại, nó nhanh hơn khoảng 20% ​​trên x86-64 khi chia int cho giá trị nhỏ hơn 2**30. (Được đóng góp bởi Gregory P. Smith và Tim Peters trong gh-90564.)

  • sum() hiện nhanh hơn gần 30% đối với các số nguyên nhỏ hơn 2**30. (Được đóng góp bởi Stefan Behnel trong gh-68264.)

  • Việc thay đổi kích thước danh sách được sắp xếp hợp lý cho trường hợp thông thường, tăng tốc list.append() lên ≈15% và list comprehensions đơn giản lên tới 20-30% (Được đóng góp bởi Dennis Sweeney trong gh-91165.)

  • Từ điển không lưu trữ giá trị băm khi tất cả các khóa đều là đối tượng Unicode, làm giảm kích thước dict. Ví dụ: sys.getsizeof(dict.fromkeys("abcdefg")) giảm từ 352 byte xuống 272 byte (nhỏ hơn 23%) trên nền tảng 64 bit. (Được đóng góp bởi Inada Naoki trong bpo-46845.)

  • Việc sử dụng asyncio.DatagramProtocol hiện nhanh hơn rất nhiều khi truyền các tệp lớn qua UDP, với tốc độ cao hơn 100 lần đối với tệp ≈60 MiB. (Được đóng góp bởi msoxzw trong gh-91487.)

  • Các hàm math comb()perm() hiện nhanh hơn ≈10 lần đối với các đối số lớn (với mức tăng tốc lớn hơn cho k lớn hơn). (Được đóng góp bởi Serhiy Storchaka trong bpo-37295.)

  • Các hàm statistics mean(), variance()stdev() hiện sử dụng các trình vòng lặp trong một lần thay vì chuyển đổi chúng thành list trước tiên. Tốc độ này nhanh gấp đôi và có thể tiết kiệm bộ nhớ đáng kể. (Được đóng góp bởi Raymond Hettinger trong gh-90415.)

  • unicodedata.normalize() hiện bình thường hóa các chuỗi thuần-ASCII trong thời gian không đổi. (Được đóng góp bởi Donghee Na trong bpo-44987.)

CPython nhanh hơn

CPython 3.11 là mức trung bình của 25% faster so với CPython 3.10 được đo bằng bộ điểm chuẩn pyperformance, khi được biên dịch bằng GCC trên Ubuntu Linux. Tùy thuộc vào khối lượng công việc của bạn, tốc độ tăng tốc tổng thể có thể là 10-60%.

Dự án này tập trung vào hai lĩnh vực chính trong Python: Khởi động nhanh hơnThời gian chạy nhanh hơn. Những tối ưu hóa không nằm trong dự án này được liệt kê riêng trong Tối ưu hóa.

Khởi động nhanh hơn

Nhập khẩu đông lạnh/Đối tượng mã tĩnh

Python lưu trữ bytecode trong thư mục __pycache__ để tăng tốc độ tải mô-đun.

Trước đây trong phiên bản 3.10, việc thực thi mô-đun Python trông như thế này:

Đọc __pycache__ -> Unmarshal -> Đối tượng mã được phân bổ heap -> Đánh giá

Trong Python 3.11, các mô-đun cốt lõi cần thiết cho việc khởi động Python đã bị "đóng băng". Điều này có nghĩa là Đối tượng mã (và mã byte) của chúng được trình thông dịch phân bổ tĩnh. Điều này làm giảm các bước trong quy trình thực hiện mô-đun thành:

Đối tượng mã được phân bổ tĩnh -> Đánh giá

Khởi động trình thông dịch hiện nhanh hơn 10-15% trong Python 3.11. Điều này có tác động lớn đối với các chương trình chạy ngắn sử dụng Python.

(Được đóng góp bởi Eric Snow, Guido van Rossum và Kumar Aditya trong nhiều số.)

Thời gian chạy nhanh hơn

Khung Python rẻ hơn, lười biếng hơn

Các khung Python, chứa thông tin thực thi, được tạo bất cứ khi nào Python gọi hàm Python. Sau đây là những tối ưu hóa khung hình mới:

  • Hợp lý hóa quá trình tạo khung.

  • Tránh phân bổ bộ nhớ bằng cách sử dụng lại nhiều không gian khung trên ngăn xếp C.

  • Sắp xếp hợp lý cấu trúc khung bên trong để chỉ chứa thông tin cần thiết. Các khung trước đây chứa thêm thông tin gỡ lỗi và quản lý bộ nhớ.

Zz000zz kiểu cũ hiện chỉ được tạo khi được yêu cầu bởi trình gỡ lỗi hoặc bởi các hàm xem xét nội bộ của Python như sys._getframe()inspect.currentframe(). Đối với hầu hết mã người dùng, không có đối tượng khung nào được tạo cả. Kết quả là gần như tất cả lệnh gọi hàm Python đều tăng tốc đáng kể. Chúng tôi đã đo được mức tăng tốc 3-7% trong hiệu suất hoạt động.

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

Lệnh gọi hàm Python nội tuyến

Trong lệnh gọi hàm Python, Python sẽ gọi hàm C đánh giá để diễn giải mã của hàm đó. Điều này hạn chế một cách hiệu quả đệ quy Python thuần túy ở mức an toàn cho ngăn xếp C.

Trong 3.11, khi CPython phát hiện mã Python gọi một hàm Python khác, nó sẽ thiết lập một khung mới và "nhảy" tới mã mới bên trong khung mới. Điều này tránh gọi hoàn toàn chức năng phiên dịch C.

Hầu hết các lệnh gọi hàm Python hiện không tiêu tốn dung lượng ngăn xếp C, giúp tăng tốc chúng. Trong các hàm đệ quy đơn giản như fibonacci hoặc giai thừa, chúng tôi đã quan sát thấy tốc độ tăng lên 1,7 lần. Điều này cũng có nghĩa là các hàm đệ quy có thể lặp lại sâu hơn đáng kể (nếu người dùng tăng giới hạn đệ quy với sys.setrecursionlimit()). Chúng tôi đo được mức cải thiện hiệu suất hoạt động là 1-3%.

(Được đóng góp bởi Pablo Galindo và Mark Shannon trong bpo-45256.)

PEP 659: Phiên dịch thích ứng chuyên dụng

PEP 659 là một trong những phần quan trọng của dự án Faster CPython. Ý tưởng chung là mặc dù Python là ngôn ngữ động nhưng hầu hết mã đều có các vùng mà đối tượng và kiểu hiếm khi thay đổi. Khái niệm này được gọi là type stability.

Khi chạy, Python sẽ cố gắng tìm kiếm các mẫu phổ biến và độ ổn định của kiểu trong mã thực thi. Python sau đó sẽ thay thế hoạt động hiện tại bằng một hoạt động chuyên biệt hơn. Hoạt động chuyên biệt này sử dụng các đường dẫn nhanh chỉ dành cho những trường hợp/loại sử dụng đó, thường hoạt động tốt hơn so với các đường dẫn chung của chúng. Điều này cũng mang đến một khái niệm khác gọi là inline caching, trong đó Python lưu trữ kết quả của các hoạt động tốn kém trực tiếp trong bytecode.

Chuyên gia cũng sẽ kết hợp một số cặp lệnh chung nhất định thành một siêu lệnh, giảm chi phí trong quá trình thực hiện.

Python sẽ chỉ chuyên biệt khi thấy code "nóng" (được thực thi nhiều lần). Điều này ngăn Python lãng phí thời gian vào mã chạy một lần. Python cũng có thể loại bỏ tính chuyên môn hóa khi mã quá linh hoạt hoặc khi việc sử dụng thay đổi. Chuyên môn hóa được cố gắng định kỳ và nỗ lực chuyên môn hóa không quá tốn kém, cho phép chuyên môn hóa thích ứng với hoàn cảnh mới.

(PEP do Mark Shannon viết, với ý tưởng lấy cảm hứng từ Stefan Brunthaler. Xem PEP 659 để biết thêm thông tin. Mark Shannon và Brandt Bucher thực hiện, với sự trợ giúp thêm từ Irit Katriel và Dennis Sweeney.)

hoạt động

biểu mẫu

Chuyên môn

Tăng tốc hoạt động (lên tới)

(Những) người đóng góp

Hoạt động nhị phân

x + x

x - x

x * x

Cộng, nhân và trừ nhị phân cho các loại phổ biến như int, floatstr có các đường dẫn nhanh tùy chỉnh cho các loại cơ bản của chúng.

10%

Mark Shannon, Donghee Na, Brandt Bucher, Dennis Sweeney

Chỉ số dưới

a[i]

Đăng ký các loại vùng chứa như list, tupledict trực tiếp lập chỉ mục các cấu trúc dữ liệu cơ bản.

Việc đăng ký __getitem__() tùy chỉnh cũng được nội tuyến tương tự như Lệnh gọi hàm Python nội tuyến.

10-25%

Irit Katriel, Mark Shannon

Lưu trữ đăng ký

a[i] = z

Tương tự như đăng ký chuyên môn ở trên.

10-25%

Dennis Sweeney

Cuộc gọi

f(arg)

C(arg)

Các lệnh gọi đến các hàm và kiểu dựng sẵn (C) phổ biến như len()str gọi trực tiếp phiên bản C cơ bản của chúng. Điều này tránh phải thực hiện quy ước gọi điện nội bộ.

20%

Mark Shannon, Ken Jin

Tải biến toàn cục

print

len

Chỉ mục của đối tượng trong không gian tên toàn cầu/nội trang được lưu trữ. Tải toàn cầu và nội dung yêu cầu tra cứu không gian tên bằng không.

[1]

Mark Shannon

Tải thuộc tính

o.attr

Tương tự như tải các biến toàn cục. Chỉ mục của thuộc tính bên trong không gian tên của lớp/đối tượng được lưu trữ. Trong hầu hết các trường hợp, việc tải thuộc tính sẽ không yêu cầu tra cứu không gian tên.

[2]

Mark Shannon

Tải phương thức cho cuộc gọi

o.meth()

Địa chỉ thực tế của phương thức được lưu trữ. Việc tải phương thức hiện không có tra cứu không gian tên -- ngay cả đối với các lớp có chuỗi kế thừa dài.

10-20%

Ken Jin, Mark Shannon

Thuộc tính cửa hàng

o.attr = z

Tương tự như tối ưu hóa thuộc tính tải.

2% trong hiệu suất hoạt động

Mark Shannon

Trình tự giải nén

*seq

Chuyên dùng cho các loại container thông dụng như list, tuple. Tránh quy ước gọi nội bộ.

8%

Brandt Bucher

linh tinh

  • Các đối tượng bây giờ yêu cầu ít bộ nhớ hơn do các không gian tên đối tượng được tạo một cách lười biếng. Từ điển không gian tên của họ giờ đây cũng chia sẻ khóa một cách tự do hơn. (Đã đóng góp Mark Shannon trong bpo-45340bpo-40116.)

  • Các ngoại lệ "không tốn phí" được triển khai, loại bỏ chi phí của câu lệnh try khi không có ngoại lệ nào được đưa ra. (Được đóng góp bởi Mark Shannon trong bpo-40222.)

  • Việc trình bày ngắn gọn hơn về các ngoại lệ trong trình thông dịch đã giảm khoảng 10% thời gian cần thiết để bắt ngoại lệ. (Được đóng góp bởi Irit Katriel trong bpo-45711.)

  • Công cụ khớp biểu thức chính quy của re đã được tái cấu trúc một phần và hiện sử dụng gotos được tính toán (hoặc "mã luồng") trên các nền tảng được hỗ trợ. Kết quả là Python 3.11 thực thi pyperformance regular expression benchmarks nhanh hơn tới 10% so với Python 3.10. (Được đóng góp bởi Brandt Bucher trong gh-91404.)

FAQ

Tôi nên viết mã như thế nào để tận dụng những tính năng tăng tốc này?

Viết mã Pythonic tuân theo các phương pháp hay nhất phổ biến; bạn không phải thay đổi mã của mình. Dự án Faster CPython tối ưu hóa các mẫu mã phổ biến mà chúng tôi quan sát được.

CPython 3.11 có sử dụng nhiều bộ nhớ hơn không?

Có lẽ không; chúng tôi không mong đợi mức sử dụng bộ nhớ sẽ cao hơn 20% so với 3.10. Điều này được bù đắp bằng cách tối ưu hóa bộ nhớ cho các đối tượng khung và từ điển đối tượng như đã đề cập ở trên.

Tôi không thấy bất kỳ sự tăng tốc nào trong khối lượng công việc của mình. Tại sao?

Một số mã nhất định sẽ không có lợi ích đáng chú ý. Nếu mã của bạn dành phần lớn thời gian cho các hoạt động I/O hoặc đã thực hiện phần lớn tính toán trong thư viện tiện ích mở rộng C như NumPy thì tốc độ sẽ không tăng đáng kể. Dự án này hiện mang lại lợi ích nhiều nhất cho khối lượng công việc Python thuần túy.

Hơn nữa, các số liệu hiệu suất hoạt động là một giá trị trung bình hình học. Ngay cả trong các điểm chuẩn hiệu suất hoạt động, một số điểm chuẩn nhất định đã chậm lại một chút, trong khi những điểm chuẩn khác đã tăng tốc gần gấp đôi!

Có trình biên dịch JIT không?

Không. Chúng tôi vẫn đang khám phá các cách tối ưu hóa khác.

Giới thiệu

CPython nhanh hơn khám phá các tối ưu hóa cho CPython. Nhóm chính được Microsoft tài trợ để làm việc toàn thời gian. Pablo Galindo Salgado cũng được Bloomberg LP tài trợ để làm việc bán thời gian cho dự án. Cuối cùng, nhiều người đóng góp là tình nguyện viên của cộng đồng.

Thay đổi mã byte CPython

Mã byte hiện chứa các mục nhập bộ nhớ đệm nội tuyến, có dạng hướng dẫn CACHE mới được thêm vào. Nhiều opcode mong muốn được theo sau bởi một số lượng bộ đệm chính xác và hướng dẫn trình thông dịch bỏ qua chúng khi chạy. Bộ nhớ đệm phổ biến có thể trông giống như các hướng dẫn tùy ý, vì vậy cần hết sức cẩn thận khi đọc hoặc sửa đổi mã byte thích ứng thô chứa dữ liệu được tăng tốc.

Opcode mới

Opcode được thay thế

(Các) Opcode được thay thế

(Các) Opcode mới

Ghi chú

BINARY_*
INPLACE_*

BINARY_OP

Đã thay thế tất cả các mã nhị phân số/tại chỗ bằng một mã opcode duy nhất

CALL_FUNCTION
CALL_FUNCTION_KW
CALL_METHOD
KW_NAMES
PRECALL

Tách riêng việc chuyển đối số cho các phương thức khỏi việc xử lý đối số từ khóa; cho phép chuyên môn hóa tốt hơn các cuộc gọi

DUP_TOP
DUP_TOP_TWO
ROT_TWO
ROT_THREE
ROT_FOUR
ROT_N

Hướng dẫn thao tác ngăn xếp

JUMP_IF_NOT_EXC_MATCH

Bây giờ thực hiện kiểm tra nhưng không nhảy

JUMP_ABSOLUTE
POP_JUMP_IF_FALSE
POP_JUMP_IF_TRUE
POP_JUMP_BACKWARD_IF_*
POP_JUMP_FORWARD_IF_*

Xem [3]; Các biến thể TRUE, FALSE, NONENOT_NONE cho mỗi hướng

SETUP_WITH
SETUP_ASYNC_WITH

BEFORE_WITH

thiết lập khối with

Opcode đã thay đổi/xóa

  • Đã thay đổi MATCH_CLASSMATCH_KEYS để không còn đẩy giá trị boolean bổ sung để biểu thị thành công/thất bại. Thay vào đó, None bị đẩy vào trạng thái lỗi thay cho bộ giá trị được trích xuất.

  • Các mã hoạt động đã thay đổi hoạt động với các ngoại lệ để phản ánh chúng hiện được biểu thị dưới dạng một mục trên ngăn xếp thay vì ba (xem gh-89874).

  • Đã xóa COPY_DICT_WITHOUT_KEYS, GEN_START, POP_BLOCK, SETUP_FINALLYYIELD_FROM.

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

Phần này liệt kê các API Python không được dùng nữa trong Python 3.11.

API C không được dùng nữa là listed separately.

Ngôn ngữ/Tích hợp

  • Chuỗi mô tả classmethod (được giới thiệu trong bpo-19072) hiện không được dùng nữa. Nó không còn có thể được sử dụng để bao bọc các bộ mô tả khác như property. Thiết kế cốt lõi của tính năng này có sai sót và gây ra một số vấn đề về sau. Để "chuyển qua" classmethod, hãy cân nhắc sử dụng thuộc tính __wrapped__ đã được thêm vào Python 3.10. (Được đóng góp bởi Raymond Hettinger trong gh-89519.)

  • Thoát bát phân trong chuỗi và byte bằng chữ có giá trị lớn hơn 0o377 (255 ở dạng thập phân) hiện tạo ra DeprecationWarning. Trong phiên bản Python tương lai, họ sẽ đưa ra SyntaxWarning và cuối cùng là SyntaxError. (Được đóng góp bởi Serhiy Storchaka trong gh-81548.)

  • Việc ủy quyền int() đến __trunc__() hiện không còn được dùng nữa. Gọi int(a) khi type(a) triển khai __trunc__() chứ không phải __int__() hay __index__() giờ sẽ tăng DeprecationWarning. (Được đóng góp bởi Zackery Spytz trong bpo-44977.)

Mô-đun

  • PEP 594 đã dẫn đến việc ngừng sử dụng các mô-đun sau dự kiến bị xóa trong Python 3.13:

    aifc

    chunk

    msilib

    pipes

    telnetlib

    audioop

    crypt

    nis

    sndhdr

    uu

    cgi

    imghdr

    nntplib

    spwd

    xdrlib

    cgitb

    mailcap

    ossaudiodev

    sunau

    (Được đóng góp bởi Brett Cannon trong bpo-47061 và Victor Stinner trong gh-68966.)

  • Các mô-đun asynchat, asyncoresmtpd đã không còn được dùng nữa kể từ ít nhất là Python 3.6. Tài liệu và cảnh báo không dùng nữa của họ hiện đã được cập nhật để lưu ý rằng chúng sẽ bị xóa trong Python 3.12. (Được đóng góp bởi Hugo van Kemenade trong bpo-47022.)

  • Gói lib2to3 và công cụ 2to3 hiện không được dùng nữa và có thể không phân tích được Python 3.10 hoặc mới hơn. Xem PEP 617, giới thiệu trình phân tích cú pháp PEG mới để biết chi tiết. (Được đóng góp bởi Victor Stinner trong bpo-40360.)

  • Các mô-đun không có giấy tờ sre_compile, sre_constantssre_parse hiện không được dùng nữa. (Được đóng góp bởi Serhiy Storchaka trong bpo-47152.)

Thư viện chuẩn

  • Những điều sau đây không được dùng nữa trong configparser kể từ Python 3.2. Cảnh báo không dùng nữa của họ hiện đã được cập nhật để lưu ý rằng chúng sẽ bị xóa trong Python 3.12:

    • lớp học configparser.SafeConfigParser

    • thuộc tính configparser.ParsingError.filename

    • phương pháp configparser.RawConfigParser.readfp()

    (Được đóng góp bởi Hugo van Kemenade trong bpo-45173.)

  • configparser.LegacyInterpolation không được dùng nữa trong chuỗi tài liệu kể từ Python 3.2 và không được liệt kê trong tài liệu configparser. Bây giờ nó phát ra DeprecationWarning và sẽ bị xóa trong Python 3.13. Thay vào đó hãy sử dụng configparser.BasicInterpolation hoặc configparser.ExtendedInterpolation. (Được đóng góp bởi Hugo van Kemenade trong bpo-46607.)

  • Bộ hàm importlib.resources cũ hơn không được dùng nữa để thay thế bằng các hàm thay thế được thêm vào trong Python 3.9 và sẽ bị xóa trong phiên bản Python trong tương lai do không hỗ trợ các tài nguyên nằm trong thư mục con của gói:

    • importlib.resources.contents()

    • importlib.resources.is_resource()

    • importlib.resources.open_binary()

    • importlib.resources.open_text()

    • importlib.resources.read_binary()

    • importlib.resources.read_text()

    • importlib.resources.path()

  • Hàm locale.getdefaultlocale() không được dùng nữa và sẽ bị xóa trong Python 3.15. Thay vào đó, hãy sử dụng các hàm locale.setlocale(), locale.getpreferredencoding(False)locale.getlocale(). (Được đóng góp bởi Victor Stinner trong gh-90817.)

  • Hàm locale.resetlocale() không được dùng nữa và sẽ bị xóa trong Python 3.13. Thay vào đó hãy sử dụng locale.setlocale(locale.LC_ALL, ""). (Được đóng góp bởi Victor Stinner trong gh-90817.)

  • Các quy tắc chặt chẽ hơn hiện sẽ được áp dụng cho các tham chiếu nhóm số và tên nhóm trong regular expressions. Giờ đây, chỉ các chuỗi chữ số ASCII mới được chấp nhận làm tham chiếu số và tên nhóm trong mẫu bytes và chuỗi thay thế chỉ có thể chứa các chữ cái, chữ số và dấu gạch dưới ASCII. Hiện tại, cảnh báo không dùng nữa được đưa ra đối với cú pháp vi phạm các quy tắc này. (Được đóng góp bởi Serhiy Storchaka trong gh-91760.)

  • Trong mô-đun re, hàm re.template() và các cờ re.TEMPLATEre.T tương ứng không được dùng nữa vì chúng không có giấy tờ và thiếu mục đích rõ ràng. Chúng sẽ bị xóa trong Python 3.13. (Được đóng góp bởi Serhiy Storchaka và Miro Hrončok trong gh-92728.)

  • turtle.settiltangle() đã không được dùng nữa kể từ Python 3.1; hiện tại nó phát ra cảnh báo không dùng nữa và sẽ bị xóa trong Python 3.13. Thay vào đó, hãy sử dụng turtle.tiltangle() (trước đó nó bị đánh dấu không chính xác là không được dùng nữa và chuỗi tài liệu của nó hiện đã được sửa). (Được đóng góp bởi Hugo van Kemenade trong bpo-45837.)

  • typing.Text, chỉ tồn tại để cung cấp hỗ trợ tương thích giữa mã Python 2 và Python 3, hiện không được dùng nữa. Việc loại bỏ nó hiện chưa được lên kế hoạch, nhưng người dùng được khuyến khích sử dụng str bất cứ khi nào có thể. (Được đóng góp bởi Alex Waygood trong gh-92332.)

  • Cú pháp đối số từ khóa để xây dựng các loại typing.TypedDict hiện không được dùng nữa. Hỗ trợ sẽ bị xóa trong Python 3.13. (Được đóng góp bởi Jingchen Ye trong gh-90224.)

  • webbrowser.MacOSX không được dùng nữa và sẽ bị xóa trong Python 3.13. Nó chưa được kiểm tra, không có giấy tờ và không được webbrowser sử dụng. (Được đóng góp bởi Donghee Na trong bpo-42255.)

  • Hành vi trả về giá trị từ phương thức kiểm tra TestCaseIsolatedAsyncioTestCase (khác với giá trị None mặc định) hiện không được dùng nữa.

  • Không dùng nữa các hàm unittest không được ghi chép chính thức sau đây, được lên lịch xóa trong Python 3.13:

    • unittest.findTestCases()

    • unittest.makeSuite()

    • unittest.getTestCaseNames()

    Thay vào đó hãy sử dụng các phương thức TestLoader:

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

  • unittest.TestProgram.usageExit() được đánh dấu là không dùng nữa và sẽ bị xóa trong phiên bản 3.13. (Được đóng góp bởi Carlos Damázio trong gh-67048.)

Đang chờ xóa trong Python 3.12

Các API Python sau đây không được dùng nữa trong các bản phát hành Python trước đó và sẽ bị xóa trong Python 3.12.

API C đang chờ xóa là listed separately.

  • Mô-đun asynchat

  • Mô-đun asyncore

  • entire distutils package

  • Mô-đun imp

  • Không gian tên typing.io

  • Không gian tên typing.re

  • cgi.log()

  • importlib.find_loader()

  • importlib.abc.Loader.module_repr()

  • importlib.abc.MetaPathFinder.find_module()

  • importlib.abc.PathEntryFinder.find_loader()

  • importlib.abc.PathEntryFinder.find_module()

  • importlib.machinery.BuiltinImporter.find_module()

  • importlib.machinery.BuiltinLoader.module_repr()

  • importlib.machinery.FileFinder.find_loader()

  • importlib.machinery.FileFinder.find_module()

  • importlib.machinery.FrozenImporter.find_module()

  • importlib.machinery.FrozenLoader.module_repr()

  • importlib.machinery.PathFinder.find_module()

  • importlib.machinery.WindowsRegistryFinder.find_module()

  • importlib.util.module_for_loader()

  • importlib.util.set_loader_wrapper()

  • importlib.util.set_package_wrapper()

  • pkgutil.ImpImporter

  • pkgutil.ImpLoader

  • pathlib.Path.link_to()

  • sqlite3.enable_shared_cache()

  • sqlite3.OptimizedUnicode()

  • biến môi trường PYTHONTHREADDEBUG

  • Các bí danh không được dùng nữa trong unittest:

    Bí danh không được dùng nữa

    Tên phương thức

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

    failUnless

    assertTrue()

    3.1

    failIf

    assertFalse()

    3.1

    failUnlessEqual

    assertEqual()

    3.1

    failIfEqual

    assertNotEqual()

    3.1

    failUnlessAlmostEqual

    assertAlmostEqual()

    3.1

    failIfAlmostEqual

    assertNotAlmostEqual()

    3.1

    failUnlessRaises

    assertRaises()

    3.1

    assert_

    assertTrue()

    3.2

    assertEquals

    assertEqual()

    3.2

    assertNotEquals

    assertNotEqual()

    3.2

    assertAlmostEquals

    assertAlmostEqual()

    3.2

    assertNotAlmostEquals

    assertNotAlmostEqual()

    3.2

    assertRegexpMatches

    assertRegex()

    3.2

    assertRaisesRegexp

    assertRaisesRegex()

    3.2

    assertNotRegexpMatches

    assertNotRegex()

    3,5

Đã xóa

Phần này liệt kê các API Python đã bị xóa trong Python 3.11.

API C đã bị xóa là listed separately.

  • Đã xóa @asyncio.coroutine() decorator cho phép các coroutine dựa trên trình tạo cũ tương thích với mã async/await. Hàm này không được dùng nữa kể từ Python 3.8 và việc xóa ban đầu được lên lịch cho Python 3.10. Thay vào đó hãy sử dụng async def. (Được đóng góp bởi Illia Volochii trong bpo-43216.)

  • Đã xóa asyncio.coroutines.CoroWrapper dùng để gói các đối tượng coroutine dựa trên trình tạo cũ ở chế độ gỡ lỗi. (Được đóng góp bởi Illia Volochii trong bpo-43216.)

  • Do những lo ngại đáng kể về bảo mật, tham số reuse_address của asyncio.loop.create_datagram_endpoint(), bị vô hiệu hóa trong Python 3.9, hiện đã bị xóa hoàn toàn. Điều này là do hoạt động của tùy chọn ổ cắm SO_REUSEADDR trong UDP. (Được đóng góp bởi Hugo van Kemenade trong bpo-45129.)

  • Đã xóa mô-đun binhex, không được dùng nữa trong Python 3.9. Đồng thời xóa các hàm binascii có liên quan, không được dùng nữa:

    • binascii.a2b_hqx()

    • binascii.b2a_hqx()

    • binascii.rlecode_hqx()

    • binascii.rldecode_hqx()

    Chức năng binascii.crc_hqx() vẫn khả dụng.

    (Được đóng góp bởi Victor Stinner trong bpo-45085.)

  • Đã xóa lệnh distutils bdist_msi không được dùng nữa trong Python 3.9. Thay vào đó hãy sử dụng bdist_wheel (gói bánh xe). (Được đóng góp bởi Hugo van Kemenade trong bpo-45124.)

  • Đã xóa các phương thức __getitem__() của xml.dom.pulldom.DOMEventStream, wsgiref.util.FileWrapperfileinput.FileInput, không được dùng nữa kể từ Python 3.9. (Được đóng góp bởi Hugo van Kemenade trong bpo-45132.)

  • Đã xóa các hàm gettext không được dùng nữa là lgettext(), ldgettext(), lngettext()ldngettext(). Đồng thời, loại bỏ hàm bind_textdomain_codeset(), các phương thức NullTranslations.output_charset()NullTranslations.set_output_charset() cũng như tham số codeset của translation()install(), vì chúng chỉ được sử dụng cho các hàm l*gettext(). (Được đóng góp bởi Donghee Na và Serhiy Storchaka trong bpo-44235.)

  • Đã xóa khỏi mô-đun inspect:

    • Hàm getargspec(), không được dùng nữa kể từ Python 3.0; thay vào đó hãy sử dụng inspect.signature() hoặc inspect.getfullargspec().

    • Hàm formatargspec(), không được dùng nữa kể từ Python 3.5; sử dụng trực tiếp hàm inspect.signature() hoặc đối tượng inspect.Signature.

    • Các phương thức Signature.from_builtin()Signature.from_function() không có giấy tờ, không được dùng nữa kể từ Python 3.5; thay vào đó hãy sử dụng phương pháp Signature.from_callable().

    (Được đóng góp bởi Hugo van Kemenade trong bpo-45320.)

  • Đã xóa phương thức __class_getitem__() khỏi pathlib.PurePath vì nó không được sử dụng và thêm nhầm vào các phiên bản trước. (Được đóng góp bởi Nikita Sobolev trong bpo-46483.)

  • Đã xóa lớp MailmanProxy trong mô-đun smtpd vì nó không thể sử dụng được nếu không có gói mailman bên ngoài. (Được đóng góp bởi Donghee Na trong bpo-35800.)

  • Đã xóa phương thức split() không được dùng nữa của _tkinter.TkappType. (Được đóng góp bởi Erlend E. Aasland trong bpo-38371.)

  • Đã xóa hỗ trợ gói không gian tên khỏi khám phá unittest. Nó được giới thiệu trong Python 3.4 nhưng đã bị hỏng kể từ Python 3.7. (Được đóng góp bởi Inada Naoki trong bpo-23882.)

  • Đã xóa phương thức float.__set_format__() riêng tư không có giấy tờ, trước đây gọi là float.__setformat__() trong Python 3.7. Chuỗi tài liệu của nó cho biết: "Có thể bạn không muốn sử dụng hàm này. Nó tồn tại chủ yếu để sử dụng trong bộ thử nghiệm của Python." (Được đóng góp bởi Victor Stinner trong bpo-46852.)

  • Cờ cấu hình --experimental-isolated-subinterpreters (và macro EXPERIMENTAL_ISOLATED_SUBINTERPRETERS tương ứng) đã bị xóa.

  • Pynche --- Trình chỉnh sửa Màu sắc và Màu sắc tự nhiên của Python --- đã được chuyển ra khỏi Tools/scripts và là being developed independently từ cây nguồn Python.

Chuyển sang Python 3.11

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 trong API Python có thể yêu cầu thay đổi mã Python của bạn.

Ghi chú chuyển cho C API là listed separately.

  • open(), io.open(), codecs.open()fileinput.FileInput không còn chấp nhận 'U' ("dòng mới chung") ở chế độ tệp. Trong Python 3, chế độ "dòng mới phổ quát" được sử dụng theo mặc định bất cứ khi nào tệp được mở ở chế độ văn bản và cờ 'U' không được dùng nữa kể từ Python 3.3. Zz004zz cho các chức năng này kiểm soát cách hoạt động của các dòng mới phổ biến. (Được đóng góp bởi Victor Stinner trong bpo-37330.)

  • Vị trí nút ast.AST hiện được xác thực khi được cung cấp cho compile() và các chức năng liên quan khác. Nếu phát hiện vị trí không hợp lệ, ValueError sẽ được nâng lên. (Được đóng góp bởi Pablo Galindo trong gh-93351)

  • Cấm chuyển các trình thực thi không phải concurrent.futures.ThreadPoolExecutor sang asyncio.loop.set_default_executor() sau khi Python 3.8 không được dùng nữa. (Được đóng góp bởi Illia Volochii trong bpo-43234.)

  • calendar: Các lớp calendar.LocaleTextCalendarcalendar.LocaleHTMLCalendar hiện sử dụng locale.getlocale(), thay vì sử dụng locale.getdefaultlocale(), nếu không có ngôn ngữ nào được chỉ định. (Được đóng góp bởi Victor Stinner trong bpo-46659.)

  • Mô-đun pdb hiện đọc tệp cấu hình .pdbrc với mã hóa 'UTF-8'. (Được đóng góp bởi Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి) trên bpo-41137.)

  • Tham số population của random.sample() phải là một chuỗi và việc chuyển đổi tự động sets thành lists không còn được hỗ trợ. Ngoài ra, nếu kích thước mẫu lớn hơn kích thước tổng thể thì ValueError sẽ tăng lên. (Được đóng góp bởi Raymond Hettinger trong bpo-40465.)

  • Tham số tùy chọn random của random.shuffle() đã bị xóa. Trước đây nó là một hàm ngẫu nhiên tùy ý được sử dụng để xáo trộn; bây giờ, random.random() (mặc định trước đó) sẽ luôn được sử dụng.

  • Trong re Cú pháp biểu thức chính quy, cờ nội tuyến toàn cầu (ví dụ: (?i)) hiện chỉ có thể được sử dụng khi bắt đầu biểu thức chính quy. Việc sử dụng chúng ở những nơi khác đã không được dùng nữa kể từ Python 3.6. (Được đóng góp bởi Serhiy Storchaka trong bpo-47066.)

  • Trong mô-đun re, một số lỗi tồn tại lâu đời đã được sửa, trong một số trường hợp hiếm hoi, có thể khiến các nhóm chụp nhận được kết quả sai. Do đó, điều này có thể thay đổi đầu ra được ghi lại trong những trường hợp này. (Được đóng góp bởi Ma Lin trong bpo-35859.)

Xây dựng thay đổi

  • CPython hiện có PEP 11 Tier 3 support để biên dịch chéo sang nền tảng WebAssembly Emscripten (wasm32-unknown-emscripten, tức là Python trong trình duyệt) và WebAssembly System Interface (WASI) (wasm32-unknown-wasi). Nỗ lực này được lấy cảm hứng từ tác phẩm trước đó như Pyodide. Các nền tảng này cung cấp một tập hợp con giới hạn các API POSIX; Các tính năng và mô-đun của thư viện chuẩn Python liên quan đến mạng, quy trình, phân luồng, tín hiệu, mmap và người dùng/nhóm không có sẵn hoặc không hoạt động. (Emscripten do Christian Heimes và Ethan Smith đóng góp trong gh-84461 và WASI do Christian Heimes đóng góp trong gh-90473; nền tảng được quảng cáo trong gh-95085)

  • Xây dựng CPython hiện yêu cầu:

  • Macro Py_NO_NAN đã bị xóa. Vì CPython hiện yêu cầu số float IEEE 754 nên giá trị NaN luôn có sẵn. (Được đóng góp bởi Victor Stinner trong bpo-46656.)

  • Gói tkinter hiện yêu cầu Tcl/Tk phiên bản 8.5.12 trở lên. (Được đóng góp bởi Serhiy Storchaka trong bpo-46996.)

  • Xây dựng các phần phụ thuộc, cờ trình biên dịch và cờ liên kết cho hầu hết các mô-đun mở rộng stdlib hiện được configure phát hiện. Các cờ libffi, libnsl, libsqlite3, zlib, bzip2, liblzma, libcrypt, Tcl/Tk và uuid được phát hiện bởi pkg-config (khi khả dụng). tkinter hiện yêu cầu lệnh pkg-config để phát hiện cài đặt phát triển cho các tiêu đề và thư viện Tcl/Tk. (Được đóng góp bởi Christian Heimes và Erlend Egeberg Aasland trong bpo-45847, bpo-45747bpo-45763.)

  • libpython không còn được liên kết với libcrypt nữa. (Được đóng góp bởi Mike Gilbert trong bpo-45433.)

  • CPython hiện có thể được xây dựng với tùy chọn ThinLTO thông qua việc chuyển thin sang --with-lto, tức là --with-lto=thin. (Được đóng góp bởi Donghee Na và Brett Holman trong bpo-44340.)

  • Danh sách tự do cho cấu trúc đối tượng hiện có thể bị vô hiệu hóa. Tùy chọn configure mới --without-freelists có thể được sử dụng để vô hiệu hóa tất cả các danh sách tự do ngoại trừ bộ dữ liệu đơn lẻ trống. (Được đóng góp bởi Christian Heimes trong bpo-45522.)

  • Modules/SetupModules/makesetup đã được cải tiến và gắn kết. Các mô-đun mở rộng hiện có thể được xây dựng thông qua makesetup. Tất cả ngoại trừ một số mô-đun thử nghiệm có thể được liên kết tĩnh vào một thư viện hoặc nhị phân chính. (Được đóng góp bởi Brett Cannon và Christian Heimes trong bpo-45548, bpo-45570, bpo-45571bpo-43974.)

    Ghi chú

    Sử dụng các biến môi trường TCLTK_CFLAGSTCLTK_LIBS để chỉ định thủ công vị trí của các tiêu đề và thư viện Tcl/Tk. Các tùy chọn configure --with-tcltk-includes--with-tcltk-libs đã bị xóa.

    Trên RHEL 7 và CentOS 7, các gói phát triển không cung cấp tcl.pctk.pc; sử dụng TCLTK_LIBS="-ltk8.5 -ltkstub8.5 -ltcl8.5". Thư mục Misc/rhel7 chứa các tệp .pc và hướng dẫn về cách xây dựng Python với Tcl/Tk và OpenSSL của RHEL 7 và CentOS 7.

  • CPython bây giờ sẽ sử dụng các chữ số 30 bit theo mặc định để triển khai Python int. Trước đây, mặc định là sử dụng các chữ số 30 bit trên nền tảng có SIZEOF_VOID_P >= 8 và các chữ số 15 bit khác. Vẫn có thể yêu cầu rõ ràng việc sử dụng các chữ số 15 bit thông qua tùy chọn --enable-big-digits cho tập lệnh cấu hình hoặc (đối với Windows) biến PYLONG_BITS_IN_DIGIT trong PC/pyconfig.h, nhưng tùy chọn này có thể bị xóa vào một thời điểm nào đó trong tương lai. (Được đóng góp bởi Mark Dickinson trong bpo-45569.)

C API Thay đổi

Tính năng mới

Chuyển sang Python 3.11

  • Một số macro đã được chuyển đổi thành các hàm nội tuyến tĩnh để tránh macro pitfalls. Sự thay đổi hầu như phải rõ ràng đối với người dùng, vì các hàm thay thế sẽ chuyển đối số của chúng sang loại dự kiến ​​để tránh cảnh báo của trình biên dịch do kiểm tra kiểu tĩnh. Tuy nhiên, khi C API giới hạn được đặt thành >=3,11, các lần chuyển đổi này chưa được thực hiện và người gọi sẽ cần chuyển các đối số theo loại dự kiến ​​của họ. Xem PEP 670 để biết thêm chi tiết. (Được đóng góp bởi Victor Stinner và Erlend E. Aasland trong gh-89653.)

  • PyErr_SetExcInfo() không còn sử dụng các đối số typetraceback nữa, trình thông dịch hiện lấy các giá trị đó từ phiên bản ngoại lệ (đối số value). Hàm vẫn lấy tham chiếu của cả ba đối số. (Được đóng góp bởi Irit Katriel trong bpo-45711.)

  • PyErr_GetExcInfo() hiện lấy các trường typetraceback của kết quả từ phiên bản ngoại lệ (trường value). (Được đóng góp bởi Irit Katriel trong bpo-45711.)

  • _frozen có trường is_package mới để cho biết mô-đun bị đóng băng có phải là một gói hay không. Trước đây, giá trị âm trong trường size là chỉ báo. Bây giờ chỉ sử dụng các giá trị không âm cho size. (Được đóng góp bởi Kumar Aditya trong bpo-46608.)

  • _PyFrameEvalFunction() hiện lấy _PyInterpreterFrame* làm tham số thứ hai, thay vì PyFrameObject*. Xem PEP 523 để biết thêm chi tiết về cách sử dụng loại con trỏ hàm này.

  • PyCode_New()PyCode_NewWithPosOnlyArgs() hiện có thêm đối số exception_table. Nên tránh sử dụng các chức năng này nếu có thể. Để có được một đối tượng mã tùy chỉnh: tạo một đối tượng mã bằng trình biên dịch, sau đó lấy phiên bản sửa đổi bằng phương thức replace.

  • PyCodeObject không còn có các trường co_code, co_varnames, co_cellvarsco_freevars. Thay vào đó, hãy sử dụng PyCode_GetCode(), PyCode_GetVarnames(), PyCode_GetCellvars()PyCode_GetFreevars() tương ứng để truy cập chúng thông qua C API. (Được đóng góp bởi Brandt Bucher trong bpo-46841 và Ken Jin trong gh-92154gh-94936.)

  • Các macro thùng rác cũ (Py_TRASHCAN_SAFE_BEGIN/Py_TRASHCAN_SAFE_END) hiện không được dùng nữa. Chúng nên được thay thế bằng macro mới Py_TRASHCAN_BEGINPy_TRASHCAN_END.

    Hàm tp_dealloc có các macro cũ, chẳng hạn như:

    khoảng trống tĩnh
    mytype_dealloc(mytype *p)
    {
        PyObject_GC_UnTrack(p);
        Py_TRASHCAN_SAFE_BEGIN(p);
        ...
        Py_TRASHCAN_SAFE_END
    }
    

    nên di chuyển sang các macro mới như sau:

    khoảng trống tĩnh
    mytype_dealloc(mytype *p)
    {
        PyObject_GC_UnTrack(p);
        Py_TRASHCAN_BEGIN(p, mytype_dealloc)
        ...
        Py_TRASHCAN_END
    }
    

    Lưu ý rằng Py_TRASHCAN_BEGIN có đối số thứ hai sẽ là hàm phân bổ mà nó có trong đó.

    Để hỗ trợ các phiên bản Python cũ hơn trong cùng một cơ sở mã, bạn có thể xác định các macro sau và sử dụng chúng trong toàn bộ mã (tín dụng: các macro này được sao chép từ cơ sở mã mypy):

    #if PY_VERSION_HEX >= 0x03080000
    #  define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc)
    #  define CPy_TRASHCAN_END(op) Py_TRASHCAN_END
    #else
    #  define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op)
    #  define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op)
    #endif
    
  • Hàm PyType_Ready() hiện phát sinh lỗi nếu một loại được xác định bằng bộ cờ Py_TPFLAGS_HAVE_GC nhưng không có chức năng duyệt ngang (PyTypeObject.tp_traverse). (Được đóng góp bởi Victor Stinner trong bpo-44263.)

  • Các loại heap có cờ Py_TPFLAGS_IMMUTABLETYPE hiện có thể kế thừa giao thức vectorcall PEP 590. Trước đây, điều này chỉ có thể thực hiện được với static types. (Được đóng góp bởi Erlend E. Aasland trong bpo-43908)

  • Py_TYPE() được thay đổi thành hàm tĩnh nội tuyến, nên Py_TYPE(obj) = new_type phải được thay thế bằng Py_SET_TYPE(obj, new_type): xem hàm Py_SET_TYPE() (có sẵn từ Python 3.9). Để tương thích ngược, macro này có thể được sử dụng

    #if PY_VERSION_HEX < 0x030900A4 && ! đã xác định(Py_SET_TYPE)
    khoảng trống nội tuyến tĩnh _Py_SET_TYPE(PyObject *ob, PyTypeObject *type)
    { ob->ob_type = loại; }
    #define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type)
    #endif
    

    (Được đóng góp bởi Victor Stinner trong bpo-39573.)

  • Py_SIZE() được thay đổi thành hàm tĩnh nội tuyến, nên Py_SIZE(obj) = new_size phải được thay thế bằng Py_SET_SIZE(obj, new_size): xem hàm Py_SET_SIZE() (có sẵn từ Python 3.9). Để tương thích ngược, macro này có thể được sử dụng

    #if PY_VERSION_HEX < 0x030900A4 && !được xác định(Py_SET_SIZE)
    void nội tuyến tĩnh _Py_SET_SIZE(PyVarObject *ob, kích thước Py_ssize_t)
    { ob->ob_size = kích thước; }
    #define Py_SET_SIZE(ob, kích thước) _Py_SET_SIZE((PyVarObject*)(ob), kích thước)
    #endif
    

    (Được đóng góp bởi Victor Stinner trong bpo-39573.)

  • <Python.h> không còn bao gồm các tệp tiêu đề <stdlib.h>, <stdio.h>, <errno.h><string.h> khi macro Py_LIMITED_API được đặt thành 0x030b0000 (Python 3.11) trở lên. Tiện ích mở rộng C phải bao gồm rõ ràng các tệp tiêu đề sau #include <Python.h>. (Được đóng góp bởi Victor Stinner trong bpo-45434.)

  • Các tệp API không giới hạn cellobject.h, classobject.h, code.h, context.h, funcobject.h, genobject.hlongintrepr.h đã được chuyển đến thư mục Include/cpython. Hơn nữa, tệp tiêu đề eval.h đã bị xóa. Không được đưa trực tiếp các tệp này vào vì chúng đã được đưa vào Python.h: Include Files. Nếu chúng đã được đưa trực tiếp vào, thay vào đó hãy xem xét việc đưa vào Python.h. (Được đóng góp bởi Victor Stinner trong bpo-35134.)

  • Macro PyUnicode_CHECK_INTERNED() đã bị loại khỏi C API giới hạn. Nó không bao giờ có thể sử dụng được ở đó vì nó sử dụng các cấu trúc bên trong không có sẵn trong C API giới hạn. (Được đóng góp bởi Victor Stinner trong bpo-46007.)

  • Các chức năng và loại khung sau hiện có sẵn trực tiếp với #include <Python.h>, không cần thêm #include <frameobject.h> nữa:

    (Được đóng góp bởi Victor Stinner trong gh-93937.)

  • Các thành viên cấu trúc PyFrameObject đã bị xóa khỏi C API công khai.

    Mặc dù tài liệu lưu ý rằng các trường PyFrameObject có thể thay đổi bất kỳ lúc nào nhưng chúng đã ổn định trong một thời gian dài và được sử dụng trong một số tiện ích mở rộng phổ biến.

    Trong Python 3.11, cấu trúc khung được tổ chức lại để cho phép tối ưu hóa hiệu suất. Một số trường đã bị xóa hoàn toàn vì chúng là chi tiết của cách triển khai cũ.

    trường PyFrameObject:

    • f_back: sử dụng PyFrame_GetBack().

    • f_blockstack: đã xóa.

    • f_builtins: sử dụng PyFrame_GetBuiltins().

    • f_code: sử dụng PyFrame_GetCode().

    • f_gen: sử dụng PyFrame_GetGenerator().

    • f_globals: sử dụng PyFrame_GetGlobals().

    • f_iblock: đã xóa.

    • f_lasti: sử dụng PyFrame_GetLasti(). Mã sử ​​dụng f_lasti với PyCode_Addr2Line() nên sử dụng PyFrame_GetLineNumber() thay thế; nó có thể nhanh hơn.

    • f_lineno: sử dụng PyFrame_GetLineNumber()

    • f_locals: sử dụng PyFrame_GetLocals().

    • f_stackdepth: đã xóa.

    • f_state: không có API công khai (đổi tên thành f_frame.f_state).

    • f_trace: không có API công khai.

    • f_trace_lines: sử dụng PyObject_GetAttrString((PyObject*)frame, "f_trace_lines").

    • f_trace_opcodes: sử dụng PyObject_GetAttrString((PyObject*)frame, "f_trace_opcodes").

    • f_localsplus: không có API công khai (đổi tên thành f_frame.localsplus).

    • f_valuestack: đã xóa.

    Đối tượng khung Python hiện được tạo một cách lười biếng. Một tác dụng phụ là thành viên f_back không được truy cập trực tiếp vì giá trị của nó giờ đây cũng được tính toán một cách lười biếng. Thay vào đó, hàm PyFrame_GetBack() phải được gọi.

    Thay vào đó, các trình gỡ lỗi đã truy cập trực tiếp vào f_locals must hãy gọi PyFrame_GetLocals(). Họ không cần gọi PyFrame_FastToLocalsWithError() hay PyFrame_LocalsToFast() nữa, thực tế là họ không nên gọi những hàm đó. Việc cập nhật khung cần thiết hiện được quản lý bởi máy ảo.

    Mã xác định PyFrame_GetCode() trên Python 3.8 trở lên

    #if PY_VERSION_HEX < 0x030900B1
    nội tuyến tĩnh PyCodeObject* PyFrame_GetCode(PyFrameObject *frame)
    {
        Py_INCREF(khung->f_code);
        khung trả về->f_code;
    }
    #endif
    

    Mã xác định PyFrame_GetBack() trên Python 3.8 trở lên

    #if PY_VERSION_HEX < 0x030900B1
    nội tuyến tĩnh PyFrameObject* PyFrame_GetBack(PyFrameObject *frame)
    {
        Py_XINCREF(khung->f_back);
        khung trả về->f_back;
    }
    #endif
    

    Hoặc sử dụng pythoncapi_compat project để nhận hai hàm này trên các phiên bản Python cũ hơn.

  • Thay đổi của các thành viên cấu trúc PyThreadState:

    Mã xác định PyThreadState_GetFrame() trên Python 3.8 trở lên

    #if PY_VERSION_HEX < 0x030900B1
    nội tuyến tĩnh PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate)
    {
        Py_XINCREF(tstate->frame);
        trả về tstate->frame;
    }
    #endif
    

    Mã xác định PyThreadState_EnterTracing()PyThreadState_LeaveTracing() trên Python 3.10 trở lên

    #if PY_VERSION_HEX < 0x030B00A2
    khoảng trống nội tuyến tĩnh PyThreadState_EnterTracing(PyThreadState *tstate)
    {
        tstate->tracing++;
    #if PY_VERSION_HEX >= 0x030A00A1
        tstate->cframe->use_tracing = 0;
    #else
        tstate->use_tracing = 0;
    #endif
    }
    
    khoảng trống nội tuyến tĩnh PyThreadState_LeaveTracing(PyThreadState *tstate)
    {
        int use_tracing = (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL);
        tstate->truy tìm--;
    #if PY_VERSION_HEX >= 0x030A00A1
        tstate->cframe->use_tracing = use_tracing;
    #else
        tstate->use_tracing = use_tracing;
    #endif
    }
    #endif
    

    Hoặc sử dụng the pythoncapi-compat project để nhận các hàm này trên các hàm Python cũ.

  • Các nhà phân phối được khuyến khích xây dựng Python với thư viện Blake2 libb2 được tối ưu hóa.

  • Trường PyConfig.module_search_paths_set hiện phải được đặt thành 1 để khởi tạo để sử dụng PyConfig.module_search_paths khởi tạo sys.path. Nếu không, quá trình khởi tạo sẽ tính toán lại đường dẫn và thay thế mọi giá trị được thêm vào module_search_paths.

  • PyConfig_Read() không còn tính toán đường dẫn tìm kiếm ban đầu và sẽ không điền bất kỳ giá trị nào vào PyConfig.module_search_paths. Để tính toán các đường dẫn mặc định và sau đó sửa đổi chúng, hãy hoàn tất quá trình khởi tạo và sử dụng PySys_GetObject() để truy xuất sys.path dưới dạng đối tượng danh sách Python và sửa đổi trực tiếp.

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

  • Không dùng các hàm sau để định cấu hình khởi tạo Python:

    • PySys_AddWarnOptionUnicode()

    • PySys_AddWarnOption()

    • PySys_AddXOption()

    • PySys_HasWarnOptions()

    • PySys_SetArgvEx()

    • PySys_SetArgv()

    • PySys_SetPath()

    • Py_SetPath()

    • Py_SetProgramName()

    • Py_SetPythonHome()

    • Py_SetStandardStreamEncoding()

    • _Py_SetProgramFullPath()

    Thay vào đó hãy sử dụng PyConfig API mới của Python Initialization Configuration (PEP 587). (Được đóng góp bởi Victor Stinner trong gh-88279.)

  • Không dùng nữa thành viên ob_shash của PyBytesObject. Thay vào đó hãy sử dụng PyObject_Hash(). (Được đóng góp bởi Inada Naoki trong bpo-46864.)

Đang chờ xóa trong Python 3.12

Các API C sau đây không được dùng nữa trong các bản phát hành Python trước đó và sẽ bị xóa trong Python 3.12.

  • PyUnicode_AS_DATA()

  • PyUnicode_AS_UNICODE()

  • PyUnicode_AsUnicodeAndSize()

  • PyUnicode_AsUnicode()

  • PyUnicode_FromUnicode()

  • PyUnicode_GET_DATA_SIZE()

  • PyUnicode_GET_SIZE()

  • PyUnicode_GetSize()

  • PyUnicode_IS_COMPACT()

  • PyUnicode_IS_READY()

  • PyUnicode_READY()

  • PyUnicode_WSTR_LENGTH()

  • _PyUnicode_AsUnicode()

  • PyUnicode_WCHAR_KIND

  • PyUnicodeObject

  • PyUnicode_InternImmortal()

Đã xóa

  • PyFrame_BlockSetup()PyFrame_BlockPop() đã bị xóa. (Được đóng góp bởi Mark Shannon trong bpo-40222.)

  • Xóa các macro toán học sau bằng biến errno:

    • Py_ADJUST_ERANGE1()

    • Py_ADJUST_ERANGE2()

    • Py_OVERFLOWED()

    • Py_SET_ERANGE_IF_OVERFLOW()

    • Py_SET_ERRNO_ON_MATH_ERROR()

    (Được đóng góp bởi Victor Stinner trong bpo-45412.)

  • Xóa macro Py_UNICODE_COPY()Py_UNICODE_FILL(), không được dùng nữa kể từ Python 3.3. Thay vào đó, hãy sử dụng các hàm PyUnicode_CopyCharacters() hoặc memcpy() (chuỗi wchar_t*) và PyUnicode_Fill(). (Được đóng góp bởi Victor Stinner trong bpo-41123.)

  • Xóa tệp tiêu đề pystrhex.h. Nó chỉ chứa các chức năng riêng tư. Phần mở rộng C chỉ nên bao gồm tệp tiêu đề <Python.h> chính. (Được đóng góp bởi Victor Stinner trong bpo-45434.)

  • Xóa macro Py_FORCE_DOUBLE(). Nó được sử dụng bởi macro Py_IS_INFINITY(). (Được đóng góp bởi Victor Stinner trong bpo-45440.)

  • Các mục sau đây không còn khả dụng khi Py_LIMITED_API được xác định:

    Đây không phải là một phần của limited API.

    (Được đóng góp bởi Victor Stinner trong bpo-45474.)

  • Loại trừ PyWeakref_GET_OBJECT() khỏi C API giới hạn. Nó không bao giờ hoạt động vì cấu trúc PyWeakReference mờ đục trong C API giới hạn. (Được đóng góp bởi Victor Stinner trong bpo-35134.)

  • Xóa macro PyHeapType_GET_MEMBERS(). Nó đã bị lộ ra trong C API công khai do nhầm lẫn, nó chỉ được sử dụng bởi Python trong nội bộ. Thay vào đó hãy sử dụng thành viên PyTypeObject.tp_members. (Được đóng góp bởi Victor Stinner trong bpo-40170.)

  • Xóa macro HAVE_PY_SET_53BIT_PRECISION (đã chuyển sang C API bên trong). (Được đóng góp bởi Victor Stinner trong bpo-45412.)

  • Xóa API bộ mã hóa Py_UNICODE vì chúng không được dùng nữa kể từ Python 3.3, ít được sử dụng và không hiệu quả so với các lựa chọn thay thế được đề xuất.

    Các chức năng bị loại bỏ là:

    • PyUnicode_Encode()

    • PyUnicode_EncodeASCII()

    • PyUnicode_EncodeLatin1()

    • PyUnicode_EncodeUTF7()

    • PyUnicode_EncodeUTF8()

    • PyUnicode_EncodeUTF16()

    • PyUnicode_EncodeUTF32()

    • PyUnicode_EncodeUnicodeEscape()

    • PyUnicode_EncodeRawUnicodeEscape()

    • PyUnicode_EncodeCharmap()

    • PyUnicode_TranslateCharmap()

    • PyUnicode_EncodeDecimal()

    • PyUnicode_TransformDecimalToASCII()

    Xem PEP 624 để biết chi tiết và migration guidance. (Được đóng góp bởi Inada Naoki trong bpo-44029.)

Những thay đổi đáng chú ý trong 3.11.4

hồ dầu

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

Những thay đổi đáng chú ý trong 3.11.5

OpenSSL

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