Có gì mới trong Python 3.9

Biên tập viên:

Łukasz Langa

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

Xem thêm

PEP 596 - Lịch phát hành Python 3.9

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

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

  • PEP 584, toán tử liên minh được thêm vào dict;

  • PEP 585, gõ gợi ý generics trong bộ sưu tập tiêu chuẩn;

  • PEP 614, nới lỏng các hạn chế về ngữ pháp đối với trang trí.

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

  • PEP 616, các phương thức chuỗi để loại bỏ tiền tố và hậu tố.

Các tính năng mới trong thư viện tiêu chuẩn:

  • PEP 593, chức năng linh hoạt và chú thích thay đổi;

  • os.pidfd_open() được thêm vào cho phép quản lý quy trình mà không cần chủng tộc và tín hiệu.

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

  • PEP 573, truy cập nhanh vào trạng thái mô-đun từ các phương thức thuộc loại tiện ích mở rộng C;

  • PEP 617, CPython hiện sử dụng trình phân tích cú pháp mới dựa trên PEG;

  • một số nội dung Python (phạm vi, bộ dữ liệu, bộ, Frozenset, danh sách, dict) hiện được tăng tốc bằng cách sử dụng lệnh gọi vectơ PEP 590;

  • việc thu gom rác không chặn các đối tượng được phục hồi;

  • một số mô-đun Python (_abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, math, operator, resource, time, _weakref) hiện sử dụng khởi tạo nhiều pha như được xác định bởi PEP 489;

  • một số mô-đun thư viện tiêu chuẩn (audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios, zlib) hiện đang sử dụng ABI ổn định được xác định bởi PEP 384.

Các mô-đun thư viện mới:

  • PEP 615, Cơ sở dữ liệu múi giờ IANA hiện có trong thư viện chuẩn trong mô-đun zoneinfo;

  • việc triển khai loại biểu đồ tôpô hiện được cung cấp trong mô-đun graphlib mới.

Thay đổi quá trình phát hành:

  • PEP 602, CPython áp dụng chu kỳ phát hành hàng năm.

Bạn nên kiểm tra DeprecationWarning trong mã của mình

Khi Python 2.7 vẫn được hỗ trợ, rất nhiều chức năng trong Python 3 được giữ lại để tương thích ngược với Python 2.7. Khi ngừng hỗ trợ Python 2, các lớp tương thích ngược này đã bị xóa hoặc sẽ sớm bị xóa. Hầu hết trong số họ đều đưa ra cảnh báo DeprecationWarning trong vài năm. Ví dụ: sử dụng collections.Mapping thay vì collections.abc.Mapping sẽ phát ra DeprecationWarning kể từ Python 3.3, được phát hành vào năm 2012.

Kiểm tra ứng dụng của bạn bằng tùy chọn dòng lệnh -W default để xem DeprecationWarningPendingDeprecationWarning hoặc thậm chí với -W error để coi chúng là lỗi. Warnings Filter có thể được sử dụng để bỏ qua các cảnh báo từ mã của bên thứ ba.

Python 3.9 là phiên bản cuối cùng cung cấp các lớp tương thích ngược Python 2, để dành thêm thời gian cho những người bảo trì dự án Python sắp xếp việc loại bỏ hỗ trợ Python 2 và thêm hỗ trợ cho Python 3.9.

Bí danh cho Abstract Base Classes trong mô-đun collections, như bí danh collections.Mapping cho collections.abc.Mapping, được giữ lại cho lần phát hành cuối cùng để tương thích ngược. Chúng sẽ bị xóa khỏi Python 3.10.

Tổng quát hơn, hãy thử chạy thử nghiệm trong Python Development Mode để giúp chuẩn bị mã của bạn nhằm tương thích với phiên bản Python tiếp theo.

Lưu ý: một số điểm không được dùng nữa hiện có cũng đã bị xóa trong phiên bản Python này. Tham khảo phần Đã xóa.

Tính năng mới

Toán tử hợp nhất và cập nhật từ điển

Các toán tử hợp nhất (|) và cập nhật (|=) đã được thêm vào lớp dict tích hợp. Chúng bổ sung cho các phương pháp hợp nhất từ ​​điển dict.update{**d1, **d2} hiện có.

Ví dụ:

>>> x = {"key1": "value1 từ x", "key2": "value2 từ x"}
>>> y = {"key2": "value2 từ y", "key3": "value3 từ y"}
>>> x | y
{'key1': 'value1 từ x', 'key2': 'value2 từ y', 'key3': 'value3 từ y'}
>>> y | x
{'key2': 'value2 từ x', 'key3': 'value3 từ y', 'key1': 'value1 từ x'}

Xem PEP 584 để biết mô tả đầy đủ. (Được đóng góp bởi Brandt Bucher trong bpo-36144.)

Các phương thức chuỗi mới để loại bỏ tiền tố và hậu tố

str.removeprefix(prefix)str.removesuffix(suffix) đã được thêm vào để dễ dàng loại bỏ tiền tố hoặc hậu tố không cần thiết khỏi chuỗi. Các phương thức bytes, bytearraycollections.UserString tương ứng cũng đã được thêm vào. Xem PEP 616 để biết mô tả đầy đủ. (Được đóng góp bởi Dennis Sweeney trong bpo-39939.)

Nhập các Generic gợi ý trong Bộ sưu tập tiêu chuẩn

Trong chú thích loại, giờ đây bạn có thể sử dụng các loại bộ sưu tập tích hợp như listdict làm loại chung thay vì nhập các loại viết hoa tương ứng (ví dụ: List hoặc Dict) từ typing. Một số loại khác trong thư viện chuẩn hiện cũng là loại chung, ví dụ queue.Queue.

Ví dụ:

def hello_all(names: list[str]) -> Không :
    cho tên trong tên:
        print("Xin chào", tên)

Xem PEP 585 để biết thêm chi tiết. (Được đóng góp bởi Guido van Rossum, Ethan Smith và Batuhan Taşkaya trong bpo-39481.)

Trình phân tích cú pháp mới

Python 3.9 sử dụng trình phân tích cú pháp mới, dựa trên PEG thay vì LL(1). Hiệu suất của trình phân tích cú pháp mới gần tương đương với hiệu suất của trình phân tích cú pháp cũ, nhưng hình thức PEG linh hoạt hơn LL(1) khi thiết kế các tính năng ngôn ngữ mới. Chúng ta sẽ bắt đầu sử dụng tính linh hoạt này trong Python 3.10 trở lên.

Mô-đun ast sử dụng trình phân tích cú pháp mới và tạo ra AST giống như trình phân tích cú pháp cũ.

Trong Python 3.10, trình phân tích cú pháp cũ sẽ bị xóa và tất cả chức năng phụ thuộc vào nó cũng vậy (chủ yếu là mô-đun parser, mô-đun này đã không được dùng nữa từ lâu). Trong Python 3.9 only, bạn có thể chuyển về trình phân tích cú pháp LL(1) bằng cách sử dụng công tắc dòng lệnh (-X oldparser) hoặc biến môi trường (PYTHONOLDPARSER=1).

Xem PEP 617 để biết thêm chi tiết. (Được đóng góp bởi Guido van Rossum, Pablo Galindo và Lysandros Nikolaou trong bpo-40334.)

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

  • __import__() hiện tăng ImportError thay vì ValueError, điều này thường xảy ra khi quá trình nhập tương đối vượt quá gói cấp cao nhất của nó. (Được đóng góp bởi Ngalim Siregar trong bpo-37444.)

  • Python hiện có đường dẫn tuyệt đối của tên tệp tập lệnh được chỉ định trên dòng lệnh (ví dụ: python3 script.py): thuộc tính __file__ của mô-đun __main__ đã trở thành đường dẫn tuyệt đối, thay vì đường dẫn tương đối. Các đường dẫn này hiện vẫn hợp lệ sau khi thư mục hiện tại bị os.chdir() thay đổi. Là một tác dụng phụ, truy nguyên cũng hiển thị đường dẫn tuyệt đối cho các khung mô-đun __main__ trong trường hợp này. (Được đóng góp bởi Victor Stinner trong bpo-20443.)

  • Trong Python Development Modedebug build, các đối số encodingerrors hiện được kiểm tra cho các hoạt động mã hóa và giải mã chuỗi. Ví dụ: open(), str.encode()bytes.decode().

    Theo mặc định, để có hiệu suất tốt nhất, đối số errors chỉ được kiểm tra ở lỗi mã hóa/giải mã đầu tiên và đối số encoding đôi khi bị bỏ qua đối với các chuỗi trống. (Được đóng góp bởi Victor Stinner trong bpo-37388.)

  • "".replace("", s, n) hiện trả về s thay vì một chuỗi trống cho tất cả n khác 0. Bây giờ nó phù hợp với "".replace("", s). Có những thay đổi tương tự đối với các đối tượng bytesbytearray. (Được đóng góp bởi Serhiy Storchaka trong bpo-28029.)

  • Bây giờ, bất kỳ biểu thức hợp lệ nào cũng có thể được sử dụng làm decorator. Trước đây, ngữ pháp còn hạn chế hơn nhiều. Xem PEP 614 để biết chi tiết. (Được đóng góp bởi Brandt Bucher trong bpo-39702.)

  • Cải thiện trợ giúp cho mô-đun typing. Chuỗi tài liệu hiện được hiển thị cho tất cả các biểu mẫu đặc biệt và bí danh chung đặc biệt (như UnionList). Sử dụng help() với bí danh chung như List[int] sẽ hiển thị trợ giúp cho loại cụ thể tương ứng (list trong trường hợp này). (Được đóng góp bởi Serhiy Storchaka trong bpo-40257.)

  • Việc chạy song song aclose() / asend() / athrow() hiện bị cấm và ag_running hiện phản ánh trạng thái chạy thực tế của trình tạo không đồng bộ. (Được đóng góp bởi Yury Selivanov trong bpo-30773.)

  • Các lỗi không mong muốn khi gọi phương thức __iter__ không còn được TypeError che dấu trong toán tử in và các hàm contains(), indexOf()countOf() của mô-đun operator. (Được đóng góp bởi Serhiy Storchaka trong bpo-40824.)

  • Các biểu thức lambda không được đóng ngoặc đơn không còn có thể là phần biểu thức trong mệnh đề if trong phần hiểu và biểu thức trình tạo. Xem bpo-41848bpo-43755 để biết chi tiết.

