Có gì mới trong Python 3.13

biên tập viên:

Adam Turner và Thomas Wouters

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

Xem thêm

PEP 719 -- Lịch phát hành Python 3.13

Tóm tắt -- Điểm nổi bật của bản phát hành

Python 3.13 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ữ, cách triển khai và thư viện chuẩn. Những thay đổi lớn nhất bao gồm interactive interpreter mới, hỗ trợ thử nghiệm để chạy trong free-threaded mode (PEP 703) và Just-In-Time compiler (PEP 744).

Thông báo lỗi tiếp tục được cải thiện, với dấu vết hiện được đánh dấu bằng màu theo mặc định. Nội dung locals() hiện có defined semantics để thay đổi ánh xạ trả về và các tham số loại hiện hỗ trợ các giá trị mặc định.

Các thay đổi về thư viện bao gồm việc loại bỏ các API và mô-đun không được dùng nữa, cũng như các cải tiến thông thường về tính chính xác và thân thiện với người dùng. Một số mô-đun thư viện tiêu chuẩn cũ hiện có been removed sau khi ngừng sử dụng trong Python 3.11 (PEP 594).

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 đủ, hãy tham khảo tài liệu, chẳng hạn như Library ReferenceLanguage Reference. Để hiểu cơ sở lý luận về 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 đủ. Xem Porting to Python 3.13 để được hướng dẫn nâng cấp từ các phiên bản Python trước đó.


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

  • Một interactive interpreterimproved error messages được cải tiến rất nhiều.

  • PEP 667: Nội trang locals() hiện có defined semantics khi thay đổi ánh xạ trả về. Trình gỡ lỗi Python và các công cụ tương tự giờ đây có thể cập nhật các biến cục bộ một cách đáng tin cậy hơn trong phạm vi được tối ưu hóa ngay cả khi thực thi mã đồng thời.

  • PEP 703: CPython 3.13 có hỗ trợ thử nghiệm để chạy khi global interpreter lock bị vô hiệu hóa. Xem Free-threaded CPython để biết thêm chi tiết.

  • PEP 744: Một JIT compiler cơ bản đã được thêm vào. Tính năng này hiện bị tắt theo mặc định (mặc dù chúng tôi có thể bật tính năng này sau). Những cải tiến về hiệu suất còn khiêm tốn -- chúng tôi hy vọng sẽ cải thiện điều này trong một số bản phát hành tiếp theo.

  • Hỗ trợ màu sắc trong interactive interpreter mới, cũng như trong đầu ra tracebacksdoctest. Điều này có thể bị vô hiệu hóa thông qua các biến môi trường PYTHON_COLORSNO_COLOR.

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

  • __static_attributes__ lưu trữ tên của các thuộc tính được truy cập thông qua self.X trong bất kỳ hàm nào trong nội dung lớp.

  • __firstlineno__ ghi lại số dòng đầu tiên của định nghĩa lớp.

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

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

C API cải tiến:

  • Khe Py_mod_gil hiện được sử dụng để chỉ ra rằng mô-đun mở rộng hỗ trợ chạy khi GIL bị tắt.

  • Zz000zz đã được thêm vào, cung cấp quyền truy cập vào đồng hồ hệ thống.

  • PyMutex là một mutex nhẹ mới chiếm một byte.

  • Có một suite of functions mới để tạo các sự kiện giám sát PEP 669 trong C API.

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

Hỗ trợ nền tảng:

Các thao tác xóa quan trọng:

  • PEP 594: 19 "pin chết" còn lại (mô-đun stdlib kế thừa) đã bị xóa khỏi thư viện tiêu chuẩn: aifc, audioop, cgi, cgitb, chunk, crypt, imghdr, mailcap, msilib, nis, nntplib, ossaudiodev, pipes, sndhdr, spwd, sunau, telnetlib, uuxdrlib.

  • Xóa công cụ 2to3 và mô-đun lib2to3 (không được dùng trong Python 3.11).

  • Xóa mô-đun tkinter.tix (không được dùng trong Python 3.6).

  • Loại bỏ chức năng locale.resetlocale().

  • Xóa không gian tên typing.iotyping.re.

  • Loại bỏ các bộ mô tả classmethod bị xâu chuỗi.

Thay đổi lịch phát hành:

PEP 602 ("Chu kỳ phát hành hàng năm cho Python") đã được cập nhật để kéo dài thời gian hỗ trợ đầy đủ ('sửa lỗi') cho các bản phát hành mới lên hai năm. Chính sách cập nhật này có nghĩa là:

  • Python 3.9--3.12 có một năm rưỡi hỗ trợ đầy đủ, sau đó là ba năm rưỡi sửa lỗi bảo mật.

  • Python 3.13 trở lên được hỗ trợ đầy đủ trong hai năm, sau đó là ba năm sửa lỗi bảo mật.

Tính năng mới

Trình thông dịch tương tác tốt hơn

Python hiện sử dụng shell interactive mới theo mặc định, dựa trên mã từ PyPy project. Khi người dùng khởi động REPL từ thiết bị đầu cuối tương tác, các tính năng mới sau đây hiện được hỗ trợ:

  • Chỉnh sửa nhiều dòng với bảo tồn lịch sử.

  • Hỗ trợ trực tiếp cho các lệnh dành riêng cho REPL như help, exitquit mà không cần gọi chúng là hàm.

  • Lời nhắc và truy nguyên với color enabled by default.

  • Duyệt trợ giúp tương tác bằng F1 với lịch sử lệnh riêng.

  • Duyệt lịch sử bằng F2 bỏ qua đầu ra cũng như lời nhắc >>>....

  • "Chế độ dán" với F3 giúp dán các khối mã lớn hơn dễ dàng hơn (nhấn F3 lần nữa để quay lại lời nhắc thông thường).

Để tắt shell tương tác mới, hãy đặt biến môi trường PYTHON_BASIC_REPL. Để biết thêm về chế độ tương tác, hãy xem Chế độ tương tác.

(Được đóng góp bởi Pablo Galindo Salgado, Łukasz Langa và Lysandros Nikolaou trong gh-111201 dựa trên mã từ dự án PyPy. Hỗ trợ Windows do Dino Viehland và Anthony Shaw đóng góp.)

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

  • Trình thông dịch hiện sử dụng màu theo mặc định khi hiển thị dấu vết trong thiết bị đầu cuối. Tính năng này can be controlled thông qua biến môi trường PYTHON_COLORS mới cũng như các biến môi trường NO_COLORFORCE_COLOR chuẩn. (Được đóng góp bởi Pablo Galindo Salgado trong gh-112730.)

  • Một lỗi phổ biến là viết tập lệnh có cùng tên với mô-đun thư viện tiêu chuẩn. Khi điều này dẫn đến lỗi, giờ đây chúng tôi sẽ hiển thị thông báo lỗi hữu ích hơn:

    $ python ngẫu nhiên
    Traceback (cuộc gọi gần đây nhất):
      Tệp "/home/me/random.py", dòng 1, trong <module>
        nhập khẩu ngẫu nhiên
      Tệp "/home/me/random.py", dòng 3, trong <module>
        print(random.randint(5))
              ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^
    AttributionError: mô-đun 'ngẫu nhiên' không có thuộc tính 'randint' (xem xét đổi tên '/home/me/random.py' vì nó có cùng tên với mô-đun thư viện tiêu chuẩn có tên 'ngẫu nhiên' và ngăn nhập mô-đun thư viện tiêu chuẩn đó)
    

    Tương tự, nếu tập lệnh có cùng tên với mô-đun bên thứ ba mà nó cố gắng nhập và điều này dẫn đến lỗi, chúng tôi cũng hiển thị thông báo lỗi hữu ích hơn:

    $ trăn numpy.py
    Traceback (cuộc gọi gần đây nhất):
      Tệp "/home/me/numpy.py", dòng 1, trong <module>
        nhập numpy dưới dạng np
      Tệp "/home/me/numpy.py", dòng 3, trong <module>
        np.array([1, 2, 3])
        ^^ ^^ ^^ ^^
    AttributionError: mô-đun 'numpy' không có thuộc tính 'mảng' (hãy cân nhắc đổi tên '/home/me/numpy.py' nếu nó có cùng tên với thư viện bạn định nhập)
    

    (Được đóng góp bởi Shantanu Jain trong gh-95754.)

  • Thông báo lỗi hiện cố gắng đề xuất đối số từ khóa chính xác khi đối số từ khóa không chính xác được chuyển đến một hàm.

    >>> "Thông báo lỗi tốt hơn!".split(max_split=1)
    Traceback (cuộc gọi gần đây nhất):
      Tệp "<python-input-0>", dòng 1, trong <module>
        "Thông báo lỗi tốt hơn!".split(max_split=1)
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^^ ^^ ^^ ^^ ^^ ^^
    TypeError: Split() nhận được đối số từ khóa không mong muốn 'max_split'. Ý bạn là 'maxsplit'?
    

    (Được đóng góp bởi Pablo Galindo Salgado và Shantanu Jain trong gh-107944.)

CPython có luồng miễn phí

CPython hiện có hỗ trợ thử nghiệm để chạy ở chế độ luồng tự do, với global interpreter lock (GIL) bị tắt. Đây là tính năng thử nghiệm và do đó không được bật theo mặc định. Chế độ luồng tự do yêu cầu một tệp thực thi khác, thường được gọi là python3.13t hoặc python3.13t.exe. Các tệp nhị phân dựng sẵn được đánh dấu là free-threaded có thể được cài đặt như một phần của trình cài đặt WindowsmacOS chính thức hoặc CPython có thể được tạo từ nguồn với tùy chọn --disable-gil.

Thực thi luồng tự do cho phép tận dụng tối đa sức mạnh xử lý sẵn có bằng cách chạy các luồng song song trên các lõi CPU có sẵn. Mặc dù không phải tất cả phần mềm đều tự động được hưởng lợi từ điều này, nhưng các chương trình được thiết kế theo luồng sẽ chạy nhanh hơn trên phần cứng đa lõi. The free-threaded mode is experimental và công việc đang được tiến hành để cải thiện nó: dự kiến ​​sẽ có một số lỗi và ảnh hưởng đáng kể đến hiệu suất đơn luồng. Các bản dựng CPython luồng tự do hỗ trợ tùy chọn chạy với GIL được bật trong thời gian chạy bằng cách sử dụng biến môi trường PYTHON_GIL hoặc tùy chọn dòng lệnh -X gil=1.

Để kiểm tra xem trình thông dịch hiện tại có hỗ trợ phân luồng tự do hay không, python -VVsys.version chứa "bản dựng phân luồng tự do thử nghiệm". Chức năng sys._is_gil_enabled() mới có thể được sử dụng để kiểm tra xem GIL có thực sự bị vô hiệu hóa trong quá trình chạy hay không.

Các mô-đun mở rộng C-API cần được xây dựng riêng cho bản dựng luồng tự do. Các tiện ích mở rộng hỗ trợ chạy khi GIL bị vô hiệu hóa nên sử dụng khe cắm Py_mod_gil. Các tiện ích mở rộng sử dụng init một pha nên sử dụng PyUnstable_Module_SetGIL() để cho biết liệu chúng có hỗ trợ chạy khi GIL bị tắt hay không. Việc nhập tiện ích mở rộng C không sử dụng các cơ chế này sẽ khiến GIL được bật, trừ khi GIL bị vô hiệu hóa rõ ràng bằng biến môi trường PYTHON_GIL hoặc tùy chọn -X gil=0. Cần có pip 24.1 hoặc mới hơn để cài đặt các gói có phần mở rộng C trong bản dựng luồng miễn phí.

