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
graphlibmớ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 DeprecationWarning và PendingDeprecationWarning 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 và {**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) và 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, bytearray và collections.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ư list và dict 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 có:
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ăngImportErrorthay 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 Mode và debug build, các đối số encoding và errors 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()và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ềsthay vì một chuỗi trống cho tất cảnkhá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ượngbytesvàbytearray. (Đượ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ưUnionvàList). Sử dụnghelp()với bí danh chung nhưList[int]sẽ hiển thị trợ giúp cho loại cụ thể tương ứng (listtrong 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_runninghiệ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 đượcTypeErrorche dấu trong toán tửinvà các hàmcontains(),indexOf()vàcountOf()của mô-đunoperator. (Đượ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 đề
iftrong phần hiểu và biểu thức trình tạo. Xem bpo-41848 và bpo-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 ThreadPoolExecutor và ProcessPoolExecutor. Đ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() và 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.date và isocalendar() 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_SETLK và fcntl.F_OFD_SETLKW. (Được đóng góp bởi Donghee Na trong bpo-38602.)
ftplib¶
FTP và FTP_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_TEAPOT và 425 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¶
IMAP4 và IMAP4_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_SSL và IMAP4_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-36350 và bpo-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-39479 và bpo-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¶
NNTP và NNTP_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_KILLED và CLD_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() và 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¶
POP3 và POP3_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¶
SMTP và SMTP_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() và 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ảny = 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
subprocesstrên FreeBSD bằngclosefrom(). (Đượ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
ZeroDivisionErrorcho 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_msihiện không được dùng nữa, thay vào đó hãy sử dụngbdist_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ảnfloatcó giá trị nguyên không âm (như5.0). Nó tăngValueErrorcho 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ăngTypeErrorcho tất cả các số float. (Được đóng góp bởi Serhiy Storchaka trong bpo-37315.)Các mô-đun
parservàsymbolkhô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ô-đunast.Các hàm Public C API
PyParser_SimpleParseStringFlags(),PyParser_SimpleParseStringFlagsFilename(),PyParser_SimpleParseFileFlags()và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
NotImplementedtrong 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ànhTypeErrortrong phiên bản Python trong tương lai. (Được đóng góp bởi Josh Rosenberg trong bpo-35712.)Mô-đun
randomhiệ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,bytesvàbytearray.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.TkappTypemà thay vào đó là phương thứcsplitlist()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
binhexvà các chức năngbinasciisau 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
astslice,IndexvàExtSliceđượ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ânvaluenê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
astSuite,Param,AugLoadvàAugStoređượ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-39639 và bpo-39969 và Serhiy Storchaka trong bpo-39988.)Các hàm
PyEval_InitThreads()vàPyEval_ThreadsInitialized()hiện không được dùng nữa và sẽ bị xóa trong Python 3.11. GọiPyEval_InitThreads()bây giờ không có tác dụng gì. Zz003zz được khởi tạo bởiPy_Initialize()kể từ Python 3.7. (Được đóng góp bởi Victor Stinner trong bpo-39877.)Việc truyền
Nonelàm đối số đầu tiên cho hàmshlex.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
lib2to3hiện phát raPendingDeprecationWarning. 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ô-đunlib2to3có 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ứcxpath()và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ớixgtitle(), vui lòng sử dụngnntplib.NNTP.descriptions()hoặcnntplib.NNTP.description()thay thế. (Được đóng góp bởi Donghee Na trong bpo-39366.)array.array: Phương thứctostring()vàfromstring()đã bị xóa. Chúng là bí danh củatobytes()và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ệtCALL_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()và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ụngsys.getswitchinterval()và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_threadvàdummy_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ànhaifc.open(), bí danhsunau.openfp()thànhsunau.open()và bí danhwave.openfp()thànhwave.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ủathreading.Threadđã bị xóa. Nó không được dùng nữa kể từ Python 3.8. Thay vào đó hãy sử dụngis_alive(). (Được đóng góp bởi Donghee Na trong bpo-37804.)Các phương thức
getchildren()vàgetiterator()của các lớpElementTreevàElementtrong mô-đunElementTreeđã bị xóa. Chúng không được dùng nữa trong Python 3.2. Sử dụngiter(x)hoặclist(x)thay vìx.getchildren()vàx.iter()hoặclist(x.iter())thay vìx.getiterator(). (Được đóng góp bởi Serhiy Storchaka trong bpo-36543.)plistlibAPI cũ đã bị xóa, nó không được dùng nữa kể từ Python 3.4. Sử dụng các hàmload(),loads(),dump()vàdumps(). Ngoài ra, tham số use_builtin_types đã bị xóa, thay vào đó, các đối tượngbytestiê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()và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ụngbase64.encodebytes()và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ụngmath.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 raDeprecationWarning. 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 raDeprecationWarningkể từ Python 3.8. (Được đóng góp bởi Inada Naoki trong bpo-39377)Câu lệnh
with (await asyncio.lock):vàwith (yield from asyncio.lock):không còn được hỗ trợ nữa, thay vào đó hãy sử dụngasync with lock. Điều tương tự cũng đúng vớiasyncio.Conditionvàasyncio.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 showalloccountvà trườngshow_alloc_countcủa cấu trúc CPyConfigđã 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 macroCOUNT_ALLOCS. (Được đóng góp bởi Victor Stinner trong bpo-39489.)Thuộc tính
_field_typescủa lớptyping.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ềFalsekhi được gọi. (Được đóng góp bởi Batuhan Taskaya trong bpo-40208)asyncio.Task.current_task()và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ụngasyncio.current_task()vàasyncio.all_tasks(). (Được đóng góp bởi Rémi Lapeyre trong bpo-40967)Phương thức
unescape()trong lớphtml.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__()vàimportlib.util.resolve_name()hiện tăngImportErrorở vị trí trước đó đã tăngValueError. 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ụngexcept (ImportError, ValueError):.Tập lệnh kích hoạt
venvkhô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ỗiEBADFnữa. (Được đóng góp bởi Victor Stinner trong bpo-39239.)Tham số compresslevel của
bz2.BZ2Filetrở 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ínhvalue,ExtSlice(slices)sẽ trả vềTuple(slices, Load()). (Được đóng góp bởi Serhiy Storchaka trong bpo-34822.)Mô-đun
importlibhiện bỏ qua biến môi trườngPYTHONCASEOKkhi các tùy chọn dòng lệnh-Ehoặc-Iđang được sử dụng.Tham số encoding đã được thêm vào các lớp
ftplib.FTPvàftplib.FTP_TLSdướ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àoAbstractEventLoop, 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 đâyPyCF_ALLOW_TOP_LEVEL_AWAITđã xung đột vớiCO_FUTURE_DIVISION. (Được đóng góp bởi Batuhan Taskaya trong bpo-39562)array('u')hiện sử dụngwchar_tlà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_UNICODElà bí danh củawchar_tkể 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ụnglogging.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
PurePathhiện trả vềNotImplementedthay vì tăngTypeErrorkhi truyền thứ gì đó không phải là phiên bản củastrhoặcPurePath. Đ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
ipaddresskhô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ừasocket.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ủainet_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ệccodecs.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àmtp_traversetùy chỉnh, hãy đảm bảo rằng tất cả các hàmtp_traversetù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_traversecủa lớp cơ sở của nó (hoặc loại khác), hãy đảm bảo rằngPy_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 trongtp_traverse.Ví dụ: nếu hàm
tp_traversecủ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
Các hàm
PyEval_CallObject,PyEval_CallFunction,PyEval_CallMethodvàPyEval_CallObjectWithKeywordskhông được dùng nữa. Thay vào đó hãy sử dụngPyObject_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ệnhassert. 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ệAssertionErrorbị 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_OPcho các bài kiểm tra 'là' và 'không'CONTAINS_OPcho 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-platlibdirvào tập lệnhconfigure: 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ínhsys.platlibdirmới. Xem thuộc tínhsys.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()và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_wininsthiệ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,
_tkinterhiệ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-universalsdkhoặ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-includesvà--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-36044 và bpo-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()vàPyType_GetModuleState()để truy xuất mô-đun và trạng thái của nó; vàPyCMethodvàMETH_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ăngPyFrame_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()vàPyInterpreterState_Get()để tải trình thông dịch. Đã thêm hàmPyThreadState_GetFrame()để lấy khung hiện tại của trạng thái luồng Python. Đã thêm chức năngPyThreadState_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()và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ườngPyThreadState.recursion_depth(cấu trúc mờ trong C API bị giới hạn).PyObject_INIT()và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-38644 và bpo-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()và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_clearvàm_freecủaPyModuleDefkhô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ăngPy_mod_exec). Chính xác hơn, các hàm này không được gọi nếum_sizelớn hơn 0 và trạng thái mô-đun (được trả về bởiPyModule_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.pathkhi tùy chọn-Eđược sử dụng (nếuPyConfig.use_environmentđược đặt thành0). Đ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_UnnamedFieldhiệ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_Headhiệ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_AsUnicodevàPyUnicode_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 macroPy_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:
macro
PyObject_IS_GC()đã được chuyển đổi thành một hàm.Macro
PyObject_NEW()trở thành bí danh của macroPyObject_Newvà macroPyObject_NEW_VAR()trở thành bí danh của macroPyObject_NewVar. Họ không còn truy cập trực tiếp vào thành viênPyTypeObject.tp_basicsizenữa.macro
PyObject_GET_WEAKREFS_LISTPTR()đã được chuyển đổi thành một hàm: macro truy cập trực tiếp vào thành viênPyTypeObject.tp_weaklistoffset.macro
PyObject_CheckBuffer()đã được chuyển đổi thành một hàm: macro truy cập trực tiếp vào thành viênPyTypeObject.tp_as_buffer.PyIndex_Check()hiện luôn được khai báo là một hàm mờ để ẩn chi tiết triển khai: đã xóa macroPyIndex_Check(). Macro truy cập trực tiếp vào thành viênPyTypeObject.tp_as_number.
(Xem bpo-40170 để biết thêm chi tiết.)
Đã xóa¶
Đã loại trừ macro
PyFPE_START_PROTECT()vàPyFPE_END_PROTECT()củapyfpe.hkhỏi C API giới hạn. (Được đóng góp bởi Victor Stinner trong bpo-38835.)Khe
tp_printcủ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_LEVELPy_TRASHCAN_BEGIN_CONDITIONPy_TRASHCAN_BEGINPy_TRASHCAN_ENDPy_TRASHCAN_SAFE_BEGINPy_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ựngPy_TRACE_REFS)
(Được đóng góp bởi Victor Stinner trong bpo-38644 và bpo-39542.)
Đã xóa móc
_PyRuntime.getframevà xóa macro_PyThreadState_GetFramelà bí danh của_PyRuntime.getframe. Họ chỉ bị lộ bởi C API nội bộ. Loại bỏ cũng loạiPyThreadFrameGetter. (Đượ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-38896 và bpo-40428.)PyAsyncGen_ClearFreeLists()PyContext_ClearFreeList()PyDict_ClearFreeList()PyFloat_ClearFreeList()PyFrame_ClearFreeList()PyList_ClearFreeList()PyMethod_ClearFreeList()và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ăngPyUnicode_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.
Literalhiện đã loại bỏ các tham số trùng lặp.So sánh bình đẳng giữa các đối tượng
Literalhiện không phụ thuộc vào thứ tự.so sánh
Literalbâ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.Các đối tượng
Literalbây giờ sẽ đưa ra một ngoại lệTypeErrortrong 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áoLiteralvới các tham số có thể thay đổi sẽ không gây ra lỗi>>> từ cách gõ 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ả ARM64 và Intel 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ả ; và & làm dấu tách tham số truy vấn trong urllib.parse.parse_qs() và 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() và 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 int và str ở 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
tarfilevàshutil.unpack_archive()có một đối số filter mới cho phép hạn chế các tính năng tar có thể gây ngạc nhiên hoặc nguy hiểm, chẳng hạn như tạo tệp bên ngoài thư mục đích. Xem 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.)