Mô-đun mới

thông tin khu vực

Mô-đun zoneinfo mang đến sự hỗ trợ cho cơ sở dữ liệu múi giờ IANA cho thư viện chuẩn. Nó bổ sung zoneinfo.ZoneInfo, một triển khai datetime.tzinfo cụ thể được hỗ trợ bởi dữ liệu múi giờ của hệ thống.

Ví dụ:

>>> từ nhập Zoneinfo ZoneInfo
>>> nhập ngày giờ dưới dạng dt

>>> # Daylight tiết kiệm thời gian
>>> khi = dt.datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> in (khi nào)
2020-10-31 12:00:00-07:00
>>> khi.tzname()
'PDT'

>>> thời gian # Standard
>>> khi += dt.timedelta(ngày=7)
>>> in (khi nào)
2020-11-07 12:00:00-08:00
>>> in(when.tzname())
PST

Là nguồn dữ liệu dự phòng cho các nền tảng không gửi cơ sở dữ liệu IANA, mô-đun tzdata được phát hành dưới dạng gói của bên thứ nhất -- được phân phối qua PyPI và được duy trì bởi nhóm nòng cốt CPython.

Xem thêm

PEP 615 -- Hỗ trợ cơ sở dữ liệu múi giờ IANA trong Thư viện chuẩn

PEP được viết và triển khai bởi Paul Ganssle

đồ họa

Một mô-đun mới, graphlib, đã được thêm vào có chứa lớp graphlib.TopologicalSorter để cung cấp chức năng thực hiện sắp xếp đồ thị theo cấu trúc liên kết. (Được đóng góp bởi Pablo Galindo, Tim Peters và Larry Hastings trong bpo-17005.)

Mô-đun cải tiến

ast

Đã thêm tùy chọn indent vào dump(), cho phép nó tạo ra đầu ra thụt lề nhiều dòng. (Được đóng góp bởi Serhiy Storchaka trong bpo-37995.)

Đã thêm ast.unparse() dưới dạng một hàm trong mô-đun ast có thể được sử dụng để phân tích cú pháp đối tượng ast.AST và tạo ra một chuỗi có mã sẽ tạo ra đối tượng ast.AST tương đương khi được phân tích cú pháp. (Được đóng góp bởi Pablo Galindo và Batuhan Taskaya trong bpo-38870.)

Đã thêm chuỗi tài liệu vào các nút AST có chứa chữ ký ASDL được sử dụng để xây dựng nút đó. (Được đóng góp bởi Batuhan Taskaya trong bpo-39638.)

asyncio

Do những lo ngại đáng kể về bảo mật, tham số reuse_address của asyncio.loop.create_datagram_endpoint() không còn được hỗ trợ. Điều này là do hoạt động của tùy chọn ổ cắm SO_REUSEADDR trong UDP. Để biết thêm chi tiết, hãy xem tài liệu về loop.create_datagram_endpoint(). (Được đóng góp bởi Kyle Stanley, Antoine Pitrou và Yury Selivanov trong bpo-37228.)

Đã thêm một coroutine shutdown_default_executor() mới lên lịch tắt cho trình thực thi mặc định chờ trên ThreadPoolExecutor đóng xong. Ngoài ra, asyncio.run() đã được cập nhật để sử dụng coroutine mới. (Được đóng góp bởi Kyle Stanley trong bpo-34037.)

Đã thêm asyncio.PidfdChildWatcher, một triển khai trình theo dõi trẻ em dành riêng cho Linux để thăm dò các bộ mô tả tệp xử lý. (bpo-38692)

Đã thêm một coroutine asyncio.to_thread() mới. Nó chủ yếu được sử dụng để chạy các hàm liên kết IO trong một luồng riêng biệt nhằm tránh chặn vòng lặp sự kiện và về cơ bản hoạt động như một phiên bản cấp cao của run_in_executor() có thể trực tiếp lấy các đối số từ khóa. (Được đóng góp bởi Kyle Stanley và Yury Selivanov trong bpo-32309.)

Khi hủy tác vụ do hết thời gian chờ, asyncio.wait_for() giờ đây sẽ đợi cho đến khi quá trình hủy hoàn tất cũng trong trường hợp timeout <= 0, giống như với thời gian chờ tích cực. (Được đóng góp bởi Elvis Pranskevichus trong bpo-32751.)

asyncio hiện tăng TypeError khi gọi các phương thức không tương thích bằng ổ cắm ssl.SSLSocket. (Được đóng góp bởi Ido Michael trong bpo-37404.)

biên soạn tất cả

Đã thêm khả năng mới để sử dụng liên kết cứng cho các tệp .pyc trùng lặp: tham số hardlink_dupes và tùy chọn dòng lệnh --hardlink-dupes. (Được đóng góp bởi Lumír 'Frenzy' Balhar trong bpo-40495.)

Đã thêm các tùy chọn mới để thao tác đường dẫn trong các tệp .pyc kết quả: tham số stripdir, prependdir, limit_sl_dest và các tùy chọn dòng lệnh -s, -p, -e. Đã thêm khả năng chỉ định tùy chọn cho mức tối ưu hóa nhiều lần. (Được đóng góp bởi Lumír 'Frenzy' Balhar trong bpo-38112.)

đồng thời.futures

Đã thêm tham số cancel_futures mới vào concurrent.futures.Executor.shutdown() để hủy tất cả các hợp đồng tương lai đang chờ xử lý chưa bắt đầu chạy, thay vì đợi chúng hoàn thành trước khi tắt trình thực thi. (Được đóng góp bởi Kyle Stanley trong bpo-39349.)

Đã xóa chủ đề daemon khỏi ThreadPoolExecutorProcessPoolExecutor. Điều này cải thiện khả năng tương thích với các trình thông dịch phụ và khả năng dự đoán trong quá trình tắt máy của chúng. (Được đóng góp bởi Kyle Stanley trong bpo-39812.)

Công nhân trong ProcessPoolExecutor hiện được sinh ra theo yêu cầu, chỉ khi không còn công nhân nhàn rỗi nào để sử dụng lại. Điều này tối ưu hóa chi phí khởi động và giảm lượng thời gian CPU bị mất đối với những người lao động nhàn rỗi. (Được đóng góp bởi Kyle Stanley trong bpo-39207.)

chửi rủa

Đã thêm các chức năng curses.get_escdelay(), curses.set_escdelay(), curses.get_tabsize()curses.set_tabsize(). (Được đóng góp bởi Anthony Sottile trong bpo-38312.)

ngày giờ

Phương thức isocalendar() của datetime.dateisocalendar() của datetime.datetime hiện trả về namedtuple() thay vì tuple. (Được đóng góp bởi Donghee Na trong bpo-24416.)

nước cất

Lệnh upload hiện tạo các bản tóm tắt băm SHA2-256 và Blake2b-256. Nó bỏ qua MD5 trên các nền tảng chặn thông báo MD5. (Được đóng góp bởi Christian Heimes trong bpo-40698.)

fcntl

Đã thêm các hằng số fcntl.F_OFD_GETLK, fcntl.F_OFD_SETLKfcntl.F_OFD_SETLKW. (Được đóng góp bởi Donghee Na trong bpo-38602.)

ftplib

FTPFTP_TLS hiện tăng ValueError nếu thời gian chờ nhất định cho hàm tạo của chúng bằng 0 để ngăn việc tạo ổ cắm không chặn. (Được đóng góp bởi Donghee Na trong bpo-39259.)

gc

Khi trình thu gom rác tạo một bộ sưu tập trong đó một số đối tượng phục hồi (chúng có thể truy cập được từ bên ngoài các chu trình bị cô lập sau khi trình hoàn thiện được thực thi), không chặn bộ sưu tập tất cả các đối tượng vẫn không thể truy cập được. (Được đóng góp bởi Pablo Galindo và Tim Peters trong bpo-38379.)

Đã thêm chức năng mới gc.is_finalized() để kiểm tra xem một đối tượng đã được trình thu gom rác hoàn thiện hay chưa. (Được đóng góp bởi Pablo Galindo trong bpo-39322.)

hàm băm

Mô-đun hashlib hiện có thể sử dụng hàm băm SHA3 và SHAKE XOF từ OpenSSL khi khả dụng. (Được đóng góp bởi Christian Heimes trong bpo-37630.)