Công việc này được thực hiện nhờ vào nhiều cá nhân và tổ chức, bao gồm cả cộng đồng lớn những người đóng góp cho Python và các dự án của bên thứ ba để thử nghiệm và kích hoạt hỗ trợ phân luồng tự do. Những người đóng góp đáng chú ý bao gồm: Sam Gross, Ken Jin, Donghee Na, Itamar Oren, Matt Page, Brett Simmers, Dino Viehland, Carl Meyer, Nathan Goldbaum, Ralf Gommers, Lysandros Nikolaou và nhiều người khác. Nhiều người trong số những người đóng góp này được Meta tuyển dụng, nơi đã cung cấp các nguồn lực kỹ thuật quan trọng để hỗ trợ dự án này.

Xem thêm

PEP 703 "Tạo tùy chọn khóa phiên dịch toàn cầu trong CPython" chứa cơ sở lý luận và thông tin xung quanh công việc này.

Porting Extension Modules to Support Free-Threading: Hướng dẫn chuyển do cộng đồng duy trì dành cho các tác giả tiện ích mở rộng.

Trình biên dịch đúng lúc (JIT) thử nghiệm

Khi CPython được định cấu hình và xây dựng bằng tùy chọn --enable-experimental-jit, trình biên dịch đúng lúc (JIT) sẽ được thêm vào để có thể tăng tốc một số chương trình Python. Trên Windows, sử dụng PCbuild/build.bat --experimental-jit để bật JIT hoặc --experimental-jit-interpreter để bật trình thông dịch Cấp 2. Xây dựng yêu cầu và thông tin hỗ trợ thêm are contained at Tools/jit/README.md.

Tùy chọn --enable-experimental-jit nhận các giá trị (tùy chọn) này, mặc định là yes nếu --enable-experimental-jit hiện diện mà không có giá trị tùy chọn.

  • no: Vô hiệu hóa toàn bộ đường dẫn Cấp 2 và JIT.

  • yes: Kích hoạt JIT. Để tắt JIT khi chạy, hãy chuyển biến môi trường PYTHON_JIT=0.

  • yes-off: Tạo JIT nhưng tắt nó theo mặc định. Để bật JIT khi chạy, hãy chuyển biến môi trường PYTHON_JIT=1.

  • interpreter: Bật trình thông dịch Cấp 2 nhưng tắt JIT. Trình thông dịch có thể bị tắt bằng cách chạy với PYTHON_JIT=0.

Kiến trúc bên trong đại khái như sau:

  • Chúng tôi bắt đầu với Tier 1 bytecode chuyên dụng. Xem What's new in 3.11 để biết chi tiết.

  • Khi mã byte Cấp 1 đủ nóng, nó sẽ được dịch sang một biểu diễn trung gian thuần túy bên trong (IR) mới, được gọi là Tier 2 IR và đôi khi được gọi là micro-ops ("uops").

  • IR Cấp 2 sử dụng cùng một máy ảo dựa trên ngăn xếp như Cấp 1, nhưng định dạng lệnh phù hợp hơn để dịch sang mã máy.

  • Chúng tôi có một số thẻ tối ưu hóa cho IR Cấp 2, được áp dụng trước khi nó được diễn giải hoặc dịch sang mã máy.

  • Có trình thông dịch Cấp 2 nhưng chủ yếu nhằm mục đích gỡ lỗi các giai đoạn trước của quy trình tối ưu hóa. Trình thông dịch Cấp 2 có thể được bật bằng cách định cấu hình Python với --enable-experimental-jit=interpreter.

  • Khi JIT được bật, IR Cấp 2 được tối ưu hóa sẽ được dịch sang mã máy, sau đó được thực thi.

  • Quá trình dịch mã máy sử dụng kỹ thuật gọi là copy-and-patch. Nó không có phần phụ thuộc thời gian chạy, nhưng có phần phụ thuộc thời gian xây dựng mới trên LLVM.

Xem thêm

PEP 744

(JIT của Brandt Bucher, lấy cảm hứng từ bài báo của Haoran Xu và Fredrik Kjolstad. IR cấp 2 của Mark Shannon và Guido van Rossum. Trình tối ưu hóa cấp 2 của Ken Jin.)

Ngữ nghĩa đột biến được xác định cho locals()

Về mặt lịch sử, kết quả mong đợi của việc thay đổi giá trị trả về của locals() đã được giao cho việc triển khai Python riêng lẻ xác định. Bắt đầu từ Python 3.13, PEP 667 chuẩn hóa hành vi lịch sử của CPython cho hầu hết các phạm vi thực thi mã, nhưng thay đổi optimized scopes (hàm, trình tạo, coroutine, hiểu và biểu thức trình tạo) để trả về rõ ràng các ảnh chụp nhanh độc lập của các biến cục bộ hiện được chỉ định, bao gồm các biến không cục bộ được tham chiếu cục bộ được ghi lại trong các phần đóng.

Sự thay đổi này đối với ngữ nghĩa của locals() trong phạm vi được tối ưu hóa cũng ảnh hưởng đến hành vi mặc định của các hàm thực thi mã nhắm mục tiêu ngầm đến locals() nếu không cung cấp không gian tên rõ ràng (chẳng hạn như exec()eval()). Trong các phiên bản trước, việc có thể truy cập các thay đổi hay không bằng cách gọi locals() sau khi gọi hàm thực thi mã phụ thuộc vào việc triển khai. Cụ thể là trong CPython, mã như vậy thường hoạt động như mong muốn, nhưng đôi khi có thể không hoạt động trong phạm vi được tối ưu hóa dựa trên mã khác (bao gồm trình gỡ lỗi và công cụ theo dõi thực thi mã) có khả năng đặt lại ảnh chụp nhanh được chia sẻ trong phạm vi đó. Giờ đây, mã sẽ luôn chạy dựa trên ảnh chụp nhanh độc lập của các biến cục bộ trong phạm vi được tối ưu hóa và do đó các thay đổi sẽ không bao giờ hiển thị trong các lệnh gọi tiếp theo tới locals(). Để truy cập những thay đổi được thực hiện trong những trường hợp này, bây giờ một tham chiếu không gian tên rõ ràng phải được chuyển đến hàm liên quan. Ngoài ra, có thể hợp lý khi cập nhật mã bị ảnh hưởng để sử dụng cách thực thi mã cấp cao hơn API để trả về không gian tên thực thi mã kết quả (ví dụ: runpy.run_path() khi thực thi các tệp Python từ đĩa).

Để đảm bảo các trình gỡ lỗi và các công cụ tương tự có thể cập nhật các biến cục bộ một cách đáng tin cậy trong các phạm vi bị ảnh hưởng bởi thay đổi này, FrameType.f_locals hiện trả về một proxy ghi cho các biến không cục bộ được tham chiếu cục bộ và cục bộ của khung trong các phạm vi này, thay vì trả về một phiên bản dict được chia sẻ được cập nhật không nhất quán với ngữ nghĩa thời gian chạy không xác định.

Xem PEP 667 để biết thêm chi tiết, bao gồm các thay đổi và ngừng sử dụng C API có liên quan. Ghi chú chuyển đổi cũng được cung cấp bên dưới cho Python APIsC APIs bị ảnh hưởng.

(PEP và cách triển khai do Mark Shannon và Tian Gao đóng góp trong gh-74929. Cập nhật tài liệu do Guido van Rossum và Alyssa Coghlan cung cấp.)

Hỗ trợ cho nền tảng di động

PEP 730: iOS hiện là nền tảng được hỗ trợ PEP 11, với mục tiêu arm64-apple-iosarm64-apple-ios-simulator ở cấp 3 (các thiết bị iPhone và iPad được phát hành sau năm 2013 và trình giả lập Xcode iOS lần lượt chạy trên phần cứng silicon của Apple). x86_64-apple-ios-simulator (trình mô phỏng iOS Xcode chạy trên phần cứng x86_64 cũ hơn) không phải là nền tảng được hỗ trợ cấp 3 nhưng sẽ có hỗ trợ nỗ lực tốt nhất. (PEP được viết và triển khai bởi Russell Keith-Magee trong gh-114099.)

PEP 738: Android hiện là nền tảng được hỗ trợ PEP 11, với các mục tiêu aarch64-linux-androidx86_64-linux-android ở cấp 3. Các mục tiêu 32-bit arm-linux-androideabii686-linux-android không phải là nền tảng được hỗ trợ cấp 3 nhưng sẽ có hỗ trợ nỗ lực tốt nhất. (PEP được viết và triển khai bởi Malcolm Smith trong gh-116622.)

Xem thêm

PEP 730, PEP 738

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

  • Trình biên dịch hiện loại bỏ khoảng trắng hàng đầu phổ biến khỏi mọi dòng trong chuỗi tài liệu. Điều này làm giảm kích thước của bytecode cache (chẳng hạn như tệp .pyc), với mức giảm kích thước tệp khoảng 5%, ví dụ như trong sqlalchemy.orm.session từ SQLAlchemy 2.0. Thay đổi này ảnh hưởng đến các công cụ sử dụng chuỗi tài liệu, chẳng hạn như doctest.

    >>> chống thư rác():
    ... """
    ... Đây là một chuỗi tài liệu với
    ... khoảng trắng hàng đầu.
    ...
    ... Nó thậm chí còn có nhiều đoạn văn!
    ... """
    ...
    >>> thư rác.__doc__
    '\nĐây là một chuỗi tài liệu có\n khoảng trắng ở đầu.\n\nNó thậm chí còn có nhiều đoạn văn!\n'
    

    (Được đóng góp bởi Inada Naoki trong gh-81283.)

  • Annotation scopes trong phạm vi lớp hiện có thể chứa lambda và phần hiểu. Những hiểu biết nằm trong phạm vi lớp không được đưa vào phạm vi chính của chúng.

    lớp C[T]:
          danh = lambda: T
    

    (Được đóng góp bởi Jelle Zijlstra trong gh-109118gh-118160.)

  • Future statements không còn được kích hoạt bởi quá trình nhập tương đối của mô-đun __future__, nghĩa là các câu lệnh có dạng from .__future__ import ... giờ đây chỉ đơn giản là nhập tương đối tiêu chuẩn, không có tính năng đặc biệt nào được kích hoạt. (Được đóng góp bởi Jeremiah Gabriel Pascual trong gh-118216.)

  • Khai báo global hiện được phép trong khối except khi toàn cục đó được sử dụng trong khối else. Trước đây điều này đã gây ra lỗi SyntaxError. (Được đóng góp bởi Irit Katriel trong gh-111123.)

  • Thêm PYTHON_FROZEN_MODULES, một biến môi trường mới xác định xem các mô-đun cố định có bị máy nhập bỏ qua hay không, tương đương với tùy chọn dòng lệnh -X frozen_modules. (Được đóng góp bởi Yilei Yang trong gh-111374.)

  • Thêm support for the perf profiler hoạt động mà không cần frame pointers thông qua biến môi trường mới PYTHON_PERF_JIT_SUPPORT và tùy chọn dòng lệnh -X perf_jit. (Được đóng góp bởi Pablo Galindo trong gh-118518.)

  • Vị trí của tệp .python_history có thể được thay đổi thông qua biến môi trường PYTHON_HISTORY mới. (Được đóng góp bởi Levi Sabah, Zuckery Spytz và Hugo van Kemenade trong gh-73965.)

  • Các lớp có thuộc tính __static_attributes__ mới. Điều này được trình biên dịch điền vào một bộ tên thuộc tính của lớp được gán thông qua self.<name> từ bất kỳ hàm nào trong phần thân của nó. (Được đóng góp bởi Irit Katriel trong gh-115775.)

  • Trình biên dịch bây giờ tạo thuộc tính __firstlineno__ trên các lớp với số dòng của dòng đầu tiên của định nghĩa lớp. (Được đóng góp bởi Serhiy Storchaka trong gh-118465.)

  • Nội trang exec()eval() hiện chấp nhận các đối số globalslocals làm từ khóa. (Được đóng góp bởi Raphael Gaschignard trong gh-105879)

  • Nội trang compile() hiện chấp nhận một cờ mới, ast.PyCF_OPTIMIZED_AST, tương tự như ast.PyCF_ONLY_AST ngoại trừ việc AST trả về được tối ưu hóa theo giá trị của đối số optimize. (Được đóng góp bởi Irit Katriel trong gh-108113).

  • Thêm thuộc tính __name__ trên đối tượng property. (Được đóng góp bởi Eugene Toder trong gh-101860.)

  • Thêm PythonFinalizationError, một ngoại lệ mới bắt nguồn từ RuntimeError và được sử dụng để báo hiệu khi các hoạt động bị chặn trong finalization. Các lệnh gọi sau đây hiện tăng PythonFinalizationError, thay vì RuntimeError:

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

  • Cho phép đối số count của str.replace() làm từ khóa. (Được đóng góp bởi Hugo van Kemenade trong gh-106487.)

  • Hiện tại, nhiều hàm phát ra cảnh báo nếu một giá trị boolean được truyền dưới dạng đối số mô tả tệp. Điều này có thể giúp phát hiện một số lỗi sớm hơn. (Được đóng góp bởi Serhiy Storchaka trong gh-82626.)

  • Đã thêm thuộc tính namemode cho các đối tượng giống như tệp được nén và lưu trữ trong các mô-đun bz2, lzma, tarfilezipfile. (Được đóng góp bởi Serhiy Storchaka trong gh-115961.)