Các mô-đun băm tích hợp hiện có thể bị tắt bằng ./configure --without-builtin-hashlib-hashes hoặc được bật có chọn lọc bằng ví dụ: ./configure --with-builtin-hashlib-hashes=sha3,blake2 để buộc sử dụng triển khai dựa trên OpenSSL. (Được đóng góp bởi Christian Heimes trong bpo-40479)

http

Mã trạng thái HTTP 103 EARLY_HINTS, 418 IM_A_TEAPOT425 TOO_EARLY được thêm vào http.HTTPStatus. (Được đóng góp bởi Donghee Na trong bpo-39509 và Ross Rhodes trong bpo-39507.)

IDLE và nhàn rỗi

Đã thêm tùy chọn để tắt nhấp nháy con trỏ. (Được đóng góp bởi Zackery Spytz trong bpo-4603.)

Phím thoát bây giờ sẽ đóng cửa sổ hoàn thành IDLE. (Được đóng góp bởi Johnny Najera trong bpo-38944.)

Đã thêm từ khóa vào danh sách hoàn thành tên mô-đun. (Được đóng góp bởi Terry J. Reedy trong bpo-37765.)

Tính năng mới trong bản phát hành bảo trì 3.9

Làm cho IDLE gọi sys.excepthook() (khi bắt đầu mà không có '-n'). Móc người dùng trước đây đã bị bỏ qua. (Được đóng góp bởi Ken Hilton trong bpo-43008.)

Những thay đổi ở trên đã được đưa vào bản phát hành bảo trì 3.8.

Sắp xếp lại hộp thoại cài đặt. Chia tab General thành tab Windows và Shell/Ed. Di chuyển các nguồn trợ giúp mở rộng menu Trợ giúp sang tab Tiện ích mở rộng. Tạo khoảng trống cho các tùy chọn mới và rút ngắn hộp thoại. Cái sau làm cho hộp thoại phù hợp hơn với màn hình nhỏ. (Được đóng góp bởi Terry Jan Reedy trong bpo-40468.) Di chuyển cài đặt khoảng cách thụt lề từ tab Phông chữ sang tab Windows mới. (Được đóng góp bởi Mark Roseman và Terry Jan Reedy trong bpo-33962.)

Á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.)

imaplib

IMAP4IMAP4_SSL hiện có tham số timeout tùy chọn cho hàm tạo của chúng. Ngoài ra, phương thức open() hiện có tham số timeout tùy chọn với thay đổi này. Các phương thức ghi đè của IMAP4_SSLIMAP4_stream đã được áp dụng cho thay đổi này. (Được đóng góp bởi Donghee Na trong bpo-38615.)

imaplib.IMAP4.unselect() được thêm vào. imaplib.IMAP4.unselect() giải phóng tài nguyên của máy chủ được liên kết với hộp thư đã chọn và đưa máy chủ về trạng thái xác thực. Lệnh này thực hiện các hành động tương tự như imaplib.IMAP4.close(), ngoại trừ việc không có thư nào bị xóa vĩnh viễn khỏi hộp thư hiện được chọn. (Được đóng góp bởi Donghee Na trong bpo-40375.)

nhập khẩu

Để cải thiện tính nhất quán với các câu lệnh nhập, importlib.util.resolve_name() hiện tăng ImportError thay vì ValueError cho các lần nhập tương đối không hợp lệ. (Được đóng góp bởi Ngalim Siregar trong bpo-37444.)

Trình tải nhập xuất bản các đối tượng mô-đun bất biến giờ đây có thể xuất bản các gói bất biến ngoài các mô-đun riêng lẻ. (Được đóng góp bởi Dino Viehland trong bpo-39336.)

Đã thêm chức năng importlib.resources.files() với sự hỗ trợ cho các thư mục con trong dữ liệu gói, khớp ngược trong phiên bản importlib_resources 1.5. (Được đóng góp bởi Jason R. Coombs trong bpo-39791.)

importlib.metadata được làm mới từ importlib_metadata phiên bản 1.6.1.

kiểm tra

inspect.BoundArguments.arguments được thay đổi từ OrderedDict thành dict thông thường. (Được đóng góp bởi Inada Naoki trong bpo-36350bpo-39775.)

váy ipad

ipaddress hiện hỗ trợ Địa chỉ có phạm vi IPv6 (địa chỉ IPv6 có hậu tố %<scope_id>).

Địa chỉ IPv6 có phạm vi có thể được phân tích cú pháp bằng ipaddress.IPv6Address. Nếu có, ID vùng phạm vi sẽ có sẵn thông qua thuộc tính scope_id. (Được đóng góp bởi Oleksandr Pavliuk trong bpo-34788.)

Bắt đầu với Python 3.9.5, mô-đun ipaddress không còn chấp nhận bất kỳ số 0 đứng đầu nào trong chuỗi địa chỉ IPv4. (Được đóng góp bởi Christian Heimes trong bpo-36384).

môn toán

Đã mở rộng hàm math.gcd() để xử lý nhiều đối số. Trước đây, nó chỉ hỗ trợ hai đối số. (Được đóng góp bởi Serhiy Storchaka trong bpo-39648.)

Đã thêm math.lcm(): trả về bội số chung nhỏ nhất của các đối số được chỉ định. (Được đóng góp bởi Mark Dickinson, Ananthakrishnan và Serhiy Storchaka trong bpo-39479bpo-39648.)

Đã thêm math.nextafter(): trả về giá trị dấu phẩy động tiếp theo sau x về phía y. (Được đóng góp bởi Victor Stinner trong bpo-39288.)

Đã thêm math.ulp(): trả về giá trị của bit ít quan trọng nhất của số float. (Được đóng góp bởi Victor Stinner trong bpo-39310.)

đa xử lý

Lớp multiprocessing.SimpleQueue có phương thức close() mới để đóng hàng đợi một cách rõ ràng. (Được đóng góp bởi Victor Stinner trong bpo-30966.)

nntplib

NNTPNNTP_SSL hiện tăng ValueError nếu thời gian chờ nhất định cho hàm tạo của chúng bằng 0 để ngăn việc tạo ổ cắm không chặn. (Được đóng góp bởi Donghee Na trong bpo-39259.)

hệ điều hành

Đã thêm CLD_KILLEDCLD_STOPPED cho si_code. (Được đóng góp bởi Donghee Na trong bpo-38493.)

Hiển thị os.pidfd_open() (bpo-38692) và os.P_PIDFD (bpo-38713) dành riêng cho Linux để quản lý quy trình bằng bộ mô tả tệp.

Chức năng os.unsetenv() hiện cũng có sẵn trên Windows. (Được đóng góp bởi Victor Stinner trong bpo-39413.)

Các chức năng os.putenv()os.unsetenv() hiện luôn có sẵn. (Được đóng góp bởi Victor Stinner trong bpo-39395.)

Đã thêm chức năng os.waitstatus_to_exitcode(): chuyển đổi trạng thái chờ thành mã thoát. (Được đóng góp bởi Victor Stinner trong bpo-40094.)

đường dẫn

Đã thêm pathlib.Path.readlink() hoạt động tương tự như os.readlink(). (Được đóng góp bởi Girts Folkmanis trong bpo-30618)

pdb

Trên Windows hiện nay Pdb hỗ trợ ~/.pdbrc. (Được đóng góp bởi Tim Hopper và Dan Lidral-Porter trong bpo-20523.)

poplib

POP3POP3_SSL hiện tăng ValueError nếu thời gian chờ nhất định cho hàm tạo của chúng bằng 0 để ngăn việc tạo ổ cắm không chặn. (Được đóng góp bởi Donghee Na trong bpo-39259.)

in ấn

pprint hiện có thể in types.SimpleNamespace đẹp. (Được đóng góp bởi Carl Bordum Hansen trong bpo-37376.)

pydoc

Chuỗi tài liệu hiện không chỉ được hiển thị cho lớp, hàm, phương thức, v.v. mà còn cho bất kỳ đối tượng nào có thuộc tính __doc__ của riêng nó. (Được đóng góp bởi Serhiy Storchaka trong bpo-40257.)

ngẫu nhiên

Đã thêm phương thức random.Random.randbytes() mới: tạo byte ngẫu nhiên. (Được đóng góp bởi Victor Stinner trong bpo-40286.)

tín hiệu

Hiển thị signal.pidfd_send_signal() dành riêng cho Linux để gửi tín hiệu đến một quy trình bằng cách sử dụng bộ mô tả tệp thay vì pid. (bpo-38712)

smtplib

SMTPSMTP_SSL hiện tăng ValueError nếu thời gian chờ nhất định cho hàm tạo của chúng bằng 0 để ngăn việc tạo ổ cắm không chặn. (Được đóng góp bởi Donghee Na trong bpo-39259.)

Hàm tạo LMTP hiện có tham số timeout tùy chọn. (Được đóng góp bởi Donghee Na trong bpo-39329.)

ổ cắm

Mô-đun socket hiện xuất hằng số CAN_RAW_JOIN_FILTERS trên Linux 4.1 trở lên. (Được đóng góp bởi Stefan Tatschner và Zuckery Spytz trong bpo-25780.)

Mô-đun ổ cắm hiện hỗ trợ giao thức CAN_J1939 trên các nền tảng hỗ trợ nó. (Được đóng góp bởi Karl Ding trong bpo-40291.)

Mô-đun ổ cắm hiện có chức năng socket.send_fds()socket.recv_fds(). (Được đóng góp bởi Joannah Nanjekye, Shinya Okano và Victor Stinner trong bpo-28724.)

thời gian

Trên AIX, thread_time() hiện được triển khai với thread_cputime() có độ phân giải nano giây, thay vì clock_gettime(CLOCK_THREAD_CPUTIME_ID) có độ phân giải 10 mili giây. (Được đóng góp bởi Batuhan Taskaya trong bpo-40192)

hệ thống

Đã thêm thuộc tính sys.platlibdir mới: tên của thư mục thư viện dành riêng cho nền tảng. Nó được sử dụng để xây dựng đường dẫn của thư viện tiêu chuẩn và đường dẫn của các mô-đun mở rộng đã cài đặt. Nó tương đương với "lib" trên hầu hết các nền tảng. Trên Fedora và SuSE, nó bằng "lib64" trên nền tảng 64-bit. (Được đóng góp bởi Jan Matějek, Matěj Cepl, Charalampos Stratakis và Victor Stinner trong bpo-1294959.)

Trước đây, sys.stderr bị chặn vào bộ đệm khi không tương tác. Bây giờ stderr mặc định luôn được lưu vào bộ đệm dòng. (Được đóng góp bởi Jendrik Seipp trong bpo-13601.)

dấu vết

Đã thêm tracemalloc.reset_peak() để đặt kích thước tối đa của các khối bộ nhớ được theo dõi thành kích thước hiện tại, để đo mức cao nhất của các đoạn mã cụ thể. (Được đóng góp bởi Huon Wilson trong bpo-40630.)

đánh máy

PEP 593 đã giới thiệu loại typing.Annotated để trang trí các loại hiện có bằng siêu dữ liệu theo ngữ cảnh cụ thể và tham số include_extras mới cho typing.get_type_hints() để truy cập siêu dữ liệu khi chạy. (Được đóng góp bởi Till Varoquaux và Konstantin Kashin.)

dữ liệu unicode

Cơ sở dữ liệu Unicode đã được cập nhật lên phiên bản 13.0.0. (bpo-39926).

venv

Các tập lệnh kích hoạt do venv cung cấp hiện đều chỉ định tùy chỉnh lời nhắc của chúng một cách nhất quán bằng cách luôn sử dụng giá trị do __VENV_PROMPT__ chỉ định. Trước đây, một số tập lệnh sử dụng __VENV_PROMPT__ một cách vô điều kiện, một số tập lệnh khác chỉ sử dụng nếu nó tình cờ được đặt (đó là trường hợp mặc định) và thay vào đó, một tập lệnh sử dụng __VENV_NAME__. (Được đóng góp bởi Brett Cannon trong bpo-37663.)

xml

Các ký tự khoảng trắng trong thuộc tính hiện được giữ nguyên khi tuần tự hóa tệp xml.etree.ElementTree thành tệp XML. EOLN không còn được chuẩn hóa thành "n". Đây là kết quả của cuộc thảo luận về cách diễn giải phần 2.11 của thông số XML. (Được đóng góp bởi Mefistotelis trong bpo-39011.)

Tối ưu hóa

  • Đã tối ưu hóa thành ngữ để gán một biến tạm thời trong mức độ hiểu. Giờ đây, việc hiểu for y in [expr] nhanh như một bài tập đơn giản y = expr. Ví dụ:

    tổng = [s cho s trong [0] cho x trong dữ liệu cho s trong [s + x]]

    Không giống như toán tử :=, thành ngữ này không rò rỉ một biến ra phạm vi bên ngoài.

    (Được đóng góp bởi Serhiy Storchaka trong bpo-32856.)

  • Xử lý tín hiệu được tối ưu hóa trong các ứng dụng đa luồng. Nếu một luồng khác với luồng chính nhận được tín hiệu, vòng đánh giá mã byte sẽ không còn bị gián đoạn ở mỗi lệnh mã byte để kiểm tra các tín hiệu đang chờ xử lý không thể xử lý được. Chỉ luồng chính của trình thông dịch chính mới có thể xử lý tín hiệu.

    Trước đây, vòng đánh giá mã byte bị gián đoạn ở mỗi lệnh cho đến khi luồng chính xử lý tín hiệu. (Được đóng góp bởi Victor Stinner trong bpo-40010.)

  • Tối ưu hóa mô-đun subprocess trên FreeBSD bằng closefrom(). (Được đóng góp bởi Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak và Victor Stinner trong bpo-38061.)

  • PyLong_FromDouble() hiện nhanh hơn tới 1,87 lần đối với các giá trị phù hợp với long. (Được đóng góp bởi Sergey Fedoseev trong bpo-37986.)

  • Một số nội dung Python (range, tuple, set, frozenset, list, dict) hiện được tăng tốc bằng cách sử dụng giao thức vectorcall PEP 590. (Được đóng góp bởi Donghee Na, Mark Shannon, Jeroen Demeyer và Petr Viktorin trong bpo-37207.)

  • Tối ưu hóa set.difference_update() cho trường hợp bộ kia lớn hơn nhiều so với bộ cơ sở. (Được đề xuất bởi Evgeny Kapun với mã do Michele Orrù đóng góp trong bpo-8425.)

  • Bộ cấp phát đối tượng nhỏ của Python (obmalloc.c) hiện cho phép (không quá) một trường trống có sẵn để tái sử dụng ngay lập tức mà không cần trả lại nó cho HĐH. Điều này ngăn chặn việc đập vào các vòng lặp đơn giản trong đó một đấu trường có thể được tạo và phá hủy một lần nữa trên mỗi lần lặp. (Được đóng góp bởi Tim Peters trong bpo-37257.)

  • floor division của hoạt động float hiện có hiệu suất tốt hơn. Ngoài ra, thông báo của ZeroDivisionError cho thao tác này cũng được cập nhật. (Được đóng góp bởi Donghee Na trong bpo-39434.)

  • Giải mã các chuỗi ASCII ngắn bằng codec UTF-8 và ascii hiện nhanh hơn khoảng 15%. (Được đóng góp bởi Inada Naoki trong bpo-37348.)

Dưới đây là bản tóm tắt các cải tiến hiệu suất từ Python 3.4 đến Python 3.9:

Phiên bản Python 3,4 3,5 3,6 3,7 3,8 3,9
-------------- --- --- --- --- --- ---

Quyền truy cập đọc biến và thuộc tính:
    read_local 7,1 7,1 5,4 5,1 3,9 3,9
    read_nonlocal 7,1 8,1 5,8 5,4 4,4 4,5
    read_global 15,5 19,0 14,3 13,6 7,6 7,8
    read_buildin 21,1 21,6 18,5 19,0 7,5 7,8
    read_classvar_from_class 25,6 26,5 20,7 19,5 18,4 17,9
    read_classvar_from_instance 22,8 23,5 18,8 17,1 16,4 16,9
    read_instancevar 32,4 33,1 28,0 26,3 25,4 25,3
    read_instancevar_slots 27,8 31,3 20,8 20,8 20,2 20,5
    read_namedtuple 73,8 57,5 45,0 46,8 18,4 18,7
    phương thức read_bound 37,6 37,9 29,6 26,9 27,7 41,1

Quyền truy cập ghi biến và thuộc tính:
    write_local 8,7 9,3 5,5 5,3 4,3 4,3
    write_nonlocal 10,5 11,1 5,6 5,5 4,7 4,8
    write_global 19,7 21,2 18,0 18,0 15,8 16,7
    write_classvar 92,9 96,0 104,6 102,1 39,2 39,8
    write_instancevar 44,6 45,8 40,0 38,9 35,5 37,4
    write_instancevar_slots 35,6 36,1 27,3 26,6 25,7 25,8

Truy cập đọc cấu trúc dữ liệu:
    danh sách đọc 24,2 24,5 20,8 20,8 19,0 19,5
    read_deque 24,7 25,5 20,2 20,6 19,8 20,2
    read_dict 24,3 25,7 22,3 23,0 21,0 22,4
    read_strdict 22,6 24,3 19,5 21,2 18,9 21,5

Quyền truy cập ghi cấu trúc dữ liệu:
    write_list 27,1 28,5 22,5 21,6 20,0 20,0
    write_deque 28,7 30,1 22,7 21,8 23,5 21,7
    write_dict 31,4 33,3 29,3 29,2 24,7 25,4
    write_strdict 28,4 29,9 27,5 25,2 23,1 24,5

Hoạt động ngăn xếp (hoặc hàng đợi):
    list_append_pop 93,4 112,7 75,4 74,2 50,8 50,6
    deque_append_pop 43,5 57,0 49,4 49,2 42,5 44,2
    deque_append_popleft 43,7 57,3 49,7 49,7 42,8 46,4

Vòng lặp thời gian:
    loop_overhead 0,5 0,6 0,4 0,3 0,3 0,3