Mô-đun mới

  • dbm.sqlite3: Phần phụ trợ SQLite cho dbm. (Được đóng góp bởi Raymond Hettinger và Erlend E. Aasland trong gh-100414.)

Mô-đun cải tiến

phân tích cú pháp

  • Thêm tham số deprecated vào các phương thức add_argument()add_parser() để bật các tùy chọn dòng lệnh, đối số vị trí và lệnh phụ không được dùng nữa. (Được đóng góp bởi Serhiy Storchaka trong gh-83648.)

mảng

  • Thêm mã loại 'w' (Py_UCS4) cho các ký tự Unicode. Nó nên được sử dụng thay vì mã loại 'u' không được dùng nữa. (Được đóng góp bởi Inada Naoki trong gh-80480.)

  • Đăng ký array.array làm MutableSequence bằng cách triển khai phương thức clear(). (Được đóng góp bởi Mike Zimin trong gh-114894.)

ast

  • Hàm tạo của các loại nút trong mô-đun ast giờ đây chặt chẽ hơn trong các đối số mà chúng chấp nhận, với hành vi trực quan hơn khi bỏ qua các đối số.

    Nếu trường tùy chọn trên nút AST không được đưa vào làm đối số khi xây dựng một phiên bản, thì trường đó bây giờ sẽ được đặt thành None. Tương tự, nếu một trường danh sách bị bỏ qua, trường đó giờ đây sẽ được đặt thành danh sách trống và nếu trường expr_context bị bỏ qua, trường đó sẽ mặc định là Load(). (Trước đây, trong mọi trường hợp, thuộc tính sẽ bị thiếu trên phiên bản nút AST mới được xây dựng.)

    Trong tất cả các trường hợp khác, khi một đối số bắt buộc bị bỏ qua, hàm tạo nút sẽ phát ra DeprecationWarning. Điều này sẽ đưa ra một ngoại lệ trong Python 3.15. Tương tự, việc chuyển đối số từ khóa tới hàm tạo không ánh xạ tới trường trên nút AST hiện không được dùng nữa và sẽ đưa ra một ngoại lệ trong Python 3.15.

    Những thay đổi này không áp dụng cho các lớp con do người dùng định nghĩa của ast.AST trừ khi lớp đó chọn tham gia hành vi mới bằng cách xác định ánh xạ AST._field_types.

    (Được đóng góp bởi Jelle Zijlstra trong gh-105858, gh-117486gh-118851.)

  • ast.parse() hiện chấp nhận một đối số tùy chọn optimize được chuyển cho compile(). Điều này giúp có thể đạt được AST được tối ưu hóa. (Được đóng góp bởi Irit Katriel trong gh-108113.)

asyncio

  • asyncio.as_completed() hiện trả về một đối tượng vừa là asynchronous iterator vừa là iterator đơn giản của awaitables. Các sản phẩm có thể chờ đợi do quá trình lặp lại không đồng bộ mang lại bao gồm nhiệm vụ ban đầu hoặc các đối tượng trong tương lai đã được chuyển vào, giúp dễ dàng liên kết kết quả với các nhiệm vụ đang được hoàn thành. (Được đóng góp bởi Justin Arthur trong gh-77714.)

  • asyncio.loop.create_unix_server() bây giờ sẽ tự động xóa ổ cắm Unix khi máy chủ đóng. (Được đóng góp bởi Pierre Ossman trong gh-111246.)

  • DatagramTransport.sendto() bây giờ sẽ gửi các gói dữ liệu có độ dài bằng 0 nếu được gọi với đối tượng byte trống. Kiểm soát luồng truyền tải bây giờ cũng tính đến tiêu đề datagram khi tính toán kích thước bộ đệm. (Được đóng góp bởi Jamie Phan trong gh-115199.)

  • Thêm Queue.shutdownQueueShutDown để quản lý việc chấm dứt hàng đợi. (Được đóng góp bởi Laurie Opperman và Yves Duprat trong gh-104228.)

  • Thêm các phương thức Server.close_clients()Server.abort_clients() để đóng máy chủ asyncio một cách mạnh mẽ hơn. (Được đóng góp bởi Pierre Ossman trong gh-113538.)

  • Chấp nhận một bộ dấu phân cách trong StreamReader.readuntil(), dừng lại khi gặp bất kỳ dấu phân cách nào trong số chúng. (Được đóng góp bởi Bruce Merry trong gh-81322.)

  • Cải thiện hoạt động của TaskGroup khi quá trình hủy bên ngoài va chạm với quá trình hủy bên trong. Ví dụ: khi hai nhóm nhiệm vụ được lồng nhau và cả hai đều gặp phải một ngoại lệ trong một nhiệm vụ con cùng một lúc, có thể nhóm nhiệm vụ bên ngoài sẽ bị treo do tính năng hủy bên trong của nó đã bị nhóm nhiệm vụ bên trong nuốt chửng.

    Trong trường hợp một nhóm nhiệm vụ bị hủy bên ngoài và cũng phải đưa ra ExceptionGroup, giờ đây nó sẽ gọi phương thức cancel() của nhiệm vụ mẹ. Điều này đảm bảo rằng CancelledError sẽ được nâng lên ở await tiếp theo, do đó việc hủy không bị mất.

    Lợi ích bổ sung của những thay đổi này là các nhóm nhiệm vụ hiện giữ nguyên số lần hủy (cancelling()).

    Để xử lý một số trường hợp góc, uncancel() hiện có thể đặt lại cờ _must_cancel không có giấy tờ khi số lần hủy đạt đến 0.

    (Lấy cảm hứng từ một vấn đề được báo cáo bởi Arthur Tacca trên gh-116720.)

  • Khi TaskGroup.create_task() được gọi trên một TaskGroup không hoạt động, coroutine đã cho sẽ bị đóng (điều này ngăn không cho RuntimeWarning về coroutine đã cho không bao giờ được chờ đợi). (Được đóng góp bởi Arthur Tacca và Jason Zhang trong gh-115957.)

  • Hàm và phương thức có tên create_task đã nhận được một đối số **kwargs mới được chuyển tới hàm tạo tác vụ. Thay đổi này vô tình được thêm vào trong 3.13.3 và phá vỡ hợp đồng API dành cho các nhà máy nhiệm vụ tùy chỉnh. Một số nhà máy nhiệm vụ của bên thứ ba đã triển khai giải pháp cho việc này. Trong phiên bản 3.13.4 trở về sau, hợp đồng nhà máy cũ được vinh danh một lần nữa (cho đến phiên bản 3.14). Để duy trì các giải pháp thay thế, đối số **kwargs bổ sung vẫn cho phép chuyển các đối số từ khóa bổ sung tới Task và tới các nhà máy tác vụ tùy chỉnh.

    Điều này ảnh hưởng đến chức năng và phương thức sau: asyncio.create_task(), asyncio.loop.create_task(), asyncio.TaskGroup.create_task(). (Được đóng góp bởi Thomas Grainger trong gh-128307.)

cơ sở64

biên soạn tất cả

đồng thời.futures

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

  • ConfigParser hiện đã hỗ trợ các phần chưa được đặt tên, cho phép tạo các cặp khóa-giá trị cấp cao nhất. Điều này có thể được kích hoạt bằng tham số allow_unnamed_section mới. (Được đóng góp bởi Pedro Sousa Lacerda trong gh-66449.)

sao chép

ctypes

  • Do quá trình tái cấu trúc nội bộ cần thiết, việc khởi tạo siêu dữ liệu nội bộ hiện diễn ra trong __init__ thay vì trong __new__. Điều này ảnh hưởng đến các dự án phân lớp các siêu dữ liệu nội bộ này để cung cấp khả năng khởi tạo tùy chỉnh. Nói chung:

    • Logic tùy chỉnh được thực hiện trong __new__ sau khi gọi super().__new__ sẽ được chuyển sang __init__.

    • Để tạo một lớp, hãy gọi siêu dữ liệu, không chỉ phương thức __new__ của siêu dữ liệu.

    Xem gh-124520 để thảo luận và liên kết đến những thay đổi trong một số dự án bị ảnh hưởng.

  • Các đối tượng ctypes.Structure có thuộc tính _align_ mới cho phép căn chỉnh cấu trúc được đóng gói đến/từ bộ nhớ được chỉ định rõ ràng. (Được đóng góp bởi Matt Sanderson trong gh-112433)

dbm

  • Thêm dbm.sqlite3, một mô-đun mới triển khai phần phụ trợ SQLite và đặt nó làm phần phụ trợ dbm mặc định. (Được đóng góp bởi Raymond Hettinger và Erlend E. Aasland trong gh-100414.)

  • Cho phép xóa tất cả các mục khỏi cơ sở dữ liệu thông qua các phương thức clear() mới của đối tượng cơ sở dữ liệu GDBM và NDBM. (Được đóng góp bởi Donghee Na trong gh-107122.)

dis

  • Thay đổi đầu ra của các chức năng mô-đun dis để hiển thị nhãn logic cho mục tiêu nhảy và trình xử lý ngoại lệ, thay vì hiệu số. Các giá trị bù có thể được thêm bằng tùy chọn dòng lệnh -O mới hoặc đối số show_offsets. (Được đóng góp bởi Irit Katriel trong gh-112137.)

  • get_instructions() không còn thể hiện các mục trong bộ đệm dưới dạng hướng dẫn riêng biệt nữa. Thay vào đó, nó trả về chúng như một phần của Instruction, trong trường cache_info mới. Đối số show_caches cho get_instructions() không được dùng nữa và không còn hiệu lực nữa. (Được đóng góp bởi Irit Katriel trong gh-112962.)