Những kết quả này được tạo từ tập lệnh điểm chuẩn truy cập có thể thay đổi tại: Tools/scripts/var_access_benchmark.py. Tập lệnh điểm chuẩn hiển thị thời gian tính bằng nano giây. Điểm chuẩn được đo trên Intel® Core™ i7-4960HQ processor chạy bản dựng macOS 64-bit có tại python.org.

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

  • Lệnh distutils bdist_msi hiện không được dùng nữa, 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-39586.)

  • Hiện tại math.factorial() chấp nhận các phiên bản float có giá trị nguyên không âm (như 5.0). Nó tăng ValueError cho các số float không nguyên và âm. Bây giờ nó không còn được dùng nữa. Trong các phiên bản Python trong tương lai, nó sẽ tăng TypeError cho tất cả các số float. (Được đóng góp bởi Serhiy Storchaka trong bpo-37315.)

  • Các mô-đun parsersymbol không được dùng nữa và sẽ bị xóa trong các phiên bản Python sau này. Đối với phần lớn các trường hợp sử dụng, người dùng có thể tận dụng giai đoạn tạo và biên dịch Cây cú pháp trừu tượng (AST) bằng cách sử dụng mô-đun ast.

  • Các hàm Public C API PyParser_SimpleParseStringFlags(), PyParser_SimpleParseStringFlagsFilename(), PyParser_SimpleParseFileFlags()PyNode_Compile() không được dùng nữa và sẽ bị xóa trong Python 3.10 cùng với trình phân tích cú pháp cũ.

  • Việc sử dụng NotImplemented trong ngữ cảnh boolean không được dùng nữa vì nó hầu như chỉ là kết quả của việc triển khai bộ so sánh phong phú không chính xác. Nó sẽ được tạo thành TypeError trong phiên bản Python trong tương lai. (Được đóng góp bởi Josh Rosenberg trong bpo-35712.)

  • Mô-đun random hiện chấp nhận bất kỳ loại có thể băm nào làm giá trị hạt giống có thể có. Thật không may, một số loại đó không được đảm bảo có giá trị băm xác định. Sau Python 3.9, mô-đun sẽ giới hạn hạt giống của nó ở None, int, float, str, bytesbytearray.

  • Việc mở tệp GzipFile để ghi mà không chỉ định đối số mode không được dùng nữa. Trong các phiên bản Python sau này, nó sẽ luôn được mở để đọc theo mặc định. Chỉ định đối số mode để mở nó để viết và tắt tiếng cảnh báo. (Được đóng góp bởi Serhiy Storchaka trong bpo-28286.)

  • Không dùng nữa phương thức split() của _tkinter.TkappType mà thay vào đó là phương thức splitlist() có hành vi nhất quán và dễ đoán hơn. (Được đóng góp bởi Serhiy Storchaka trong bpo-38371.)

  • Việc chuyển rõ ràng các đối tượng coroutine sang asyncio.wait() không còn được dùng nữa và sẽ bị xóa trong phiên bản 3.11. (Được đóng góp bởi Yury Selivanov và Kyle Stanley trong bpo-34790.)

  • Các tiêu chuẩn binhex4 và hexbin4 hiện không còn được dùng nữa. Mô-đun binhex và các chức năng binascii sau hiện không được dùng nữa:

    • b2a_hqx(), a2b_hqx()

    • rlecode_hqx(), rledecode_hqx()

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

  • Các lớp ast slice, IndexExtSlice được coi là không được dùng nữa và sẽ bị xóa trong các phiên bản Python trong tương lai. Bản thân value nên được sử dụng thay vì Index(value). Tuple(slices, Load()) nên được sử dụng thay vì ExtSlice(slices). (Được đóng góp bởi Serhiy Storchaka trong bpo-34822.)

  • Các lớp ast Suite, Param, AugLoadAugStore được coi là không dùng nữa và sẽ bị xóa trong các phiên bản Python trong tương lai. Chúng không được trình phân tích cú pháp tạo ra và không được trình tạo mã chấp nhận trong Python 3. (Được đóng góp bởi Batuhan Taskaya trong bpo-39639bpo-39969 và Serhiy Storchaka trong bpo-39988.)

  • Các hàm PyEval_InitThreads()PyEval_ThreadsInitialized() hiện không được dùng nữa và sẽ bị xóa trong Python 3.11. Gọi PyEval_InitThreads() bây giờ không có tác dụng gì. Zz003zz được khởi tạo bởi Py_Initialize() kể từ Python 3.7. (Được đóng góp bởi Victor Stinner trong bpo-39877.)

  • Việc truyền None làm đối số đầu tiên cho hàm shlex.split() đã không còn được dùng nữa. (Được đóng góp bởi Zackery Spytz trong bpo-33262.)

  • smtpd.MailmanProxy() hiện không được dùng nữa vì không thể sử dụng được nếu không có mô-đun bên ngoài, mailman. (Được đóng góp bởi Samuel Colvin trong bpo-35800.)

  • Mô-đun lib2to3 hiện phát ra PendingDeprecationWarning. Python 3.9 đã chuyển sang trình phân tích cú pháp PEG (xem PEP 617) và Python 3.10 có thể bao gồm cú pháp ngôn ngữ mới mà trình phân tích cú pháp LL(1) của lib2to3 không thể phân tích cú pháp. Mô-đun lib2to3 có thể bị xóa khỏi thư viện chuẩn trong phiên bản Python trong tương lai. Hãy xem xét các lựa chọn thay thế của bên thứ ba như LibCST hoặc parso. (Được đóng góp bởi Carl Meyer trong bpo-40360.)

  • Tham số random của random.shuffle() không còn được dùng nữa. (Được đóng góp bởi Raymond Hettinger trong bpo-40465)

Đã xóa

  • Phiên bản lỗi tại unittest.mock.__version__ đã bị xóa.

  • nntplib.NNTP: Phương thức xpath()xgtitle() đã bị xóa. Các phương thức này không được dùng nữa kể từ Python 3.3. Nói chung, các tiện ích mở rộng này không được quản trị viên máy chủ NNTP hỗ trợ hoặc không kích hoạt. Đối với xgtitle(), vui lòng sử dụng nntplib.NNTP.descriptions() hoặc nntplib.NNTP.description() thay thế. (Được đóng góp bởi Donghee Na trong bpo-39366.)

  • array.array: Phương thức tostring()fromstring() đã bị xóa. Chúng là bí danh của tobytes()frombytes(), không được dùng nữa kể từ Python 3.2. (Được đóng góp bởi Victor Stinner trong bpo-38916.)

  • Chức năng sys.callstats() không có giấy tờ đã bị xóa. Kể từ Python 3.7, nó không được dùng nữa và luôn trả về None. Nó yêu cầu một tùy chọn xây dựng đặc biệt CALL_PROFILE đã bị xóa trong Python 3.7. (Được đóng góp bởi Victor Stinner trong bpo-37414.)

  • Các chức năng sys.getcheckinterval()sys.setcheckinterval() đã bị xóa. Chúng không được dùng nữa kể từ Python 3.2. Thay vào đó hãy sử dụng sys.getswitchinterval()sys.setswitchinterval(). (Được đóng góp bởi Victor Stinner trong bpo-37392.)

  • Hàm C PyImport_Cleanup() đã bị xóa. Nó được ghi lại là: "Làm trống bảng mô-đun. Chỉ sử dụng nội bộ." (Được đóng góp bởi Victor Stinner trong bpo-36710.)

  • Các mô-đun _dummy_threaddummy_threading đã bị xóa. Các mô-đun này không còn được dùng nữa kể từ Python 3.7 yêu cầu hỗ trợ phân luồng. (Được đóng góp bởi Victor Stinner trong bpo-37312.)

  • Bí danh aifc.openfp() thành aifc.open(), bí danh sunau.openfp() thành sunau.open() và bí danh wave.openfp() thành wave.open() đã bị xóa. Chúng không được dùng nữa kể từ Python 3.7. (Được đóng góp bởi Victor Stinner trong bpo-37320.)

  • Phương thức isAlive() của threading.Thread đã bị xóa. Nó không được dùng nữa kể từ Python 3.8. Thay vào đó hãy sử dụng is_alive(). (Được đóng góp bởi Donghee Na trong bpo-37804.)

  • Các phương thức getchildren()getiterator() của các lớp ElementTreeElement trong mô-đun ElementTree đã bị xóa. Chúng không được dùng nữa trong Python 3.2. Sử dụng iter(x) hoặc list(x) thay vì x.getchildren()x.iter() hoặc list(x.iter()) thay vì x.getiterator(). (Được đóng góp bởi Serhiy Storchaka trong bpo-36543.)

  • plistlib API cũ đã bị xóa, nó không được dùng nữa kể từ Python 3.4. Sử dụng các hàm load(), loads(), dump()dumps(). Ngoài ra, tham số use_builtin_types đã bị xóa, thay vào đó, các đối tượng bytes tiêu chuẩn luôn được sử dụng. (Được đóng góp bởi Jon Janzen trong bpo-36409.)

  • Hàm C PyGen_NeedsFinalizing đã bị xóa. Nó không được ghi lại, kiểm tra hoặc sử dụng ở bất kỳ đâu trong CPython sau khi triển khai PEP 442. Bản vá của Joannah Nanjekye. (Được đóng góp bởi Joannah Nanjekye trong bpo-15088)

  • base64.encodestring()base64.decodestring(), các bí danh không còn được dùng kể từ Python 3.1, đã bị xóa: thay vào đó hãy sử dụng base64.encodebytes()base64.decodebytes(). (Được đóng góp bởi Victor Stinner trong bpo-39351.)

  • Hàm fractions.gcd() đã bị xóa, nó không được dùng nữa kể từ Python 3.5 (bpo-22486): thay vào đó hãy sử dụng math.gcd(). (Được đóng góp bởi Victor Stinner trong bpo-39350.)

  • Tham số buffering của bz2.BZ2File đã bị loại bỏ. Kể từ Python 3.0, nó đã bị bỏ qua và việc sử dụng nó đã phát ra DeprecationWarning. Truyền một đối tượng tệp đang mở để kiểm soát cách mở tệp. (Được đóng góp bởi Victor Stinner trong bpo-39357.)

  • Tham số encoding của json.loads() đã bị loại bỏ. Kể từ Python 3.1, nó không được dùng nữa và bị bỏ qua; sử dụng nó đã phát ra DeprecationWarning kể từ Python 3.8. (Được đóng góp bởi Inada Naoki trong bpo-39377)

  • Câu lệnh with (await asyncio.lock):with (yield from asyncio.lock): không còn được hỗ trợ nữa, thay vào đó hãy sử dụng async with lock. Điều tương tự cũng đúng với asyncio.Conditionasyncio.Semaphore. (Được đóng góp bởi Andrew Svetlov trong bpo-34793.)

  • Hàm sys.getcounts(), tùy chọn dòng lệnh -X showalloccount và trường show_alloc_count của cấu trúc C PyConfig đã bị xóa. Họ yêu cầu một bản dựng Python đặc biệt bằng cách xác định macro COUNT_ALLOCS. (Được đóng góp bởi Victor Stinner trong bpo-39489.)

  • Thuộc tính _field_types của lớp typing.NamedTuple đã bị xóa. Nó không được dùng nữa kể từ Python 3.8. Thay vào đó hãy sử dụng thuộc tính __annotations__. (Được đóng góp bởi Serhiy Storchaka trong bpo-40182.)

  • Phương thức symtable.SymbolTable.has_exec() đã bị xóa. Nó không được dùng nữa kể từ năm 2006 và chỉ trả về False khi được gọi. (Được đóng góp bởi Batuhan Taskaya trong bpo-40208)

  • asyncio.Task.current_task()asyncio.Task.all_tasks() đã bị xóa. Chúng không được dùng nữa kể từ Python 3.7 và thay vào đó bạn có thể sử dụng asyncio.current_task()asyncio.all_tasks(). (Được đóng góp bởi Rémi Lapeyre trong bpo-40967)

  • Phương thức unescape() trong lớp html.parser.HTMLParser đã bị xóa (nó không được dùng nữa kể từ Python 3.4). html.unescape() nên được sử dụng để chuyển đổi các tham chiếu ký tự thành các ký tự unicode tương ứng.

Chuyển sang Python 3.9

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

  • __import__()importlib.util.resolve_name() hiện tăng ImportError ở vị trí trước đó đã tăng ValueError. Người gọi nắm bắt loại ngoại lệ cụ thể và hỗ trợ cả Python 3.9 và các phiên bản cũ hơn sẽ cần nắm bắt cả hai bằng cách sử dụng except (ImportError, ValueError):.

  • Tập lệnh kích hoạt venv không còn là trường hợp đặc biệt khi __VENV_PROMPT__ được đặt thành "".

  • Phương pháp select.epoll.unregister() không còn bỏ qua lỗi EBADF nữa. (Được đóng góp bởi Victor Stinner trong bpo-39239.)

  • Tham số compresslevel của bz2.BZ2File trở thành chỉ có từ khóa vì tham số buffering đã bị xóa. (Được đóng góp bởi Victor Stinner trong bpo-39357.)

  • AST đơn giản hóa để đăng ký. Các chỉ số đơn giản sẽ được biểu diễn bằng giá trị của chúng, các lát cắt mở rộng sẽ được biểu diễn dưới dạng bộ dữ liệu. Index(value) sẽ trả về chính value, ExtSlice(slices) sẽ trả về Tuple(slices, Load()). (Được đóng góp bởi Serhiy Storchaka trong bpo-34822.)

  • Mô-đun importlib hiện bỏ qua biến môi trường PYTHONCASEOK khi các tùy chọn dòng lệnh -E hoặc -I đang được sử dụng.

  • Tham số encoding đã được thêm vào các lớp ftplib.FTPftplib.FTP_TLS dưới dạng tham số chỉ từ khóa và mã hóa mặc định được thay đổi từ Latin-1 thành UTF-8 để tuân theo RFC 2640.

  • asyncio.loop.shutdown_default_executor() đã được thêm vào AbstractEventLoop, nghĩa là các vòng lặp sự kiện thay thế kế thừa từ nó phải được xác định phương thức này. (Được đóng góp bởi Kyle Stanley trong bpo-34037.)

  • Giá trị không đổi của các cờ trong tương lai trong mô-đun __future__ được cập nhật để tránh xung đột với các cờ của trình biên dịch. Trước đây PyCF_ALLOW_TOP_LEVEL_AWAIT đã xung đột với CO_FUTURE_DIVISION. (Được đóng góp bởi Batuhan Taskaya trong bpo-39562)

  • array('u') hiện sử dụng wchar_t làm loại C thay vì Py_UNICODE. Thay đổi này không ảnh hưởng đến hành vi của nó vì Py_UNICODE là bí danh của wchar_t kể từ Python 3.3. (Được đóng góp bởi Inada Naoki trong bpo-34538.)

  • logging.getLogger() API hiện trả về trình ghi nhật ký gốc khi được chuyển tên 'root', trong khi trước đó nó trả về trình ghi nhật ký không phải root có tên 'root'. Điều này có thể ảnh hưởng đến các trường hợp mã người dùng rõ ràng muốn một trình ghi nhật ký không phải gốc có tên là 'root' hoặc khởi tạo một trình ghi nhật ký bằng cách sử dụng logging.getLogger(__name__) trong một số mô-đun cấp cao nhất có tên là 'root.py'. (Được đóng góp bởi Vinay Sajip trong bpo-37742.)

  • Việc xử lý phép chia của PurePath hiện trả về NotImplemented thay vì tăng TypeError khi truyền thứ gì đó không phải là phiên bản của str hoặc PurePath. Điều này cho phép tạo các lớp tương thích không kế thừa từ các loại được đề cập đó. (Được đóng góp bởi Roger Aiudi trong bpo-34775).

  • Bắt đầu với Python 3.9.5, mô-đun ipaddress không còn chấp nhận bất kỳ số 0 đứng đầu nào trong chuỗi địa chỉ IPv4. Các số 0 đứng đầu không rõ ràng và được một số thư viện hiểu là ký hiệu bát phân. Ví dụ: hàm kế thừa socket.inet_aton() xử lý các số 0 đứng đầu dưới dạng ký hiệu bát phân. Việc triển khai glibc của inet_pton() hiện đại không chấp nhận bất kỳ số 0 đứng đầu nào. (Được đóng góp bởi Christian Heimes trong bpo-36384).

  • codecs.lookup() hiện bình thường hóa tên mã hóa theo cách tương tự như encodings.normalize_encoding(), ngoại trừ việc codecs.lookup() cũng chuyển đổi tên thành chữ thường. Ví dụ: tên mã hóa "latex+latin1" hiện được chuẩn hóa thành "latex_latin1". (Được đóng góp bởi Jordon Xu trong bpo-37751.)

Những thay đổi trong C API

  • Các phiên bản của heap-allocated types (chẳng hạn như các phiên bản được tạo bằng PyType_FromSpec() và các API tương tự) giữ tham chiếu đến đối tượng loại của chúng kể từ Python 3.8. Như đã chỉ ra trong "Những thay đổi trong C API" của Python 3.8, trong phần lớn các trường hợp, sẽ không có tác dụng phụ nhưng đối với các loại có hàm tp_traverse tùy chỉnh, hãy đảm bảo rằng tất cả các hàm tp_traverse tùy chỉnh của các loại được phân bổ đống đều truy cập vào loại đối tượng.

    Ví dụ:

    int
    foo_traverse(PyObject *self, visitproc visit, void *arg)
    {
    // Phần còn lại của hàm duyệt
    #if PY_VERSION_HEX >= 0x03090000
        // Điều này không cần thiết trước Python 3.9 (Vấn đề Python 35810 và 40217)
        Py_VISIT(Py_TYPE(tự));
    #endif
    }
    

    Nếu hàm duyệt của bạn ủy quyền cho tp_traverse của lớp cơ sở của nó (hoặc loại khác), hãy đảm bảo rằng Py_TYPE(self) chỉ được truy cập một lần. Lưu ý rằng chỉ có heap type mới được phép truy cập loại trong tp_traverse.

    Ví dụ: nếu hàm tp_traverse của bạn bao gồm:

    base->tp_traverse (tự, truy cập, arg)
    

    sau đó thêm:

    #if PY_VERSION_HEX >= 0x03090000
        // Điều này không cần thiết trước Python 3.9 (bpo-35810 và bpo-40217)
        if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) {
            // tp_traverse của loại heap đã truy cập Py_TYPE(self)
        } khác {
            Py_VISIT(Py_TYPE(tự));
        }
    #else
    

    (Xem bpo-35810bpo-40217 để biết thêm thông tin.)

  • Các hàm PyEval_CallObject, PyEval_CallFunction, PyEval_CallMethodPyEval_CallObjectWithKeywords không được dùng nữa. Thay vào đó hãy sử dụng PyObject_Call() và các biến thể của nó. (Xem thêm chi tiết tại bpo-29548.)

Thay đổi mã byte CPython

  • Mã hoạt động LOAD_ASSERTION_ERROR đã được thêm vào để xử lý câu lệnh assert. Trước đây, câu lệnh khẳng định sẽ không hoạt động chính xác nếu ngoại lệ AssertionError bị che khuất. (Được đóng góp bởi Zackery Spytz trong bpo-34880.)

  • Mã hoạt động COMPARE_OP được chia thành bốn hướng dẫn riêng biệt:

    • COMPARE_OP để so sánh phong phú

    • IS_OP cho các bài kiểm tra 'là' và 'không'

    • CONTAINS_OP cho bài kiểm tra 'trong' và 'không trong'

    • JUMP_IF_NOT_EXC_MATCH để kiểm tra các ngoại lệ trong câu lệnh 'thử ngoại trừ'.

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