doc nhất

email

  • Các tiêu đề có dòng mới được nhúng hiện được trích dẫn trên đầu ra. Giờ đây, generator sẽ từ chối tuần tự hóa (ghi) các tiêu đề được gấp hoặc phân cách không đúng cách, do đó chúng sẽ được phân tích cú pháp thành nhiều tiêu đề hoặc nối với dữ liệu liền kề. Nếu bạn cần tắt tính năng an toàn này thì hãy đặt verify_generated_headers. (Được đóng góp bởi Bas Bloemsaat và Petr Viktorin trong gh-121650.)

  • getaddresses()parseaddr() hiện trả về các cặp ('', '') trong nhiều trường hợp gặp phải địa chỉ email không hợp lệ thay vì các giá trị có thể không chính xác. Hai hàm này có tham số strict tùy chọn mới (True mặc định). Để có hành vi cũ (chấp nhận đầu vào không đúng định dạng), hãy sử dụng strict=False. getattr(email.utils, 'supports_strict_parsing', False) có thể được sử dụng để kiểm tra xem tham số strict có sẵn không. (Được đóng góp bởi Thomas Dwyer và Victor Stinner cho gh-102988 để cải thiện bản sửa lỗi CVE 2023-27043.)

liệt kê

  • EnumDict đã được công khai để hỗ trợ tốt hơn cho việc phân lớp EnumType.

phân số

  • Các đối tượng Fraction hiện hỗ trợ các quy tắc format specification mini-language tiêu chuẩn để điền, căn chỉnh, xử lý ký hiệu, chiều rộng tối thiểu và nhóm. (Được đóng góp bởi Mark Dickinson trong gh-111320.)

quả địa cầu

  • Thêm translate(), một hàm để chuyển đổi đặc tả đường dẫn có ký tự đại diện kiểu shell thành biểu thức chính quy. (Được đóng góp bởi Barney Gale trong gh-72904.)

nhập khẩu

  • Các hàm sau trong importlib.resources hiện cho phép truy cập vào một thư mục (hoặc cây) tài nguyên, sử dụng nhiều đối số vị trí (các đối số encodingerrors trong các hàm đọc văn bản hiện chỉ có từ khóa):

    Các chức năng này không còn được dùng nữa và không được lên lịch để xóa. (Được đóng góp bởi Petr Viktorin trong gh-116608.)

  • contents() vẫn không được dùng nữa để thay thế bằng Traversable API đầy đủ tính năng. Tuy nhiên hiện tại chưa có kế hoạch loại bỏ nó. (Được đóng góp bởi Petr Viktorin trong gh-116608.)

io

váy ipad

itertools

  • batched() có tham số strict mới, tham số này sẽ tăng ValueError nếu lô cuối cùng ngắn hơn kích thước lô được chỉ định. (Được đóng góp bởi Raymond Hettinger trong gh-113202.)

nguyên soái

  • Thêm tham số allow_code trong chức năng mô-đun. Việc chuyển allow_code=False sẽ ngăn việc tuần tự hóa và hủy tuần tự hóa các đối tượng mã không tương thích giữa các phiên bản Python. (Được đóng góp bởi Serhiy Storchaka trong gh-113626.)

môn toán

  • Hàm mới fma() thực hiện các thao tác cộng nhân hợp nhất. Điều này tính toán x * y + z chỉ với một vòng duy nhất và do đó tránh được bất kỳ sự mất độ chính xác trung gian nào. Nó bao bọc hàm fma() do C99 cung cấp và tuân theo thông số kỹ thuật của thao tác IEEE 754 "fusedMultiplyAdd" cho các trường hợp đặc biệt. (Được đóng góp bởi Mark Dickinson và Victor Stinner trong gh-73468.)

kiểu bắt chước

mmap

  • mmap hiện được bảo vệ khỏi sự cố trên Windows khi không thể truy cập được bộ nhớ được ánh xạ do lỗi hệ thống tệp hoặc vi phạm quyền truy cập. (Được đóng góp bởi Jannis Weigend trong gh-118209.)

  • mmap có một phương thức seekable() mới có thể được sử dụng khi cần một đối tượng giống như tệp có thể tìm kiếm được. Phương thức seek() hiện trả về vị trí tuyệt đối mới. (Được đóng góp bởi Donghee Na và Sylvie Liberman trong gh-111835.)

  • Tham số trackfd chỉ dành cho UNIX mới dành cho mmap kiểm soát việc sao chép bộ mô tả tệp; nếu sai, bộ mô tả tệp được chỉ định bởi fileno sẽ không bị trùng lặp. (Được đóng góp bởi Zackery Spytz và Petr Viktorin trong gh-78502.)

đa xử lý

hệ điều hành

os.path

  • Thêm isreserved() để kiểm tra xem đường dẫn có được bảo lưu trên hệ thống hiện tại hay không. Chức năng này chỉ có trên Windows. (Được đóng góp bởi Barney Gale trong gh-88569.)

  • Trên Windows, isabs() không còn coi các đường dẫn bắt đầu bằng chính xác một dấu gạch chéo (\ hoặc /) là tuyệt đối. (Được đóng góp bởi Barney Gale và Jon Foster trong gh-44626.)

  • realpath() hiện giải quyết tên tệp kiểu MS-DOS ngay cả khi không thể truy cập được tệp. (Được đóng góp bởi Moonsik Park trong gh-82367.)