Xây dựng thay đổi

  • Đã thêm tùy chọn --with-platlibdir vào tập lệnh configure: tên của thư mục thư viện dành riêng cho nền tảng, được lưu trữ trong thuộc tính sys.platlibdir mới. Xem thuộc tính sys.platlibdir để biết thêm thông tin. (Được đóng góp bởi Jan Matějek, Matěj Cepl, Charalampos Stratakis và Victor Stinner trong bpo-1294959.)

  • Macro xây dựng đặc biệt COUNT_ALLOCS đã bị xóa. (Được đóng góp bởi Victor Stinner trong bpo-39489.)

  • Trên các nền tảng không phải Windows, các hàm setenv()unsetenv() hiện được yêu cầu để xây dựng Python. (Được đóng góp bởi Victor Stinner trong bpo-39395.)

  • Trên các nền tảng không phải Windows, việc tạo trình cài đặt bdist_wininst hiện không được hỗ trợ chính thức. (Xem bpo-10945 để biết thêm chi tiết.)

  • Khi xây dựng Python trên macOS từ nguồn, _tkinter hiện liên kết với các khung Tcl và Tk không thuộc hệ thống nếu chúng được cài đặt trong /Library/Frameworks, như trường hợp trên các bản phát hành macOS cũ hơn. Nếu macOS SDK được định cấu hình rõ ràng, bằng cách sử dụng --enable-universalsdk hoặc -isysroot, chỉ có SDK được tìm kiếm. Hành vi mặc định vẫn có thể được ghi đè bằng --with-tcltk-includes--with-tcltk-libs. (Được đóng góp bởi Ned Deily trong bpo-34956.)

  • Python hiện có thể được xây dựng cho Windows 10 ARM64. (Được đóng góp bởi Steve Dower trong bpo-33125.)

  • Một số thử nghiệm riêng lẻ hiện bị bỏ qua khi sử dụng --pgo. Các thử nghiệm được đề cập đã làm tăng đáng kể thời gian thực hiện tác vụ PGO và có thể không giúp cải thiện việc tối ưu hóa tệp thực thi cuối cùng. Điều này tăng tốc nhiệm vụ lên khoảng 15 lần. Chạy bộ thử nghiệm đơn vị đầy đủ rất chậm. Thay đổi này có thể dẫn đến bản dựng được tối ưu hóa kém hơn một chút do không có nhiều nhánh mã được thực thi. Nếu bạn sẵn sàng chờ bản dựng chậm hơn nhiều, bạn có thể khôi phục hành vi cũ bằng ./configure [..] PROFILE_TASK="-m test --pgo-extended". Chúng tôi không đảm bảo rằng nhóm tác vụ PGO nào sẽ tạo ra bản dựng nhanh hơn. Những người dùng quan tâm nên chạy các điểm chuẩn phù hợp của riêng mình vì kết quả có thể phụ thuộc vào môi trường, khối lượng công việc và chuỗi công cụ biên dịch. (Xem bpo-36044bpo-37707 để biết thêm chi tiết.)

C API Thay đổi

Tính năng mới

  • PEP 573: Đã thêm PyType_FromModuleAndSpec() để liên kết mô-đun với một lớp; PyType_GetModule()PyType_GetModuleState() để truy xuất mô-đun và trạng thái của nó; và PyCMethodMETH_METHOD để cho phép một phương thức truy cập vào lớp mà nó được xác định. (Được đóng góp bởi Marcel Plch và Petr Viktorin trong bpo-38787.)

  • Đã thêm chức năng PyFrame_GetCode(): lấy mã khung. Đã thêm chức năng PyFrame_GetBack(): lấy khung hình bên ngoài tiếp theo. (Được đóng góp bởi Victor Stinner trong bpo-40421.)

  • Đã thêm PyFrame_GetLineNumber() vào C API giới hạn. (Được đóng góp bởi Victor Stinner trong bpo-40421.)

  • Đã thêm chức năng PyThreadState_GetInterpreter()PyInterpreterState_Get() để tải trình thông dịch. Đã thêm hàm PyThreadState_GetFrame() để lấy khung hiện tại của trạng thái luồng Python. Đã thêm chức năng PyThreadState_GetID(): lấy mã định danh duy nhất của trạng thái luồng Python. (Được đóng góp bởi Victor Stinner trong bpo-39947.)

  • Đã thêm một hàm PyObject_CallNoArgs() công khai mới vào C API, hàm này gọi một đối tượng Python có thể gọi được mà không có bất kỳ đối số nào. Đó là cách hiệu quả nhất để gọi một đối tượng Python có thể gọi được mà không cần bất kỳ đối số nào. (Được đóng góp bởi Victor Stinner trong bpo-37194.)

  • Những thay đổi trong C API bị giới hạn (nếu macro Py_LIMITED_API được xác định):

    • Cung cấp Py_EnterRecursiveCall()Py_LeaveRecursiveCall() như các chức năng thông thường cho API giới hạn. Trước đây, có những macro được xác định là macro, nhưng những macro này không biên dịch với C API bị giới hạn nên không thể truy cập trường PyThreadState.recursion_depth (cấu trúc mờ trong C API bị giới hạn).

    • PyObject_INIT()PyObject_INIT_VAR() trở thành chức năng "mờ" thông thường để ẩn chi tiết triển khai.

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

  • Chức năng PyModule_AddType() được thêm vào để giúp thêm loại vào mô-đun. (Được đóng góp bởi Donghee Na trong bpo-40024.)

  • Đã thêm các hàm PyObject_GC_IsTracked()PyObject_GC_IsFinalized() vào API công khai để cho phép truy vấn xem các đối tượng Python hiện đang được theo dõi hay đã được trình thu gom rác hoàn thiện tương ứng. (Được đóng góp bởi Pablo Galindo Salgado trong bpo-40241.)

  • Đã thêm _PyObject_FunctionStr() để có được biểu diễn chuỗi thân thiện với người dùng của một đối tượng giống như hàm. (Bản vá của Jeroen Demeyer trong bpo-37645.)

  • Đã thêm PyObject_CallOneArg() để gọi một đối tượng có một đối số vị trí (Bản vá của Jeroen Demeyer trong bpo-37483.)

Chuyển sang Python 3.9

  • PyInterpreterState.eval_frame (PEP 523) hiện yêu cầu tham số tstate bắt buộc mới (PyThreadState*). (Được đóng góp bởi Victor Stinner trong bpo-38500.)

  • Các mô-đun mở rộng: các chức năng m_traverse, m_clearm_free của PyModuleDef không còn được gọi nếu trạng thái mô-đun được yêu cầu nhưng chưa được phân bổ. Đây là trường hợp ngay sau khi mô-đun được tạo và trước khi mô-đun được thực thi (chức năng Py_mod_exec). Chính xác hơn, các hàm này không được gọi nếu m_size lớn hơn 0 và trạng thái mô-đun (được trả về bởi PyModule_GetState()) là NULL.

    Các mô-đun mở rộng không có trạng thái mô-đun (m_size <= 0) sẽ không bị ảnh hưởng.

  • Nếu Py_AddPendingCall() được gọi trong trình thông dịch phụ, thì hàm này hiện được lên lịch để gọi từ trình thông dịch phụ, thay vì được gọi từ trình thông dịch chính. Mỗi thông dịch viên phụ hiện có danh sách các cuộc gọi được lên lịch riêng. (Được đóng góp bởi Victor Stinner trong bpo-39984.)

  • Sổ đăng ký Windows không còn được sử dụng để khởi tạo sys.path khi tùy chọn -E được sử dụng (nếu PyConfig.use_environment được đặt thành 0). Điều này rất có ý nghĩa khi nhúng Python trên Windows. (Được đóng góp bởi Zackery Spytz trong bpo-8901.)

  • Biến toàn cục PyStructSequence_UnnamedField hiện là một hằng số và đề cập đến một chuỗi không đổi. (Được đóng góp bởi Serhiy Storchaka trong bpo-38650.)

  • Cấu trúc PyGC_Head hiện không rõ ràng. Nó chỉ được định nghĩa trong C API (pycore_gc.h) bên trong. (Được đóng góp bởi Victor Stinner trong bpo-40241.)

  • Py_UNICODE_COPY, Py_UNICODE_FILL, PyUnicode_WSTR_LENGTH, PyUnicode_FromUnicode(), PyUnicode_AsUnicode(), _PyUnicode_AsUnicodePyUnicode_AsUnicodeAndSize() được đánh dấu là không dùng nữa trong C. Chúng không được dùng nữa bởi PEP 393 kể từ Python 3.3. (Được đóng góp bởi Inada Naoki trong bpo-36346.)

  • Hàm Py_FatalError() được thay thế bằng macro tự động ghi tên của hàm hiện tại, trừ khi macro Py_LIMITED_API được xác định. (Được đóng góp bởi Victor Stinner trong bpo-39882.)

  • Giao thức vectorcall hiện yêu cầu người gọi chỉ chuyển các chuỗi dưới dạng tên từ khóa. (Xem bpo-37540 để biết thêm thông tin.)

  • Chi tiết triển khai của một số macro và chức năng hiện bị ẩn:

    (Xem bpo-40170 để biết thêm chi tiết.)