đường dẫn

  • Thêm UnsupportedOperation, được nâng lên thay vì NotImplementedError khi thao tác đường dẫn không được hỗ trợ. (Được đóng góp bởi Barney Gale trong gh-89812.)

  • Thêm một hàm tạo mới để tạo các đối tượng Path từ URI 'tệp' (file:///), Path.from_uri(). (Được đóng góp bởi Barney Gale trong gh-107465.)

  • Thêm PurePath.full_match() để khớp đường dẫn với các ký tự đại diện kiểu shell, bao gồm cả ký tự đại diện đệ quy "**". (Được đóng góp bởi Barney Gale trong gh-73435.)

  • Thêm thuộc tính lớp PurePath.parser để lưu trữ việc triển khai os.path được sử dụng để phân tích và nối đường dẫn cấp thấp. Đây sẽ là posixpath hoặc ntpath.

  • Thêm đối số chỉ từ khóa recurse_symlinks vào Path.glob()rglob(). (Được đóng góp bởi Barney Gale trong gh-77609.)

  • Path.glob()rglob() hiện trả về các tệp và thư mục khi được cung cấp mẫu kết thúc bằng "**". Trước đây, chỉ có các thư mục được trả về. (Được đóng góp bởi Barney Gale trong gh-70303.)

  • Thêm đối số chỉ từ khóa follow_symlinks vào Path.is_file, Path.is_dir, Path.owner()Path.group(). (Được đóng góp bởi Barney Gale trong gh-105793 và Kamil Turek trong gh-107962.)

pdb

  • breakpoint()set_trace() bây giờ vào trình gỡ lỗi ngay lập tức thay vì vào dòng mã tiếp theo sẽ được thực thi. Thay đổi này ngăn trình gỡ lỗi thoát ra ngoài ngữ cảnh khi breakpoint() được đặt ở cuối ngữ cảnh. (Được đóng góp bởi Tian Gao trong gh-118579.)

  • sys.path[0] không còn được thay thế bằng thư mục của tập lệnh đang được gỡ lỗi khi sys.flags.safe_path được đặt. (Được đóng góp bởi Tian Gao và Christian Walther trong gh-111762.)

  • zipapp hiện được hỗ trợ làm mục tiêu gỡ lỗi. (Được đóng góp bởi Tian Gao trong gh-118501.)

  • Thêm khả năng di chuyển giữa các ngoại lệ được xâu chuỗi trong quá trình gỡ lỗi sau khi khám phá trong pm() bằng lệnh exceptions [exc_number] mới cho Pdb. (Được đóng góp bởi Matthias Bussonnier trong gh-106676.)

  • Các biểu thức và câu lệnh có tiền tố là lệnh pdb hiện được xác định và thực thi chính xác. (Được đóng góp bởi Tian Gao trong gh-108464.)

xếp hàng

  • Thêm Queue.shutdownShutDown để quản lý việc chấm dứt hàng đợi. (Được đóng góp bởi Laurie Opperman và Yves Duprat trong gh-104750.)

ngẫu nhiên

lại

  • Đổi tên re.error thành PatternError để cải thiện độ rõ nét. re.error được giữ lại để tương thích ngược.

im lặng

  • Hỗ trợ các đối số từ khóa dir_fdfollow_symlinks trong chown(). (Được đóng góp bởi Berker Peksag và Tahia K trong gh-62308)

trang web

  • Các tệp .pth hiện được giải mã bằng UTF-8 trước, sau đó bằng locale encoding nếu quá trình giải mã UTF-8 không thành công. (Được đóng góp bởi Inada Naoki trong gh-117802.)

sqlite3

  • Một ResourceWarning hiện được phát ra nếu đối tượng Connection không phải là closed một cách rõ ràng. (Được đóng góp bởi Erlend E. Aasland trong gh-105539.)

  • Thêm tham số chỉ từ khóa filter vào Connection.iterdump() để lọc các đối tượng cơ sở dữ liệu cần kết xuất. (Được đóng góp bởi Mariusz Felisiak trong gh-91602.)

ssl

  • create_default_context() API hiện bao gồm VERIFY_X509_PARTIAL_CHAINVERIFY_X509_STRICT trong các cờ mặc định của nó.

    Ghi chú

    VERIFY_X509_STRICT có thể từ chối các chứng chỉ trước RFC 5280 hoặc không đúng định dạng mà việc triển khai OpenSSL cơ bản có thể chấp nhận. Mặc dù việc tắt tính năng này không được khuyến khích nhưng bạn có thể thực hiện bằng cách sử dụng:

    nhập khẩu ssl
    
    ctx = ssl.create_default_context()
    ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT
    

    (Được đóng góp bởi William Woodruff trong gh-112389.)

thống kê

  • Thêm kde() để ước tính mật độ hạt nhân. Điều này cho phép ước tính hàm mật độ xác suất liên tục từ một số mẫu rời rạc cố định. (Được đóng góp bởi Raymond Hettinger trong gh-115863.)

  • Thêm kde_random() để lấy mẫu từ hàm mật độ xác suất ước tính do kde() tạo. (Được đóng góp bởi Raymond Hettinger trong gh-115863.)

quy trình con

  • Mô-đun subprocess hiện sử dụng chức năng posix_spawn() trong nhiều tình huống hơn.

    Đáng chú ý, khi close_fdsTrue (mặc định), posix_spawn() sẽ được sử dụng khi thư viện C cung cấp posix_spawn_file_actions_addclosefrom_np(), bao gồm các phiên bản gần đây của Linux, FreeBSD và Solaris. Trên Linux, điều này sẽ hoạt động tương tự như mã dựa trên Linux vfork() hiện có.

    Núm điều khiển riêng subprocess._USE_POSIX_SPAWN có thể được đặt thành False nếu bạn cần buộc subprocess không bao giờ sử dụng posix_spawn(). Vui lòng báo cáo lý do và chi tiết nền tảng của bạn trong issue tracker nếu bạn đặt điều này để chúng tôi có thể cải thiện logic lựa chọn API cho mọi người. (Được đóng góp bởi Jakub Kulik trong gh-113117.)

hệ thống

  • Thêm hàm _is_interned() để kiểm tra xem một chuỗi có được thực hiện hay không. Chức năng này không được đảm bảo tồn tại trong tất cả các triển khai Python. (Được đóng góp bởi Serhiy Storchaka trong gh-78573.)

tập tin tạm thời

  • Trên Windows, chế độ mặc định 0o700 được tempfile.mkdtemp() sử dụng hiện giới hạn quyền truy cập vào thư mục mới do những thay đổi đối với os.mkdir(). Đây là biện pháp giảm nhẹ cho CVE 2024-4030. (Được đóng góp bởi Steve Dower trong gh-118486.)

thời gian

  • Trên Windows, monotonic() hiện sử dụng đồng hồ QueryPerformanceCounter() cho độ phân giải 1 micro giây, thay vì đồng hồ GetTickCount64() có độ phân giải 15,6 mili giây. (Được đóng góp bởi Victor Stinner trong gh-88494.)

  • Trên Windows, time() hiện sử dụng đồng hồ GetSystemTimePreciseAsFileTime() cho độ phân giải 1 micro giây, thay vì đồng hồ GetSystemTimeAsFileTime() có độ phân giải 15,6 mili giây. (Được đóng góp bởi Victor Stinner trong gh-63207.)

tkinter

  • Thêm các phương thức tiện ích tkinter: tk_busy_hold(), tk_busy_configure(), tk_busy_cget(), tk_busy_forget(), tk_busy_current()tk_busy_status(). (Được đóng góp bởi Miguel, klappnase và Serhiy Storchaka trong gh-72684.)

  • Phương thức tiện ích tkinter wm_attributes() hiện chấp nhận tên thuộc tính không có tiền tố dấu trừ để lấy thuộc tính cửa sổ, ví dụ w.wm_attributes('alpha') và cho phép chỉ định các thuộc tính và giá trị để đặt làm đối số từ khóa, ví dụ w.wm_attributes(alpha=0.5). (Được đóng góp bởi Serhiy Storchaka trong gh-43457.)

  • wm_attributes() hiện có thể trả về các thuộc tính dưới dạng dict bằng cách sử dụng tham số return_python_dict chỉ có từ khóa tùy chọn mới. (Được đóng góp bởi Serhiy Storchaka trong gh-43457.)

  • Text.count() giờ đây có thể trả về một int đơn giản khi tham số return_ints chỉ có từ khóa tùy chọn mới được sử dụng. Nếu không, số đếm đơn sẽ được trả về dưới dạng 1-tuple hoặc None. (Được đóng góp bởi Serhiy Storchaka trong gh-97928.)

  • Hỗ trợ loại phần tử "vsapi" trong phương thức element_create() của tkinter.ttk.Style. (Được đóng góp bởi Serhiy Storchaka trong gh-68166.)

  • Thêm phương thức after_info() cho các tiện ích Tkinter. (Được đóng góp bởi Cheryl Sabella trong gh-77020.)

  • Thêm phương thức copy_replace() mới vào PhotoImage để sao chép một vùng từ hình ảnh này sang hình ảnh khác, có thể bằng cách thu phóng pixel, lấy mẫu con hoặc cả hai. (Được đóng góp bởi Serhiy Storchaka trong gh-118225.)

  • Thêm tham số from_coords vào các phương thức PhotoImage copy(), zoom()subsample(). Thêm tham số zoomsubsample vào phương thức PhotoImage copy(). (Được đóng góp bởi Serhiy Storchaka trong gh-118225.)

  • Thêm các phương thức PhotoImage read() để đọc hình ảnh từ một tệp và data() để lấy dữ liệu hình ảnh. Thêm tham số backgroundgrayscale vào phương thức write(). (Được đóng góp bởi Serhiy Storchaka trong gh-118271.)

truy nguyên

  • Thêm thuộc tính exc_type_str vào TracebackException, thuộc tính này chứa hiển thị chuỗi của exc_type. Không dùng nữa thuộc tính exc_type, thuộc tính chứa chính đối tượng kiểu đó. Thêm tham số save_exc_type (True mặc định) để cho biết có nên lưu exc_type hay không. (Được đóng góp bởi Irit Katriel trong gh-112332.)

  • Thêm một tham số chỉ từ khóa show_group mới vào TracebackException.format_exception_only() để định dạng (đệ quy) các ngoại lệ lồng nhau của phiên bản BaseExceptionGroup. (Được đóng góp bởi Irit Katriel trong gh-105292.)

các loại

  • SimpleNamespace hiện có thể lấy một đối số vị trí duy nhất để khởi tạo các đối số của không gian tên. Đối số này phải là ánh xạ hoặc có thể lặp lại các cặp khóa-giá trị. (Được đóng góp bởi Serhiy Storchaka trong gh-108191.)

đánh máy

  • PEP 705: Thêm ReadOnly, một cấu trúc gõ đặc biệt để đánh dấu mục TypedDict là chỉ đọc cho trình kiểm tra loại.

  • PEP 742: Thêm TypeIs, một cấu trúc gõ có thể được sử dụng để hướng dẫn người kiểm tra loại cách thu hẹp một loại.

  • Thêm NoDefault, một đối tượng trọng điểm được sử dụng để thể hiện giá trị mặc định của một số tham số trong mô-đun typing. (Được đóng góp bởi Jelle Zijlstra trong gh-116126.)

  • Thêm get_protocol_members() để trả về tập hợp các thành viên xác định typing.Protocol. (Được đóng góp bởi Jelle Zijlstra trong gh-104873.)

  • Thêm is_protocol() để kiểm tra xem một lớp có phải là Protocol hay không. (Được đóng góp bởi Jelle Zijlstra trong gh-104873.)

  • ClassVar hiện có thể được lồng trong Final và ngược lại. (Được đóng góp bởi Mehdi Drissi trong gh-89547.)

dữ liệu unicode

  • Cập nhật cơ sở dữ liệu Unicode lên version 15.1.0. (Được đóng góp bởi James Gerity trong gh-109559.)

venv

  • Thêm hỗ trợ tạo các tệp bỏ qua quản lý kiểm soát nguồn (SCM) trong thư mục của môi trường ảo. Theo mặc định, Git được hỗ trợ. Điều này được triển khai dưới dạng chọn tham gia thông qua API, có thể được mở rộng để hỗ trợ các SCM khác (EnvBuildercreate()) và chọn không tham gia thông qua CLI, sử dụng --without-scm-ignore-files. (Được đóng góp bởi Brett Cannon trong gh-108125.)

cảnh báo

  • PEP 702: Trình trang trí warnings.deprecated() mới cung cấp một cách để truyền đạt thông tin không dùng nữa cho static type checker và cảnh báo về việc sử dụng các lớp và hàm không được dùng nữa. Một DeprecationWarning cũng có thể được phát ra khi một hàm hoặc lớp được trang trí được sử dụng trong thời gian chạy. (Được đóng góp bởi Jelle Zijlstra trong gh-104003.)

xml

nhập khẩu zip

  • Thêm hỗ trợ cho các tập tin định dạng ZIP64. Mọi người đều thích dữ liệu khổng lồ, phải không? (Được đóng góp bởi Tim Hatch trong gh-94146.)

Tối ưu hóa

  • Một số mô-đun thư viện tiêu chuẩn đã có thời gian nhập được cải thiện đáng kể. Ví dụ: thời gian nhập của mô-đun typing đã giảm khoảng một phần ba bằng cách loại bỏ các phần phụ thuộc vào recontextlib. Các mô-đun khác giúp tăng tốc thời gian nhập bao gồm email.utils, enum, functools, importlib.metadatathreading. (Được đóng góp bởi Alex Waygood, Shantanu Jain, Adam Turner, Daniel Hollas và những người khác trong gh-109653.)

  • textwrap.indent() hiện nhanh hơn khoảng 30% so với trước đây đối với đầu vào lớn. (Được đóng góp bởi Inada Naoki trong gh-107369.)

  • Mô-đun subprocess hiện sử dụng chức năng posix_spawn() trong nhiều tình huống hơn, kể cả khi close_fdsTrue (mặc định) trên nhiều nền tảng hiện đại. Điều này sẽ mang lại sự gia tăng hiệu suất đáng chú ý khi khởi chạy các quy trình trên FreeBSD và Solaris. Xem phần subprocess ở trên để biết chi tiết. (Được đóng góp bởi Jakub Kulik trong gh-113117.)

Các mô-đun và API đã bị xóa

PEP 594: Loại bỏ "pin chết" khỏi thư viện chuẩn

PEP 594 đã đề xuất xóa 19 mô-đun khỏi thư viện tiêu chuẩn, thường được gọi là 'pin chết' do trạng thái lịch sử, lỗi thời hoặc không an toàn của chúng. Tất cả các mô-đun sau không được dùng nữa trong Python 3.11 và hiện đã bị xóa:

  • aifc

    • standard-aifc: Sử dụng phân phối lại thư viện aifc từ PyPI.

  • audioop

    • audioop-lts: Sử dụng thư viện audioop-lts từ PyPI.

  • chunk

    • standard-chunk: Sử dụng phân phối lại thư viện chunk từ PyPI.

  • cgicgitb

    • cgi.FieldStorage thường có thể được thay thế bằng urllib.parse.parse_qsl() cho các yêu cầu GETHEAD và mô-đun email.message hoặc thư viện multipart cho các yêu cầu POSTPUT.

    • cgi.parse() có thể được thay thế bằng cách gọi urllib.parse.parse_qs() trực tiếp trên chuỗi truy vấn mong muốn, trừ khi đầu vào là multipart/form-data, cần thay thế như mô tả bên dưới cho cgi.parse_multipart().

    • cgi.parse_header() có thể được thay thế bằng chức năng trong gói email, gói này triển khai các RFC MIME tương tự. Ví dụ: với email.message.EmailMessage:

      từ nhập email.message EmailMessage
      
      tin nhắn = EmailMessage()
      msg['content-type'] = 'application/json; bộ ký tự="utf8"'
      main, params = msg.get_content_type(), msg['content-type'].params
      
    • cgi.parse_multipart() có thể được thay thế bằng chức năng trong gói email, gói này triển khai cùng các RFC MIME hoặc bằng thư viện multipart. Ví dụ: các lớp email.message.EmailMessageemail.message.Message.

    • standard-cgi: và standard-cgitb: Sử dụng phân phối lại thư viện cgicgitb từ PyPI.

  • crypt và tiện ích mở rộng _crypt riêng tư. Mô-đun hashlib có thể là sự thay thế thích hợp khi chỉ cần băm một giá trị. Mặt khác, có sẵn nhiều thư viện của bên thứ ba trên PyPI:

    • bcrypt: Băm mật khẩu hiện đại cho phần mềm và máy chủ của bạn.

    • argon2-cffi: Thuật toán băm mật khẩu Argon2 an toàn.

    • legacycrypt: trình bao bọc ctypes cho lệnh gọi thư viện mật mã POSIX và chức năng liên quan.

    • crypt_r: Phân nhánh của mô-đun crypt, trình bao bọc lệnh gọi thư viện crypt_r(3) và chức năng liên quan.

    • standard-cryptdeprecated-crypt-alternative: Sử dụng bản phân phối lại crypt và triển khai lại các thư viện _crypt từ PyPI.

  • imghdr: Nên sử dụng các thư viện filetype, puremagic hoặc python-magic để thay thế. Ví dụ: hàm puremagic.what() có thể được sử dụng để thay thế hàm imghdr.what() cho tất cả các định dạng tệp được imghdr hỗ trợ.

    • standard-imghdr: Sử dụng phân phối lại thư viện imghdr từ PyPI.

  • mailcap: Thay vào đó hãy sử dụng mô-đun mimetypes.

    • standard-mailcap: Sử dụng phân phối lại thư viện mailcap từ PyPI.

  • msilib

  • nis

  • nntplib: Thay vào đó hãy sử dụng thư viện pynntp từ PyPI.

    • standard-nntplib: Sử dụng phân phối lại thư viện nntplib từ PyPI.

  • ossaudiodev: Để phát lại âm thanh, thay vào đó hãy sử dụng thư viện pygame từ PyPI.

  • pipes: Thay vào đó hãy sử dụng mô-đun subprocess. Sử dụng shlex.quote() để thay thế hàm pipes.quote không có giấy tờ.

    • standard-pipes: Sử dụng phân phối lại thư viện pipes từ PyPI.

  • sndhdr: Nên sử dụng các thư viện filetype, puremagic hoặc python-magic để thay thế.

    • standard-sndhdr: Sử dụng phân phối lại thư viện sndhdr từ PyPI.

  • spwd: Thay vào đó hãy sử dụng thư viện python-pam từ PyPI.

  • sunau

    • standard-sunau: Sử dụng phân phối lại thư viện sunau từ PyPI.

  • telnetlib, thay vào đó hãy sử dụng thư viện telnetlib3 hoặc Exscript từ PyPI.

  • uu: Thay vào đó, hãy sử dụng mô-đun base64 như một giải pháp thay thế hiện đại.

    • standard-uu: Sử dụng phân phối lại thư viện uu từ PyPI.

  • xdrlib

    • standard-xdrlib: Sử dụng phân phối lại thư viện xdrlib từ PyPI.

(Được đóng góp bởi Victor Stinner và Zachary Ware trong gh-104773gh-104780.)

2to3

  • Xóa chương trình 2to3 và mô-đun lib2to3, trước đây không được dùng nữa trong Python 3.11. (Được đóng góp bởi Victor Stinner trong gh-104780.)

nội dung

  • Xóa hỗ trợ cho các bộ mô tả classmethod được xâu chuỗi (được giới thiệu trong gh-63272). Chúng không còn có thể được sử dụng để bao bọc các bộ mô tả khác, chẳng hạn như property. Thiết kế cốt lõi của tính năng này có sai sót và dẫn đến một số vấn đề. Để "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.)

  • Tăng RuntimeError khi gọi frame.clear() trên khung bị treo (như thường lệ đối với khung thực thi). (Được đóng góp bởi Irit Katriel trong gh-79932.)

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

  • Xóa lớp LegacyInterpolation không có giấy tờ, không được dùng nữa trong chuỗi tài liệu kể từ Python 3.2 và trong thời gian chạy kể từ Python 3.11. (Được đóng góp bởi Hugo van Kemenade trong gh-104886.)

importlib.metadata

  • Xóa quyền truy cập chỉ số dưới (__getitem__()) không được dùng nữa cho các đối tượng EntryPoint. (Được đóng góp bởi Jason R. Coombs trong gh-113175.)

ngôn ngữ

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

mã lệnh

  • Di chuyển opcode.ENABLE_SPECIALIZATION sang _opcode.ENABLE_SPECIALIZATION. Trường này đã được thêm vào phiên bản 3.12, nó chưa bao giờ được ghi lại và không nhằm mục đích sử dụng bên ngoài. (Được đóng góp bởi Irit Katriel trong gh-105481.)

  • Xóa opcode.is_pseudo(), opcode.MIN_PSEUDO_OPCODEopcode.MAX_PSEUDO_OPCODE đã được thêm vào Python 3.12 nhưng không được ghi lại cũng như không được hiển thị thông qua dis và không nhằm mục đích sử dụng bên ngoài. (Được đóng góp bởi Irit Katriel trong gh-105481.)

phân tích cú pháp

  • Mô-đun này không còn được coi là soft deprecated nữa. Mặc dù argparse vẫn được ưu tiên cho các dự án mới không sử dụng thư viện xử lý đối số dòng lệnh của bên thứ ba, nhưng có một số khía cạnh trong cách argparse hoạt động có nghĩa là mô-đun optparse cấp thấp hơn có thể cung cấp nền tảng tốt hơn cho các thư viện xử lý đối số writing và để triển khai các ứng dụng dòng lệnh tuân thủ nghiêm ngặt hơn argparse đối với các quy ước xử lý dòng lệnh Unix khác nhau bắt nguồn từ hoạt động của hàm C getopt(). (Được đóng góp bởi Alyssa Coghlan và Serhiy Storchaka trong gh-126180.)

đường dẫn

  • Loại bỏ khả năng sử dụng các đối tượng Path làm trình quản lý bối cảnh. Chức năng này không được dùng nữa và không có hiệu lực kể từ Python 3.9. (Được đóng góp bởi Barney Gale trong gh-83863.)

lại

  • Xóa hàm re.template() không có giấy tờ, không được dùng nữa và bị hỏng cũng như cờ re.TEMPLATE / re.T. (Được đóng góp bởi Serhiy Storchaka và Nikita Sobolev trong gh-105687.)

tkinter.tix

  • Xóa mô-đun tkinter.tix, không được dùng nữa trong Python 3.6. Thư viện Tix của bên thứ ba mà mô-đun bao bọc không được bảo trì. (Được đóng góp bởi Zachary Ware trong gh-75552.)

rùa

  • Xóa phương thức RawTurtle.settiltangle(), không được dùng nữa trong tài liệu kể từ Python 3.1 và trong thời gian chạy kể từ Python 3.11. (Được đóng góp bởi Hugo van Kemenade trong gh-104876.)

đánh máy

  • Xóa các không gian tên typing.iotyping.re, không được dùng nữa kể từ Python 3.8. Các mục trong các không gian tên đó có thể được nhập trực tiếp từ mô-đun typing. (Được đóng góp bởi Sebastian Rittau trong gh-92871.)

  • Xóa phương thức đối số từ khóa để tạo các loại TypedDict, không được dùng nữa trong Python 3.11. (Được đóng góp bởi Tomas Roun trong gh-104786.)

nhỏ nhất

  • Xóa các hàm unittest sau, không được dùng nữa trong Python 3.11:

    • 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 Hugo van Kemenade trong gh-104835.)

  • Xóa phương thức TestProgram.usageExit() chưa được kiểm tra và không có giấy tờ, không được dùng nữa trong Python 3.11. (Được đóng góp bởi Hugo van Kemenade trong gh-104992.)