Đã xóa

  • Đã loại trừ macro PyFPE_START_PROTECT()PyFPE_END_PROTECT() của pyfpe.h khỏi C API giới hạn. (Được đóng góp bởi Victor Stinner trong bpo-38835.)

  • Khe tp_print của PyTypeObject đã bị loại bỏ. Nó được sử dụng để in các đối tượng thành tệp trong Python 2.7 trở về trước. Kể từ Python 3.0, nó đã bị bỏ qua và không được sử dụng. (Được đóng góp bởi Jeroen Demeyer trong bpo-36974.)

  • Những thay đổi trong C API bị giới hạn (nếu macro Py_LIMITED_API được xác định):

    • Đã loại trừ các chức năng sau khỏi C API giới hạn:

      • PyThreadState_DeleteCurrent() (Được đóng góp bởi Joannah Nanjekye trong bpo-37878.)

      • _Py_CheckRecursionLimit

      • _Py_NewReference()

      • _Py_ForgetReference()

      • _PyTraceMalloc_NewReference()

      • _Py_GetRefTotal()

      • Cơ chế thùng rác chưa bao giờ hoạt động trong C API giới hạn.

      • PyTrash_UNWIND_LEVEL

      • Py_TRASHCAN_BEGIN_CONDITION

      • Py_TRASHCAN_BEGIN

      • Py_TRASHCAN_END

      • Py_TRASHCAN_SAFE_BEGIN

      • Py_TRASHCAN_SAFE_END

    • Đã chuyển các hàm và định nghĩa sau sang C API nội bộ:

      • _PyDebug_PrintTotalRefs()

      • _Py_PrintReferences()

      • _Py_PrintReferenceAddresses()

      • _Py_tracemalloc_config

      • _Py_AddToAllObjects() (dành riêng cho bản dựng Py_TRACE_REFS)

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

  • Đã xóa móc _PyRuntime.getframe và xóa macro _PyThreadState_GetFrame là bí danh của _PyRuntime.getframe. Họ chỉ bị lộ bởi C API nội bộ. Loại bỏ cũng loại PyThreadFrameGetter. (Được đóng góp bởi Victor Stinner trong bpo-39946.)

  • Đã xóa các chức năng sau khỏi C API. Gọi PyGC_Collect() một cách rõ ràng để xóa tất cả danh sách miễn phí. (Được đóng góp bởi Inada Naoki và Victor Stinner trong bpo-37340, bpo-38896bpo-40428.)

    • PyAsyncGen_ClearFreeLists()

    • PyContext_ClearFreeList()

    • PyDict_ClearFreeList()

    • PyFloat_ClearFreeList()

    • PyFrame_ClearFreeList()

    • PyList_ClearFreeList()

    • PyMethod_ClearFreeList()PyCFunction_ClearFreeList(): danh sách miễn phí của các đối tượng phương thức bị ràng buộc đã bị xóa.

    • PySet_ClearFreeList(): danh sách miễn phí đã đặt đã bị xóa trong Python 3.4.

    • PyTuple_ClearFreeList()

    • PyUnicode_ClearFreeList(): danh sách miễn phí Unicode đã bị xóa trong Python 3.3.

  • Đã xóa chức năng _PyUnicode_ClearStaticStrings(). (Được đóng góp bởi Victor Stinner trong bpo-39465.)

  • Đã xóa Py_UNICODE_MATCH. Nó không được PEP 393 dùng nữa và bị hỏng kể từ Python 3.3. Chức năng PyUnicode_Tailmatch() có thể được sử dụng thay thế. (Được đóng góp bởi Inada Naoki trong bpo-36346.)

  • Các tệp tiêu đề đã được làm sạch của các giao diện được xác định nhưng không được triển khai. Các biểu tượng API công khai bị xóa là: _PyBytes_InsertThousandsGroupingLocale, _PyBytes_InsertThousandsGrouping, _Py_InitializeFromArgs, _Py_InitializeFromWideArgs, _PyFloat_Repr, _PyFloat_Digits, _PyFloat_DigitsInit, PyFrame_ExtendStack, _PyAIterWrapper_Type, PyNullImporter_Type, PyCmpWrapper_Type, PySortWrapper_Type, PyNoArgsFunction. (Được đóng góp bởi Pablo Galindo Salgado trong bpo-39372.)

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

đánh máy

Hoạt động của typing.Literal đã được thay đổi để phù hợp với PEP 586 và phù hợp với hoạt động của trình kiểm tra loại tĩnh được chỉ định trong PEP.

  1. Literal hiện đã loại bỏ các tham số trùng lặp.

  2. So sánh bình đẳng giữa các đối tượng Literal hiện không phụ thuộc vào thứ tự.

  3. so sánh Literal bây giờ tôn trọng các loại. Ví dụ: Literal[0] == Literal[False] trước đây được đánh giá là True. Bây giờ là False. Để hỗ trợ thay đổi này, bộ nhớ đệm loại được sử dụng nội bộ hiện hỗ trợ các loại khác nhau.

  4. Các đối tượng Literal bây giờ sẽ đưa ra một ngoại lệ TypeError trong quá trình so sánh đẳng thức nếu bất kỳ tham số nào của chúng không phải là hashable. Lưu ý rằng việc khai báo Literal với các tham số có thể thay đổi sẽ không gây ra lỗi

    >>> từ cách  nhập chữ
    >>> Nghĩa đen[{0}]
    >>> Literal[{0}] == Literal[{False}]
    Traceback (cuộc gọi gần đây nhất):
      Tệp "<stdin>", dòng 1, trong <module>
    TypeError: loại không thể xóa được: 'set'
    

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

Hỗ trợ macOS 11.0 (Big Sur) và Apple Silicon Mac

Kể từ phiên bản 3.9.1, Python hiện hỗ trợ đầy đủ việc xây dựng và chạy trên macOS 11.0 (Big Sur) và trên máy Mac Apple Silicon (dựa trên kiến ​​trúc ARM64). Một biến thể xây dựng phổ quát mới, universal2, hiện có sẵn để hỗ trợ nguyên bản cả ARM64Intel 64 trong một bộ tệp thực thi. Giờ đây, các tệp nhị phân cũng có thể được xây dựng trên các phiên bản macOS hiện tại để triển khai trên nhiều phiên bản macOS cũ hơn (đã thử nghiệm lên 10.9) đồng thời cung cấp một số chức năng và tùy chọn hệ điều hành mới hơn có điều kiện dựa trên phiên bản hệ điều hành đang được sử dụng trong thời gian chạy ("liên kết yếu").

(Được đóng góp bởi Ronald Oussoren và Lawrence D'Anna trong bpo-41100.)

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

bộ sưu tập.abc

collections.abc.Callable generic hiện làm phẳng các tham số loại, tương tự như những gì typing.Callable hiện đang làm. Điều này có nghĩa là collections.abc.Callable[[int, str], str] sẽ có __args__ của (int, str, str); trước đây đây là ([int, str], str). Để cho phép thay đổi này, types.GenericAlias hiện có thể được phân lớp và một lớp con sẽ được trả về khi đăng ký loại collections.abc.Callable. Mã truy cập các đối số thông qua typing.get_args() hoặc __args__ cần tính đến sự thay đổi này. Một DeprecationWarning có thể được phát ra đối với các dạng tham số hóa collections.abc.Callable không hợp lệ có thể đã được truyền âm thầm trong Python 3.9.1. Zz007zz này sẽ trở thành TypeError trong Python 3.10. (Được đóng góp bởi Ken Jin trong bpo-42195.)

urllib.parse

Các phiên bản Python trước đó cho phép sử dụng cả ;& làm dấu tách tham số truy vấn trong urllib.parse.parse_qs()urllib.parse.parse_qsl(). Do lo ngại về bảo mật và để phù hợp với các đề xuất W3C mới hơn, điều này đã được thay đổi để chỉ cho phép một khóa phân tách duy nhất, với & làm mặc định. Thay đổi này cũng ảnh hưởng đến cgi.parse()cgi.parse_multipart() khi chúng sử dụng các chức năng bị ảnh hưởng trong nội bộ. Để biết thêm chi tiết, vui lòng xem tài liệu tương ứng của họ. (Được đóng góp bởi Adam Goldschmidt, Senthil Kumaran và Ken Jin trong bpo-42967.)

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

Bản sửa lỗi bảo mật sẽ thay đổi hành vi của ftplib.FTP để không tin cậy địa chỉ IPv4 được gửi từ máy chủ từ xa khi thiết lập kênh dữ liệu thụ động. Thay vào đó, chúng tôi sử dụng lại địa chỉ IP của máy chủ ftp. Đối với mã bất thường yêu cầu hành vi cũ, hãy đặt thuộc tính trust_server_pasv_ipv4_address trên phiên bản FTP của bạn thành True. (Xem gh-87451)

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

urllib.parse

Sự hiện diện của các ký tự dòng mới hoặc tab trong các phần của URL cho phép thực hiện một số hình thức tấn công. Theo thông số kỹ thuật WHATWG cập nhật RFC 3986, các ký tự dòng mới \n, \r và tab \t bị loại bỏ khỏi URL bởi trình phân tích cú pháp trong urllib.parse để ngăn chặn các cuộc tấn công như vậy. Các ký tự loại bỏ được điều khiển bởi biến cấp độ mô-đun mới urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE. (Xem gh-88048)

Tính năng bảo mật đáng chú ý trong 3.9.14

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.

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

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.)