urllib

  • Xóa các tham số cafile, capathcadefault của hàm urllib.request.urlopen(), không được dùng nữa trong Python 3.6. Thay vào đó, hãy sử dụng tham số context bằng phiên bản SSLContext. Chức năng ssl.SSLContext.load_cert_chain() có thể được sử dụng để tải các chứng chỉ cụ thể hoặc để ssl.create_default_context() chọn chứng chỉ của tổ chức phát hành chứng chỉ tin cậy (CA) của hệ điều hành. (Được đóng góp bởi Victor Stinner trong gh-105382.)

trình duyệt web

  • Xóa lớp MacOSX chưa được kiểm tra và không có giấy tờ, không được dùng nữa trong Python 3.11. Thay vào đó, hãy sử dụng lớp MacOSXOSAScript (được giới thiệu trong Python 3.2). (Được đóng góp bởi Hugo van Kemenade trong gh-104804.)

  • Xóa thuộc tính MacOSXOSAScript._name không được dùng nữa. Thay vào đó hãy sử dụng thuộc tính MacOSXOSAScript.name. (Được đóng góp bởi Nikita Sobolev trong gh-105546.)

Điểm dừng mới

  • User-defined functions:

    • Không dùng nữa việc gán cho thuộc tính __code__ của hàm, trong đó loại đối tượng mã mới không khớp với loại của hàm. Các loại khác nhau là: hàm đơn giản, trình tạo, trình tạo không đồng bộ và coroutine. (Được đóng góp bởi Irit Katriel trong gh-81137.)

  • array:

    • Không dùng mã định dạng 'u' (wchar_t) khi chạy. Mã định dạng này không được dùng nữa trong tài liệu kể từ Python 3.3 và sẽ bị xóa trong Python 3.16. Thay vào đó, hãy sử dụng mã định dạng 'w' (Py_UCS4) cho các ký tự Unicode. (Được đóng góp bởi Hugo van Kemenade trong gh-80480.)

  • ctypes:

    • Không dùng nữa hàm SetPointerType() không có giấy tờ, sẽ bị xóa trong Python 3.15. (Được đóng góp bởi Victor Stinner trong gh-105733.)

    • Soft-deprecate chức năng ARRAY() thiên về phép nhân type * length. (Được đóng góp bởi Victor Stinner trong gh-105733.)

  • decimal:

    • Không dùng nữa công cụ xác định định dạng Decimal không chuẩn và không có giấy tờ 'N', chỉ được hỗ trợ trong quá trình triển khai C của mô-đun decimal. Đã lên lịch xóa trong Python 3.18. (Được đóng góp bởi Serhiy Storchaka trong gh-89902.)

  • dis:

    • Ngừng sử dụng dấu phân cách HAVE_ARGUMENT. Thay vào đó hãy kiểm tra tư cách thành viên trong hasarg. (Được đóng góp bởi Irit Katriel trong gh-109319.)

  • gettext:

    • Loại bỏ các số không nguyên làm đối số cho các hàm và phương thức xem xét dạng số nhiều trong mô-đun gettext, ngay cả khi không tìm thấy bản dịch nào. (Được đóng góp bởi Serhiy Storchaka trong gh-88434.)

  • glob:

    • Không dùng nữa các hàm glob0()glob1() không có giấy tờ. Thay vào đó, hãy sử dụng glob() và chuyển path-like object chỉ định thư mục gốc cho tham số root_dir. (Được đóng góp bởi Barney Gale trong gh-117337.)

  • http.server:

    • Không dùng CGIHTTPRequestHandler nữa, sẽ bị xóa trong Python 3.15. Các máy chủ CGI HTTP dựa trên quy trình đã không còn được ưa chuộng trong một thời gian rất dài. Mã này đã lỗi thời, không được bảo trì và hiếm khi được sử dụng. Nó có tiềm năng cao về cả lỗi bảo mật và chức năng. (Được đóng góp bởi Gregory P. Smith trong gh-109096.)

    • Không dùng cờ --cgi cho giao diện dòng lệnh python -m http.server, sẽ bị xóa trong Python 3.15. (Được đóng góp bởi Gregory P. Smith trong gh-109096.)

  • mimetypes:

  • re:

    • Không dùng nữa việc chuyển các đối số maxsplit, count hoặc flags tùy chọn làm đối số vị trí cho các hàm split(), sub()subn() cấp mô-đun. Các tham số này sẽ trở thành keyword-only trong phiên bản Python trong tương lai. (Được đóng góp bởi Serhiy Storchaka trong gh-56166.)

  • pathlib:

  • platform:

    • Không dùng java_ver() nữa, sẽ bị xóa trong Python 3.15. 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. (Được đóng góp bởi Nikita Sobolev trong gh-116349.)

  • pydoc:

    • Không dùng nữa chức năng ispackage() không có giấy tờ. (Được đóng góp bởi Zackery Spytz trong gh-64020.)

  • sqlite3:

    • Không dùng nữa việc chuyển nhiều hơn một đối số vị trí cho hàm connect() và hàm tạo Connection. Các tham số còn lại sẽ chỉ có từ khóa trong Python 3.15. (Được đóng góp bởi Erlend E. Aasland trong gh-107948.)

    • Không dùng tên truyền, số lượng đối số và đối số có thể gọi làm đối số từ khóa cho Connection.create_function()Connection.create_aggregate(). Các tham số này sẽ chỉ có vị trí trong Python 3.15. (Được đóng góp bởi Erlend E. Aasland trong gh-108278.)

    • Không dùng nữa việc chuyển lệnh gọi lại có thể gọi theo từ khóa cho các phương thức set_authorizer(), set_progress_handler()set_trace_callback() Connection. Các lệnh gọi lại có thể gọi lại sẽ chỉ có vị trí trong Python 3.15. (Được đóng góp bởi Erlend E. Aasland trong gh-108278.)

  • sys:

  • tarfile:

    • Không dùng nữa thuộc tính TarFile.tarfile không có giấy tờ và không được sử dụng, sẽ bị xóa trong Python 3.16. (Đã đóng góp trong gh-115256.)

  • traceback:

  • typing:

    • Không dùng 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)), sẽ bị xóa trong Python 3.15. 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. (Được đóng góp bởi Alex Waygood trong gh-105566.)

    • Không dùng nữa việc bỏ qua tham số fields khi tạo lớp NamedTuple hoặc typing.TypedDict và không dùng nữa việc chuyển None sang tham số fields của cả hai loại. Python 3.15 sẽ yêu cầu một chuỗi hợp lệ cho tham số fields. Để tạo một lớp NamedTuple không có trường nào, hãy sử dụng class NT(NamedTuple): pass hoặc NT = NamedTuple("NT", ()). Để tạo lớp TypedDict không có trường nào, hãy sử dụng class TD(TypedDict): pass hoặc TD = TypedDict("TD", {}). (Được đóng góp bởi Alex Waygood trong gh-105566gh-105570.)

    • Không dùng nữa chức năng trang trí typing.no_type_check_decorator(), sẽ bị xóa trong Python 3.15. Sau tám năm sử dụng mô-đun typing, nó vẫn chưa được hỗ trợ bởi bất kỳ trình kiểm tra loại chính nào. (Được đóng góp bởi Alex Waygood trong gh-106309.)

    • Không dùng nữa typing.AnyStr. Trong Python 3.16, nó sẽ bị xóa khỏi typing.__all__DeprecationWarning sẽ được phát ra trong thời gian chạy khi nó được nhập hoặc truy cập. Nó sẽ bị xóa hoàn toàn trong Python 3.18. Thay vào đó hãy sử dụng type parameter syntax mới. (Được đóng góp bởi Michael Thế trong gh-107116.)

  • wave:

Đang chờ xóa trong Python 3.14

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

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

    • ast.Num

    • ast.Str

    • ast.Bytes

    • ast.NameConstant

    • ast.Ellipsis

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

  • asyncio:

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

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

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

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

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

    • importlib.abc.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

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

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

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

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

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

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

  • pty:

  • sqlite3:

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

Đang chờ xóa trong Python 3.15

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

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

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

  • ctypes:

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

  • http.server:

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

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

  • importlib:

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

  • locale:

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

  • pathlib:

  • platform:

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

  • sysconfig:

  • threading:

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

  • types:

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

  • typing:

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

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

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

  • wave:

  • zipimport:

Đang chờ xóa trong Python 3.16

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

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

  • array:

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

  • asyncio:

  • builtins:

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

  • functools:

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

  • logging:

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

  • mimetypes:

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

  • shutil:

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

  • symtable:

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

  • sys:

  • sysconfig:

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

  • tarfile:

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

Đang chờ xóa trong Python 3.17

  • collections.abc:

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

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

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

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

  • typing:

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

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

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

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

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

Đang chờ xóa trong Python 3.18

  • decimal:

    • Công cụ xác định định dạng Decimal không chuẩn và không có giấy tờ 'N', chỉ được hỗ trợ trong quá trình triển khai C của mô-đun decimal, đã không được dùng nữa kể từ Python 3.13. (Được đóng góp bởi Serhiy Storchaka trong gh-89902.)

Đang chờ xóa trong Python 3.19

  • ctypes:

    • Hoàn toàn chuyển sang bố cục cấu trúc tương thích với MSVC bằng cách đặt _pack_ chứ không phải _layout_ trên nền tảng không phải Windows.

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

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

  • argparse:

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

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

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

  • builtins:

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

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

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

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

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

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

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

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

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

  • datetime:

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

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

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

  • importlib:

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

  • importlib.metadata:

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

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

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

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

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

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

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

  • mô-đun sre_compile, sre_constantssre_parse.

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

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

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

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

    • tùy chọn ssl.OP_NO_SSL*

    • tùy chọn ssl.OP_NO_TLS*

    • ssl.PROTOCOL_SSLv3

    • ssl.PROTOCOL_TLS

    • ssl.PROTOCOL_TLSv1

    • ssl.PROTOCOL_TLSv1_1

    • ssl.PROTOCOL_TLSv1_2

    • ssl.TLSVersion.SSLv3

    • ssl.TLSVersion.TLSv1

    • ssl.TLSVersion.TLSv1_1

  • phương pháp threading:

  • typing.Text (gh-92332).

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

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

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

    • splitattr()

    • splithost()

    • splitnport()

    • splitpasswd()

    • splitport()

    • splitquery()

    • splittag()

    • splittype()

    • splituser()

    • splitvalue()

    • to_bytes()

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

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

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

Thay đổi mã byte CPython

  • Oparg của YIELD_VALUE bây giờ là 1 nếu sản lượng là một phần của sản lượng từ hoặc đang chờ và 0 nếu ngược lại. Oparg của RESUME đã được thay đổi để thêm một chút cho biết nếu độ sâu ngoại trừ là 1, điều này cần thiết để tối ưu hóa việc đóng máy phát điện. (Được đóng góp bởi Irit Katriel trong gh-111354.)

C API Thay đổi

Tính năng mới

API C đã thay đổi

  • Tham số keywords của PyArg_ParseTupleAndKeywords()PyArg_VaParseTupleAndKeywords() hiện có loại char *const* trong C và const char *const* trong C++, thay vì char**. Trong C++, điều này làm cho các hàm này tương thích với các đối số thuộc loại const char *const*, const char** hoặc char *const* mà không cần ép kiểu rõ ràng. Trong C, các hàm chỉ hỗ trợ các đối số kiểu char *const*. Điều này có thể được ghi đè bằng macro PY_CXX_CONST. (Được đóng góp bởi Serhiy Storchaka trong gh-65210.)

  • PyArg_ParseTupleAndKeywords() hiện hỗ trợ tên tham số từ khóa không phải ASCII. (Được đóng góp bởi Serhiy Storchaka trong gh-110815.)

  • Chức năng PyCode_GetFirstFree() hiện không ổn định API và hiện được đặt tên là PyUnstable_Code_GetFirstFree(). (Được đóng góp bởi Bogdan Romanyuk trong gh-115781.)

  • Các hàm PyDict_GetItem(), PyDict_GetItemString(), PyMapping_HasKey(), PyMapping_HasKeyString(), PyObject_HasAttr(), PyObject_HasAttrString()PySys_GetObject(), mỗi hàm sẽ xóa tất cả các lỗi xảy ra khi gọi chúng, giờ đây sẽ báo cáo các lỗi này bằng sys.unraisablehook(). Bạn có thể thay thế chúng bằng các chức năng khác như được đề xuất trong tài liệu. (Được đóng góp bởi Serhiy Storchaka trong gh-106672.)

  • Thêm hỗ trợ cho các định dạng %T, %#T, %N%#N cho PyUnicode_FromFormat():

    • %T: Lấy tên đầy đủ của một loại đối tượng

    • %#T: Như trên nhưng dùng dấu hai chấm làm dấu phân cách

    • %N: Lấy tên đầy đủ của một loại

    • %#N: Như trên nhưng dùng dấu hai chấm làm dấu phân cách

    Xem PEP 737 để biết thêm thông tin. (Được đóng góp bởi Victor Stinner trong gh-111696.)

  • Bạn không còn phải xác định macro PY_SSIZE_T_CLEAN trước khi bao gồm Python.h khi sử dụng định dạng # trong format codes. Các API chấp nhận mã định dạng luôn sử dụng Py_ssize_t cho các định dạng #. (Được đóng góp bởi Inada Naoki trong gh-104922.)

  • Nếu Python được xây dựng bằng debug mode hoặc with assertions, PyTuple_SET_ITEM()PyList_SET_ITEM() bây giờ hãy kiểm tra đối số chỉ mục bằng một xác nhận. (Được đóng góp bởi Victor Stinner trong gh-106168.)

Thay đổi giới hạn C API

API C đã bị xóa

  • Xóa một số hàm, macro, biến, v.v. có tên bắt đầu bằng _Py hoặc _PY (được coi là riêng tư). Nếu dự án của bạn bị ảnh hưởng bởi một trong những lần xóa này và bạn tin rằng API đã bị xóa vẫn có sẵn, vui lòng open a new issue yêu cầu C API công khai và thêm cc: @vstinner vào vấn đề này để thông báo cho Victor Stinner. (Được đóng góp bởi Victor Stinner trong gh-106320.)

  • Xóa các giao thức đệm cũ không được dùng nữa trong Python 3.0. Thay vào đó hãy sử dụng Giao thức đệm.

    • PyObject_CheckReadBuffer(): Sử dụng PyObject_CheckBuffer() để kiểm tra xem đối tượng có hỗ trợ giao thức bộ đệm hay không. Lưu ý rằng PyObject_CheckBuffer() không đảm bảo rằng PyObject_GetBuffer() sẽ thành công. Để kiểm tra xem đối tượng có thực sự đọc được hay không, hãy xem ví dụ tiếp theo về PyObject_GetBuffer().

    • PyObject_AsCharBuffer(), PyObject_AsReadBuffer(): Thay vào đó hãy sử dụng PyObject_GetBuffer()PyBuffer_Release():

      Chế độ xem Py_buffer;
      if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) < 0) {
          trả về NULL;
      }
      // Sử dụng `view.buf` và `view.len` để đọc từ bộ đệm.
      // Bạn có thể cần truyền buf thành `(const char*)view.buf`.
      PyBuffer_Release(&view);
      
    • PyObject_AsWriteBuffer(): Thay vào đó hãy sử dụng PyObject_GetBuffer()PyBuffer_Release():

      Chế độ xem Py_buffer;
      if (PyObject_GetBuffer(obj, &view, PyBUF_WRITABLE) < 0) {
          trả lại NULL;
      }
      // Sử dụng `view.buf` và `view.len` để ghi vào bộ đệm.
      PyBuffer_Release(&view);
      

    (Được đóng góp bởi Inada Naoki trong gh-85275.)

  • Xóa các hàm khác nhau không được dùng nữa trong Python 3.9:

    • PyEval_CallObject(), PyEval_CallObjectWithKeywords(): Thay vào đó hãy sử dụng PyObject_CallNoArgs() hoặc PyObject_Call().

      Cảnh báo

      Trong PyObject_Call(), các đối số vị trí phải là tuple và không được là NULL, đồng thời các đối số từ khóa phải là dict hoặc NULL, trong khi các hàm bị loại bỏ đã kiểm tra các loại đối số và chấp nhận các đối số từ khóa và vị trí NULL. Để thay thế PyEval_CallObjectWithKeywords(func, NULL, kwargs) bằng PyObject_Call(), hãy chuyển một bộ dữ liệu trống làm đối số vị trí bằng PyTuple_New(0).

    • PyEval_CallFunction(): Thay vào đó hãy sử dụng PyObject_CallFunction().

    • PyEval_CallMethod(): Thay vào đó hãy sử dụng PyObject_CallMethod().

    • PyCFunction_Call(): Thay vào đó hãy sử dụng PyObject_Call().

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

  • Xóa các hàm cũ sau để định cấu hình khởi tạo Python, không được dùng trong Python 3.11:

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

  • Xóa các hàm PyEval_AcquireLock()PyEval_ReleaseLock(), không được dùng nữa trong Python 3.2. Họ không cập nhật trạng thái chủ đề hiện tại. Chúng có thể được thay thế bằng:

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

  • Xóa hàm PyEval_ThreadsInitialized(), không được dùng nữa trong Python 3.9. Kể từ Python 3.7, Py_Initialize() luôn tạo GIL: gọi PyEval_InitThreads() không làm gì cả và PyEval_ThreadsInitialized() luôn trả về khác 0. (Được đóng góp bởi Victor Stinner trong gh-105182.)

  • Xóa bí danh _PyInterpreterState_Get() thành PyInterpreterState_Get() được giữ để tương thích ngược với Python 3.8. pythoncapi-compat project có thể được sử dụng để tải PyInterpreterState_Get() trên Python 3.8 trở lên. (Được đóng góp bởi Victor Stinner trong gh-106320.)

  • Xóa chức năng _PyObject_FastCall() riêng tư: sử dụng PyObject_Vectorcall() có sẵn kể từ Python 3.8 (PEP 590). (Được đóng góp bởi Victor Stinner trong gh-106023.)

  • Xóa tệp tiêu đề cpython/pytime.h chỉ chứa các chức năng riêng tư. (Được đóng góp bởi Victor Stinner trong gh-106316.)

  • Xóa hằng số PY_TIMEOUT_MAX không có giấy tờ khỏi C API bị giới hạn. (Được đóng góp bởi Victor Stinner trong gh-110014.)

  • Xóa macro thùng rác cũ Py_TRASHCAN_SAFE_BEGINPy_TRASHCAN_SAFE_END. Thay thế cả hai bằng macro mới Py_TRASHCAN_BEGINPy_TRASHCAN_END. (Được đóng góp bởi Irit Katriel trong gh-105111.)

API C không được dùng nữa

Đang chờ xóa trong Python 3.14

Đang chờ xóa trong Python 3.15

Đang chờ xóa trong Python 3.16

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

Đang chờ xóa trong Python 3.18

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

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

Xây dựng thay đổi

  • arm64-apple-iosarm64-apple-ios-simulator hiện đều là nền tảng PEP 11 cấp 3. (PEP 730 được viết và triển khai bởi Russell Keith-Magee trong gh-114099.)

  • aarch64-linux-androidx86_64-linux-android hiện đều là nền tảng PEP 11 cấp 3. (PEP 738 được viết và triển khai bởi Malcolm Smith trong gh-116622.)

  • wasm32-wasi hiện là nền tảng PEP 11 cấp 2. (Được đóng góp bởi Brett Cannon trong gh-115192.)

  • wasm32-emscripten không còn là nền tảng được hỗ trợ PEP 11 nữa. (Được đóng góp bởi Brett Cannon trong gh-115192.)

  • Việc xây dựng CPython hiện yêu cầu trình biên dịch có hỗ trợ thư viện nguyên tử C11, các hàm nguyên tử tích hợp sẵn GCC hoặc nội tại khóa liên động MSVC.

  • Hiện cần có Autoconf 2.71 và aclocal 1.16.5 để tạo lại tập lệnh configure. (Được đóng góp bởi Christian Heimes trong gh-89886 và bởi Victor Stinner trong gh-112090.)

  • Cần có SQLite 3.15.2 hoặc mới hơn để xây dựng mô-đun mở rộng sqlite3. (Được đóng góp bởi Erlend Aasland trong gh-105875.)

  • CPython hiện gói mimalloc library theo mặc định. Nó được cấp phép theo giấy phép MIT; xem mimalloc license. Mimalloc đi kèm có các thay đổi tùy chỉnh, xem gh-113141 để biết chi tiết. (Được đóng góp bởi Dino Viehland trong gh-109914.)

  • Tùy chọn configure --with-system-libmpdec hiện được mặc định là yes. Bản sao đi kèm của libmpdec sẽ bị xóa trong Python 3.16.

  • Python được xây dựng bằng configure --with-trace-refs (tài liệu tham khảo theo dõi) hiện tương thích với ABI với bản phát hành Python và debug build. (Được đóng góp bởi Victor Stinner trong gh-108634.)

  • Trên hệ thống POSIX, tên tệp pkg-config (.pc) hiện bao gồm các cờ ABI. Ví dụ: bản dựng theo luồng tự do tạo ra python-3.13t.pc và bản dựng gỡ lỗi tạo ra python-3.13d.pc.

  • Các tiện ích mở rộng errno, fcntl, grp, md5, pwd, resource, termios, winsound, _ctypes_test, _multiprocessing.posixshmem, _scproxy, _stat, _statistics, _testconsole, _testimportmultiple_uuid C hiện đã được xây dựng với limited C API. (Được đóng góp bởi Victor Stinner trong gh-85283.)

Chuyển sang Python 3.13

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

  • PEP 667 giới thiệu một số thay đổi về ngữ nghĩa của locals()f_locals:

    • Việc gọi locals() trong optimized scope hiện tạo ra một ảnh chụp nhanh độc lập trên mỗi cuộc gọi và do đó không còn cập nhật ngầm các tham chiếu được trả về trước đó nữa. Để có được hành vi CPython cũ hiện yêu cầu các lệnh gọi rõ ràng để cập nhật từ điển được trả về ban đầu với kết quả của các lệnh gọi tiếp theo tới locals(). Các hàm thực thi mã nhắm mục tiêu ngầm đến locals() (chẳng hạn như execeval) phải được chuyển qua một không gian tên rõ ràng để truy cập kết quả của chúng trong phạm vi được tối ưu hóa. (Đã thay đổi như một phần của PEP 667.)

    • Gọi locals() từ phần hiểu ở phạm vi mô-đun hoặc lớp (bao gồm thông qua exec hoặc eval) một lần nữa hoạt động như thể phần hiểu đang chạy như một hàm lồng nhau độc lập (tức là không bao gồm các biến cục bộ từ phạm vi chứa). Trong Python 3.12, điều này đã thay đổi để bao gồm các biến cục bộ từ phạm vi chứa khi triển khai PEP 709. (Đã thay đổi như một phần của PEP 667.)

    • Việc truy cập FrameType.f_locals trong optimized scope hiện trả về proxy ghi thay vì ảnh chụp nhanh được cập nhật vào những thời điểm không xác định. Nếu muốn có một ảnh chụp nhanh, nó phải được tạo một cách rõ ràng bằng dict hoặc phương thức .copy() của proxy. (Đã thay đổi như một phần của PEP 667.)

  • functools.partial hiện phát ra FutureWarning khi được sử dụng làm phương thức. Hành vi sẽ thay đổi trong các phiên bản Python trong tương lai. Gói nó trong staticmethod() nếu bạn muốn giữ nguyên hành vi cũ. (Được đóng góp bởi Serhiy Storchaka trong gh-121027.)

  • Một OSError hiện được getpass.getuser() đưa ra nếu không truy xuất được tên người dùng, thay vì ImportError trên nền tảng không phải Unix hoặc KeyError trên nền tảng Unix nơi cơ sở dữ liệu mật khẩu trống.

  • Giá trị của thuộc tính mode của gzip.GzipFile hiện là một chuỗi ('rb' hoặc 'wb') thay vì một số nguyên (1 hoặc 2). Giá trị của thuộc tính mode của đối tượng giống tệp có thể đọc được trả về bởi zipfile.ZipFile.open() hiện là 'rb' thay vì 'r'. (Được đóng góp bởi Serhiy Storchaka trong gh-115961.)

  • mailbox.Maildir hiện bỏ qua các tệp có dấu chấm ở đầu (.). (Được đóng góp bởi Zackery Spytz trong gh-65559.)

  • pathlib.Path.glob()rglob() hiện trả về cả tệp và thư mục nếu mẫu kết thúc bằng "**" được cung cấp, thay vì chỉ thư mục. Thêm dấu gạch chéo ở cuối để giữ nguyên hành vi trước đó và chỉ khớp các thư mục.

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

    Bất kỳ thư viện hoặc ứng dụng nào cung cấp mô-đun _thread tùy chỉnh đều phải cung cấp _is_main_interpreter(), giống như các thuộc tính "riêng tư" khác của mô-đun. (gh-112826.)

Những thay đổi trong C API

  • Python.h không còn bao gồm tiêu đề chuẩn <ieeefp.h> nữa. Nó được bao gồm cho chức năng finite() hiện được cung cấp bởi tiêu đề <math.h>. Bây giờ nó sẽ được đưa vào một cách rõ ràng nếu cần. Loại bỏ macro HAVE_IEEEFP_H. (Được đóng góp bởi Victor Stinner trong gh-108765.)

  • Python.h không còn bao gồm các tệp tiêu đề tiêu chuẩn sau: <time.h>, <sys/select.h><sys/time.h>. Nếu cần, bây giờ chúng sẽ được đưa vào một cách rõ ràng. Ví dụ: <time.h> cung cấp các hàm clock()gmtime(), <sys/select.h> cung cấp hàm select()<sys/time.h> cung cấp các hàm futimes(), gettimeofday()setitimer(). (Được đóng góp bởi Victor Stinner trong gh-108765.)

  • Trên Windows, Python.h không còn bao gồm tệp tiêu đề chuẩn <stddef.h> nữa. Nếu cần, bây giờ nó sẽ được đưa vào một cách rõ ràng. Ví dụ: nó cung cấp chức năng offsetof() và các loại size_tptrdiff_t. Tất cả các nền tảng khác đều cần bao gồm <stddef.h> một cách rõ ràng, macro HAVE_STDDEF_H chỉ được xác định trên Windows. (Được đóng góp bởi Victor Stinner trong gh-108765.)

  • Nếu macro Py_LIMITED_API được xác định thì các macro Py_BUILD_CORE, Py_BUILD_CORE_BUILTINPy_BUILD_CORE_MODULE hiện không được xác định bởi <Python.h>. (Được đóng góp bởi Victor Stinner trong gh-85283.)

  • Các macro thùng rác Py_TRASHCAN_SAFE_BEGINPy_TRASHCAN_SAFE_END cũ đã bị xó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 đó. Các macro mới đã được thêm vào Python 3.8 và các macro cũ không được dùng nữa trong Python 3.11. (Được đóng góp bởi Irit Katriel trong gh-105111.)

Thay đổi kiểm tra hồi quy

  • Python được xây dựng bằng configure --with-pydebug hiện hỗ trợ tùy chọn dòng lệnh -X presite=package.module. Nếu được sử dụng, nó sẽ chỉ định một mô-đun cần được nhập sớm trong vòng đời của trình thông dịch, trước khi site.py được thực thi. (Được đóng góp bởi Łukasz Langa trong gh-110769.)