Có gì mới trong Python 3.10¶
- Biên tập viên:
Pablo Galindo Salgado
Bài viết này giải thích các tính năng mới trong Python 3.10, so với 3.9. Python 3.10 được phát hành vào ngày 4 tháng 10 năm 2021. Để biết chi tiết đầy đủ, hãy xem changelog.
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 634, Kết hợp mẫu cấu trúc: Đặc điểm kỹ thuật
PEP 635, Kết hợp mô hình cấu trúc: Động lực và lý do
PEP 636, Khớp mẫu cấu trúc: Hướng dẫn
bpo-12782, Trình quản lý bối cảnh trong ngoặc đơn hiện đã chính thức được cho phép.
Các tính năng mới trong thư viện tiêu chuẩn:
PEP 618, Thêm tùy chọn kiểm tra độ dài vào zip.
Cải tiến trình thông dịch:
PEP 626, Số dòng chính xác để gỡ lỗi và các công cụ khác.
Tính năng gõ mới:
PEP 604, Cho phép viết kiểu kết hợp là X | Y
PEP 612, Thông số kỹ thuật biến
PEP 613, Bí danh loại rõ ràng
PEP 647, Bộ bảo vệ loại do người dùng xác định
Những trường hợp ngừng sử dụng, xóa hoặc hạn chế quan trọng:
Tính năng mới¶
Trình quản lý bối cảnh được ngoặc đơn¶
Hiện đã hỗ trợ sử dụng dấu ngoặc đơn kèm theo để tiếp tục trên nhiều dòng trong trình quản lý ngữ cảnh. Điều này cho phép định dạng một tập hợp dài các trình quản lý bối cảnh thành nhiều dòng theo cách tương tự như trước đây có thể thực hiện được với các câu lệnh nhập. Chẳng hạn, tất cả các ví dụ này hiện hợp lệ:
với (CtxManager() làm ví dụ):
...
với (
CtxManager1(),
CtxManager2()
):
...
với (CtxManager1() làm ví dụ,
CtxManager2()):
...
với (CtxManager1(),
CtxManager2() làm ví dụ):
...
với (
CtxManager1() làm ví dụ1,
CtxManager2() như ví dụ2
):
...
cũng có thể sử dụng dấu phẩy ở cuối nhóm kèm theo:
với (
CtxManager1() làm ví dụ1,
CtxManager2() làm ví dụ2,
CtxManager3() làm ví dụ3,
):
...
Cú pháp mới này sử dụng khả năng không phải LL(1) của trình phân tích cú pháp mới. Kiểm tra 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-12782 và bpo-40334.)
Thông báo lỗi tốt hơn¶
Lỗi cú pháp¶
Khi phân tích cú pháp mã chứa dấu ngoặc đơn hoặc dấu ngoặc không đóng, trình thông dịch hiện bao gồm vị trí của dấu ngoặc đơn không đóng thay vì hiển thị SyntaxError: unexpected EOF while parsing hoặc trỏ đến một số vị trí không chính xác. Ví dụ: hãy xem xét đoạn mã sau (chú ý '{' không được tiết lộ):
dự kiến = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6,
some_other_code = foo()
Các phiên bản trước của trình thông dịch đã báo cáo những vị trí khó hiểu là vị trí của lỗi cú pháp:
Tệp "example.py", dòng 3
some_other_code = foo()
^
Lỗi cú pháp: cú pháp không hợp lệ
nhưng trong Python 3.10, một lỗi có nhiều thông tin hơn được phát hiện:
Tệp "example.py", dòng 1
dự kiến = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
^
Cú phápError: '{' chưa bao giờ bị đóng
Theo cách tương tự, các lỗi liên quan đến chuỗi ký tự không được đóng (dấu ngoặc đơn và dấu ngoặc kép) hiện trỏ đến phần đầu của chuỗi thay vì báo cáo EOF/EOL.
Những cải tiến này được lấy cảm hứng từ công việc trước đây trong trình thông dịch PyPy.
(Được đóng góp bởi Pablo Galindo trong bpo-42864 và Batuhan Taskaya trong bpo-40176.)
Giờ đây, các ngoại lệ SyntaxError do trình thông dịch đưa ra sẽ làm nổi bật toàn bộ phạm vi lỗi của biểu thức cấu thành lỗi cú pháp, thay vì chỉ nơi phát hiện sự cố. Theo cách này, thay vì hiển thị (trước Python 3.10):
>>> foo(x, z cho z trong phạm vi(10), t, w)
Tệp "<stdin>", dòng 1
foo(x, z cho z trong phạm vi (10), t, w)
^
Lỗi Cú pháp: Biểu thức trình tạo phải được đặt trong ngoặc đơn
bây giờ Python 3.10 sẽ hiển thị ngoại lệ là:
>>> foo(x, z cho z trong phạm vi(10), t, w)
Tệp "<stdin>", dòng 1
foo(x, z cho z trong phạm vi (10), t, w)
^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^
Lỗi Cú pháp: Biểu thức trình tạo phải được đặt trong ngoặc đơn
Cải tiến này được đóng góp bởi Pablo Galindo trong bpo-43914.
Một lượng đáng kể các thông báo chuyên biệt mới dành cho các ngoại lệ SyntaxError đã được kết hợp. Một số trong những điều đáng chú ý nhất là như sau:
Thiếu
:trước khối:>>> nếu rocket.position > event_horizon Tệp "<stdin>", dòng 1 nếu tên lửa.position> sự kiện_horizon ^ Lỗi cú pháp: mong đợi ':'
(Được đóng góp bởi Pablo Galindo trong bpo-42997.)
Các bộ dữ liệu không được đóng dấu ngoặc đơn trong mục tiêu hiểu:
>>> {x,y cho x,y trong zip('abcd', '1234')} Tệp "<stdin>", dòng 1 {x,y cho x,y trong zip('abcd', '1234')} ^ Cú phápError: bạn có quên dấu ngoặc đơn xung quanh mục tiêu hiểu không?
(Được đóng góp bởi Pablo Galindo trong bpo-43017.)
Thiếu dấu phẩy trong bộ sưu tập chữ và giữa các biểu thức:
>>> mục = { ... x: 1, ... y: 2 ... z: 3, Tệp "<stdin>", dòng 3 y: 2 ^ Lỗi cú pháp: cú pháp không hợp lệ. Có lẽ bạn quên dấu phẩy?
(Được đóng góp bởi Pablo Galindo trong bpo-43822.)
Nhiều loại ngoại lệ không có dấu ngoặc đơn:
>>> thử: ... build_dyson_sphere() ... ngoại trừ NotEnoughScienceError, NotEnoughResourcesError: Tệp "<stdin>", dòng 3 ngoại trừ NotEnoughScienceError, NotEnoughResourcesError: ^ Lỗi cú pháp: nhiều loại ngoại lệ phải được đặt trong ngoặc đơn
(Được đóng góp bởi Pablo Galindo trong bpo-43149.)
Thiếu
:và các giá trị trong từ điển:>>> giá trị = { ... x: 1, ... y: 2, ...z: ... } Tệp "<stdin>", dòng 4 z: ^ Lỗi Cú pháp: biểu thức được mong đợi sau khóa từ điển và ':' >>> giá trị = {x:1, y:2, z w:3} Tệp "<stdin>", dòng 1 giá trị = {x:1, y:2, z w:3} ^ Lỗi cú pháp: ':' được mong đợi sau khóa từ điển
(Được đóng góp bởi Pablo Galindo trong bpo-43823.)
Khối
trykhông có khốiexcepthoặcfinally:>>> thử: ... x = 2 ... cái gì đó = 3 Tệp "<stdin>", dòng 3 cái gì đó = 3 ^^ ^^^ ^^ ^^ Lỗi cú pháp: khối 'ngoại trừ' hoặc 'cuối cùng' được mong đợi
(Được đóng góp bởi Pablo Galindo trong bpo-44305.)
Cách sử dụng
=thay vì==khi so sánh:>>> nếu rocket.position = event_horizon: Tệp "<stdin>", dòng 1 nếu rocket.position = event_horizon: ^ Lỗi cú pháp: không thể gán thuộc tính ở đây. Có lẽ ý bạn là '==' thay vì '='?
(Được đóng góp bởi Pablo Galindo trong bpo-43797.)
Cách sử dụng
*trong chuỗi f:>>> f"Lỗ đen {*all_black_holes} và những khám phá" Tệp "<stdin>", dòng 1 (*all_black_holes) ^ Cú phápError: chuỗi f: không thể sử dụng biểu thức được gắn dấu sao ở đây
(Được đóng góp bởi Pablo Galindo trong bpo-41064.)
Lỗi thụt lề¶
Nhiều trường hợp ngoại lệ IndentationError hiện có nhiều ngữ cảnh hơn liên quan đến loại khối nào đang mong đợi thụt lề, bao gồm cả vị trí của câu lệnh:
>>> def foo():
... nếu:
... x = 2
Tệp "<stdin>", dòng 3
x = 2
^
IndentationError: mong đợi một khối thụt lề sau câu lệnh 'if' ở dòng 2
Lỗi thuộc tính¶
Khi in AttributeError, PyErr_Display() sẽ đưa ra gợi ý về tên thuộc tính tương tự trong đối tượng mà ngoại lệ được tạo ra từ đó:
>>> bộ sưu tập.namedtoplo
Traceback (cuộc gọi gần đây nhất):
Tệp "<stdin>", dòng 1, trong <module>
AttributionError: mô-đun 'bộ sưu tập' không có thuộc tính 'nametoplo'. Có phải ý bạn là: có têntuple?
(Được đóng góp bởi Pablo Galindo trong bpo-38530.)
Cảnh báo
Lưu ý rằng điều này sẽ không hoạt động nếu PyErr_Display() không được gọi để hiển thị lỗi có thể xảy ra nếu sử dụng một số chức năng hiển thị lỗi tùy chỉnh khác. Đây là tình huống phổ biến trong một số REPL như IPython.
TênLỗi¶
Khi in NameError do trình thông dịch đưa ra, PyErr_Display() sẽ đưa ra gợi ý về các tên biến tương tự trong hàm mà ngoại lệ được tạo ra từ đó:
>>> schwarzschild_black_hole = Không
>>> schwarschild_black_hole
Traceback (cuộc gọi gần đây nhất):
Tệp "<stdin>", dòng 1, trong <module>
NameError: tên 'schwarschild_black_hole' không được xác định. Có phải ý bạn là: schwarzschild_black_hole?
(Được đóng góp bởi Pablo Galindo trong bpo-38530.)
Cảnh báo
Lưu ý rằng điều này sẽ không hoạt động nếu PyErr_Display() không được gọi để hiển thị lỗi, điều này có thể xảy ra nếu sử dụng một số chức năng hiển thị lỗi tùy chỉnh khác. Đây là tình huống phổ biến trong một số REPL như IPython.
PEP 626: Số dòng chính xác để gỡ lỗi và các công cụ khác¶
PEP 626 mang đến số dòng chính xác và đáng tin cậy hơn cho các công cụ gỡ lỗi, lập hồ sơ và bảo hiểm. Các sự kiện theo dõi, với số dòng chính xác, được tạo cho tất cả các dòng mã được thực thi và chỉ dành cho các dòng mã được thực thi.
Thuộc tính f_lineno của đối tượng khung sẽ luôn chứa số dòng dự kiến.
Thuộc tính co_lnotab của code objects không được dùng nữa và sẽ bị xóa trong phiên bản 3.12. Mã cần chuyển đổi từ offset sang số dòng nên sử dụng phương thức co_lines() mới để thay thế.
PEP 634: Khớp mẫu cấu trúc¶
Kết hợp mẫu cấu trúc đã được thêm vào dưới dạng mẫu match statement và case statements với các hành động liên quan. Các mẫu bao gồm các chuỗi, ánh xạ, kiểu dữ liệu nguyên thủy cũng như các thể hiện của lớp. So khớp mẫu cho phép các chương trình trích xuất thông tin từ các kiểu dữ liệu phức tạp, phân nhánh theo cấu trúc dữ liệu và áp dụng các hành động cụ thể dựa trên các dạng dữ liệu khác nhau.
Cú pháp và thao tác¶
Cú pháp chung của khớp mẫu là:
chủ đề phù hợp:
trường hợp <mẫu_1>:
<hành động_1>
trường hợp <mẫu_2>:
<hành động_2>
trường hợp <mẫu_3>:
<hành động_3>
trường hợp _:
<action_wildcard>
Câu lệnh so khớp lấy một biểu thức và so sánh giá trị của nó với các mẫu liên tiếp được đưa ra dưới dạng một hoặc nhiều khối chữ hoa. Cụ thể, khớp mẫu hoạt động bằng cách:
sử dụng dữ liệu có loại và hình dạng (
subject)đánh giá
subjecttrong câu lệnhmatchso sánh chủ đề với từng mẫu trong câu lệnh
casetừ trên xuống dưới cho đến khi sự trùng khớp được xác nhận.thực hiện hành động liên quan đến mẫu của kết quả khớp đã được xác nhận
Nếu kết quả khớp chính xác không được xác nhận thì trường hợp cuối cùng, ký tự đại diện
_, nếu được cung cấp, sẽ được sử dụng làm trường hợp khớp. Nếu kết quả khớp chính xác không được xác nhận và trường hợp ký tự đại diện không tồn tại thì toàn bộ khối khớp là không hoạt động.
Cách tiếp cận khai báo¶
Người đọc có thể biết đến việc khớp mẫu thông qua ví dụ đơn giản về việc khớp một chủ đề (đối tượng dữ liệu) với một nghĩa đen (mẫu) bằng câu lệnh switch được tìm thấy trong C, Java hoặc JavaScript (và nhiều ngôn ngữ khác). Thông thường câu lệnh switch được sử dụng để so sánh một đối tượng/biểu thức với các câu lệnh case chứa hằng.
Bạn có thể tìm thấy những ví dụ mạnh mẽ hơn về khớp mẫu trong các ngôn ngữ như Scala và Elixir. Với việc so khớp mẫu cấu trúc, cách tiếp cận là "khai báo" và nêu rõ các điều kiện (mẫu) để dữ liệu khớp.
Mặc dù một loạt các hướng dẫn "bắt buộc" sử dụng các câu lệnh "if" lồng nhau có thể được sử dụng để thực hiện điều gì đó tương tự như đối sánh mẫu cấu trúc, nhưng nó không rõ ràng bằng cách tiếp cận "khai báo". Thay vào đó, cách tiếp cận "khai báo" nêu rõ các điều kiện cần đáp ứng để khớp và dễ đọc hơn thông qua các mẫu rõ ràng của nó. Mặc dù việc so khớp mẫu cấu trúc có thể được sử dụng ở dạng đơn giản nhất để so sánh một biến với một chữ trong câu lệnh tình huống, nhưng giá trị thực sự của nó đối với Python nằm ở việc xử lý loại và hình dạng của chủ thể.
Mẫu đơn giản: khớp với chữ¶
Hãy xem ví dụ này dưới dạng khớp mẫu ở dạng đơn giản nhất: một giá trị, chủ đề, được khớp với một số chữ, các mẫu. Trong ví dụ bên dưới, status là chủ đề của câu lệnh so khớp. Các mẫu là mỗi câu lệnh tình huống, trong đó các chữ đại diện cho mã trạng thái yêu cầu. Hành động liên quan đến trường hợp được thực thi sau khi khớp:
def http_error(trạng thái):
trạng thái trận đấu:
trường hợp 400:
trả về "Yêu cầu không hợp lệ"
trường hợp 404:
trả về "Không tìm thấy"
trường hợp 418:
return “Tôi là ấm trà”
trường hợp _:
return "Đã xảy ra sự cố với Internet"
Nếu hàm trên được thông qua status là 418, thì "Tôi là ấm trà" sẽ được trả về. Nếu hàm trên được thông qua status là 500, câu lệnh tình huống có _ sẽ khớp dưới dạng ký tự đại diện và trả về "Đã xảy ra lỗi với Internet". Lưu ý khối cuối cùng: tên biến, _, hoạt động như wildcard và đảm bảo chủ đề sẽ luôn khớp. Việc sử dụng _ là tùy chọn.
Bạn có thể kết hợp nhiều chữ trong một mẫu bằng cách sử dụng | ("hoặc"):
trường hợp 401 | 403 | 404:
trả về "Không được phép"
Hành vi không có ký tự đại diện¶
Nếu chúng ta sửa đổi ví dụ trên bằng cách loại bỏ khối trường hợp cuối cùng, ví dụ sẽ trở thành:
def http_error(trạng thái):
trạng thái trận đấu:
trường hợp 400:
trả về "Yêu cầu không hợp lệ"
trường hợp 404:
trả về "Không tìm thấy"
trường hợp 418:
return “Tôi là ấm trà”
Nếu không sử dụng _ trong câu lệnh tình huống, kết quả trùng khớp có thể không tồn tại. Nếu không có kết quả phù hợp thì hành vi đó là không hoạt động. Ví dụ: nếu status 500 được thông qua thì sẽ xảy ra tình trạng không hoạt động.
Các mẫu có chữ và biến¶
Các mẫu có thể trông giống như việc giải nén các bài tập và một mẫu có thể được sử dụng để liên kết các biến. Trong ví dụ này, một điểm dữ liệu có thể được giải nén thành tọa độ x và tọa độ y
# point là một bộ (x, y)
điểm phù hợp:
trường hợp (0, 0):
in ("Xuất xứ")
trường hợp (0, y):
print(f"Y={y}")
trường hợp (x, 0):
in(f"X={x}")
trường hợp (x, y):
print(f"X={x}, Y={y}")
trường hợp _:
tăng ValueError("Không một điểm")
Mẫu đầu tiên có hai chữ cái, (0, 0) và có thể được coi là phần mở rộng của mẫu chữ được hiển thị ở trên. Hai mẫu tiếp theo kết hợp một chữ và một biến, và biến binds một giá trị từ chủ đề (point). Mẫu thứ tư ghi lại hai giá trị, làm cho nó tương tự về mặt khái niệm với phép gán giải nén (x, y) = point.
Các mẫu và lớp¶
Nếu bạn đang sử dụng các lớp để cấu trúc dữ liệu của mình, bạn có thể sử dụng làm mẫu tên lớp, theo sau là danh sách đối số giống như hàm tạo. Mẫu này có khả năng nắm bắt các thuộc tính cá thể thành các biến
Điểm lớp:
def __init__(self, x, y):
tự.x = x
tự.y = y
vị trí xác định (điểm):
điểm phù hợp:
trường hợp Điểm(x=0, y=0):
print("Nguồn gốc là vị trí của điểm.")
trường hợp Điểm(x=0, y=y):
print(f"Y={y} và điểm nằm trên trục y.")
trường hợp Điểm(x=x, y=0):
print(f"X={x} và điểm nằm trên trục x.")
trường hợp Điểm():
print("Điểm nằm ở một nơi khác trên mặt phẳng.")
trường hợp _:
print("Không có điểm")
Các mẫu có tham số vị trí¶
Bạn có thể sử dụng các tham số vị trí với một số lớp dựng sẵn cung cấp thứ tự cho các thuộc tính của chúng (ví dụ: các lớp dữ liệu). Bạn cũng có thể xác định vị trí cụ thể cho các thuộc tính trong mẫu bằng cách đặt thuộc tính đặc biệt __match_args__ trong các lớp của mình. Nếu nó được đặt thành ("x", "y"), thì các mẫu sau đều tương đương (và tất cả đều liên kết thuộc tính y với biến var):
Điểm(1, var)
Điểm(1, y=var)
Điểm(x=1, y=var)
Điểm(y=var, x=1)
Các mẫu lồng nhau¶
Các mẫu có thể được lồng vào nhau tùy ý. Ví dụ: nếu dữ liệu của chúng tôi là một danh sách ngắn các điểm, nó có thể được khớp như thế này
điểm phù hợp:
trường hợp []:
print("Không có điểm nào trong danh sách.")
trường hợp [Điểm(0, 0)]:
print("Gốc là điểm duy nhất trong danh sách.")
trường hợp [Điểm(x, y)]:
print(f"Một điểm duy nhất {x}, {y} có trong danh sách.")
trường hợp [Điểm(0, y1), Điểm(0, y2)]:
print(f"Hai điểm trên trục Y tại {y1}, {y2} đều có trong danh sách.")
trường hợp _:
print("Có gì đó khác được tìm thấy trong danh sách.")
Các mẫu phức tạp và ký tự đại diện¶
Đến thời điểm này, các ví dụ chỉ sử dụng _ trong câu lệnh tình huống cuối cùng. Ký tự đại diện có thể được sử dụng trong các mẫu phức tạp hơn, chẳng hạn như ('error', code, _). Ví dụ:
khớp test_variable:
trường hợp ('cảnh báo', mã, 40):
print("Đã nhận được cảnh báo.")
trường hợp ('lỗi', mã, _):
print(f"Đã xảy ra lỗi {code}.")
Trong trường hợp trên, test_variable sẽ khớp với ('error', code, 100) và ('error', code, 800).
bảo vệ¶
Chúng ta có thể thêm mệnh đề if vào một mẫu, được gọi là "bảo vệ". Nếu bảo vệ sai, match tiếp tục thử khối trường hợp tiếp theo. Lưu ý rằng việc thu thập giá trị xảy ra trước khi bảo vệ được đánh giá
điểm phù hợp:
trường hợp Điểm(x, y) if x == y:
print(f"Điểm nằm trên đường chéo Y=X tại {x}.")
trường hợp Điểm(x, y):
print(f"Điểm không nằm trên đường chéo.")
Các tính năng chính khác¶
Một số tính năng chính khác:
Giống như các bài tập giải nén, các mẫu bộ và danh sách có ý nghĩa giống hệt nhau và thực sự khớp với các chuỗi tùy ý. Về mặt kỹ thuật, chủ đề phải có một trình tự. Do đó, một ngoại lệ quan trọng là các mẫu không khớp với các vòng lặp. Ngoài ra, để tránh một lỗi phổ biến, các mẫu trình tự không khớp với chuỗi.
Các mẫu trình tự hỗ trợ các ký tự đại diện:
[x, y, *rest]và(x, y, *rest)hoạt động tương tự như các ký tự đại diện trong các bài tập giải nén. Tên sau*cũng có thể là_, vì vậy(x, y, *_)khớp với một chuỗi gồm ít nhất hai mục mà không ràng buộc các mục còn lại.Các mẫu ánh xạ:
{"bandwidth": b, "latency": l}ghi lại các giá trị"bandwidth"và"latency"từ một lệnh. Không giống như các mẫu trình tự, các phím bổ sung sẽ bị bỏ qua. Ký tự đại diện**restcũng được hỗ trợ. (Nhưng**_sẽ dư thừa nên không được phép.)Các mẫu con có thể được ghi lại bằng từ khóa
as:trường hợp (Điểm(x1, y1), Điểm(x2, y2) as p2): ...
Điều này liên kết x1, y1, x2, y2 như bạn mong đợi nếu không có mệnh đề
asvà p2 với toàn bộ mục thứ hai của chủ đề.Hầu hết các nghĩa đen được so sánh bằng sự bình đẳng. Tuy nhiên, các singletons
True,FalsevàNoneđược so sánh theo danh tính.Các hằng số được đặt tên có thể được sử dụng trong các mẫu. Các hằng số được đặt tên này phải là tên có dấu chấm để ngăn không cho hằng số bị hiểu là biến chụp:
từ nhập enum Enum Màu lớp (Enum): RED = 0 GREEN = 1 BLUE = 2 màu = Color.GREEN màu sắc phù hợp: trường hợp Color.RED: print("Tôi thấy màu đỏ!") trường hợp Color.GREEN: print("Cỏ xanh") trường hợp Color.BLUE: print("Tôi đang cảm thấy chán nản :(")
Để biết thông số kỹ thuật đầy đủ, hãy xem PEP 634. Động lực và lý do có trong PEP 635 và hướng dẫn dài hơn có trong PEP 636.
Tùy chọn EncodingWarning và encoding="locale" tùy chọn¶
Mã hóa mặc định của TextIOWrapper và open() phụ thuộc vào nền tảng và ngôn ngữ. Vì UTF-8 được sử dụng trên hầu hết các nền tảng Unix nên việc bỏ qua tùy chọn encoding khi mở tệp UTF-8 (ví dụ: JSON, YAML, TOML, Markdown) là một lỗi rất phổ biến. Ví dụ:
# BUG: nên sử dụng chế độ "rb" hoặc mã hóa="utf-8".
với open("data.json") là f:
dữ liệu = json.load(f)
Để tìm loại lỗi này, một EncodingWarning tùy chọn sẽ được thêm vào. Nó được phát ra khi sys.flags.warn_default_encoding là đúng và mã hóa mặc định dành riêng cho miền địa phương được sử dụng.
Tùy chọn -X warn_default_encoding và PYTHONWARNDEFAULTENCODING được thêm vào để bật cảnh báo.
Xem Mã hóa văn bản để biết thêm thông tin.
Những thay đổi ngôn ngữ khác¶
Loại
intcó một phương thức mớiint.bit_count(), trả về số đơn vị trong khai triển nhị phân của một số nguyên nhất định, còn được gọi là số lượng quần thể. (Được đóng góp bởi Niklas Fiekas trong bpo-29882.)Các chế độ xem được trả về bởi
dict.keys(),dict.values()vàdict.items()hiện đều có thuộc tínhmappingcung cấp đối tượngtypes.MappingProxyTypebao bọc từ điển gốc. (Được đóng góp bởi Dennis Sweeney trong bpo-40890.)PEP 618: Hàm
zip()hiện có cờstricttùy chọn, được sử dụng để yêu cầu tất cả các lần lặp có độ dài bằng nhau.Các hàm dựng sẵn và mở rộng lấy đối số nguyên không còn chấp nhận
Decimals,Fractions và các đối tượng khác có thể được chuyển đổi thành số nguyên chỉ bị mất (ví dụ: có phương thức__int__()nhưng không có phương thức__index__()). (Được đóng góp bởi Serhiy Storchaka trong bpo-37999.)Nếu
object.__ipow__()trả vềNotImplemented, toán tử sẽ quay trở lạiobject.__pow__()vàobject.__rpow__()một cách chính xác như mong đợi. (Được đóng góp bởi Alex Shkop trong bpo-38302.)Giờ đây, các biểu thức gán có thể được sử dụng không có dấu ngoặc đơn trong các ký tự cố định và mức độ hiểu tập hợp, cũng như trong các chỉ mục trình tự (nhưng không phải các lát cắt).
Các hàm có thuộc tính
__builtins__mới được sử dụng để tìm kiếm các ký hiệu dựng sẵn khi một hàm được thực thi, thay vì nhìn vào__globals__['__builtins__']. Thuộc tính được khởi tạo từ__globals__["__builtins__"]nếu nó tồn tại, nếu không thì từ nội trang hiện tại. (Được đóng góp bởi Mark Shannon trong bpo-42990.)Hai hàm dựng sẵn mới --
aiter()vàanext()đã được thêm vào để cung cấp các bản sao không đồng bộ tương ứng choiter()vànext(). (Được đóng góp bởi Joshua Bronson, Daniel Pope và Justin Wang trong bpo-31861.)Các phương thức tĩnh (
@staticmethod) và các phương thức lớp (@classmethod) hiện kế thừa các thuộc tính của phương thức (__module__,__name__,__qualname__,__doc__,__annotations__) và có thuộc tính__wrapped__mới. Hơn nữa, các phương thức tĩnh hiện có thể gọi được như các hàm thông thường. (Được đóng góp bởi Victor Stinner trong bpo-43682.)Chú thích cho các mục tiêu phức tạp (mọi thứ ngoài mục tiêu
simple nameđược xác định bởi PEP 526) không còn gây ra bất kỳ hiệu ứng thời gian chạy nào vớifrom __future__ import annotations. (Được đóng góp bởi Batuhan Taskaya trong bpo-42737.)Các đối tượng lớp và mô-đun giờ đây có thể lười biếng tạo các chú thích trống theo yêu cầu. Các ký tự chú thích được lưu trữ trong
__dict__của đối tượng để tương thích ngược. Điều này cải thiện các phương pháp hay nhất để làm việc với__annotations__; để biết thêm thông tin, vui lòng xem Các phương pháp hay nhất về chú thích. (Được đóng góp bởi Larry Hastings trong bpo-43901.)Các chú thích bao gồm
yield,yield from,awaithoặc các biểu thức được đặt tên hiện bị cấm trongfrom __future__ import annotationsdo tác dụng phụ của chúng. (Được đóng góp bởi Batuhan Taskaya trong bpo-42725.)Việc sử dụng các biến không liên kết,
super()và các biểu thức khác có thể làm thay đổi quá trình xử lý bảng ký hiệu vì các chú thích hiện không còn hiệu lực trongfrom __future__ import annotations. (Được đóng góp bởi Batuhan Taskaya trong bpo-42725.)Băm các giá trị NaN của cả loại
floatvà loạidecimal.Decimalhiện phụ thuộc vào nhận dạng đối tượng. Trước đây, chúng luôn được băm thành0mặc dù các giá trị NaN không bằng nhau. Điều này gây ra hiện tượng thời gian chạy bậc hai có thể xảy ra do xung đột hàm băm quá mức khi tạo từ điển và bộ chứa nhiều NaN. (Được đóng góp bởi Raymond Hettinger trong bpo-43475.)Một
SyntaxError(thay vìNameError) sẽ xuất hiện khi xóa hằng số__debug__. (Được đóng góp bởi Donghee Na trong bpo-45000.)Các ngoại lệ
SyntaxErrorhiện có thuộc tínhend_linenovàend_offset. Họ sẽ làNonenếu không quyết tâm. (Được đóng góp bởi Pablo Galindo trong bpo-43914.)
Mô-đun mới¶
Không.
Mô-đun cải tiến¶
asyncio¶
Thêm phương thức connect_accepted_socket() bị thiếu. (Được đóng góp bởi Alex Grönholm trong bpo-41332.)
phân tích cú pháp¶
Cụm từ gây hiểu lầm "đối số tùy chọn" đã được thay thế bằng "tùy chọn" trong trợ giúp argparse. Một số thử nghiệm có thể yêu cầu điều chỉnh nếu chúng dựa vào kết quả đầu ra chính xác. (Được đóng góp bởi Raymond Hettinger trong bpo-9694.)
mảng¶
Phương thức index() của array.array hiện có các tham số start và stop tùy chọn. (Được đóng góp bởi Anders Lorentsen và Zackery Spytz trong bpo-31956.)
không đồng bộ, không đồng bộ, smtpd¶
Các mô-đun này đã được đánh dấu là không dùng nữa trong tài liệu mô-đun kể từ Python 3.6. Một DeprecationWarning thời gian nhập hiện đã được thêm vào cả ba mô-đun này.
cơ sở64¶
Thêm base64.b32hexencode() và base64.b32hexdecode() để hỗ trợ Mã hóa Base32 với Bảng chữ cái Hex mở rộng.
bdb¶
Thêm clearBreakpoints() để đặt lại tất cả các điểm dừng đã đặt. (Được đóng góp bởi Irit Katriel trong bpo-24160.)
chia đôi¶
Đã thêm khả năng cung cấp chức năng key cho các API trong mô-đun bisect. (Được đóng góp bởi Raymond Hettinger trong bpo-4356.)
codec¶
Thêm chức năng codecs.unregister() để hủy đăng ký chức năng tìm kiếm codec. (Được đóng góp bởi Hai Shi trong bpo-41842.)
bộ sưu tập.abc¶
__args__ của parameterized generic dành cho collections.abc.Callable hiện đã nhất quán với typing.Callable. 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. Lưu ý rằng TypeError có thể được nâng lên đố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. (Được đóng góp bởi Ken Jin trong bpo-42195.)
bối cảnh¶
Thêm trình quản lý bối cảnh contextlib.aclosing() để đóng các trình tạo không đồng bộ và các đối tượng đại diện cho các tài nguyên được phát hành không đồng bộ một cách an toàn. (Được đóng góp bởi Jongi Kim và John Belmonte trong bpo-41229.)
Thêm hỗ trợ trình quản lý bối cảnh không đồng bộ vào contextlib.nullcontext(). (Được đóng góp bởi Tom Gringauz trong bpo-41543.)
Thêm AsyncContextDecorator, để hỗ trợ việc sử dụng trình quản lý bối cảnh không đồng bộ làm công cụ trang trí.
chửi rủa¶
Các hàm màu mở rộng được thêm vào trong ncurses 6.1 sẽ được curses.color_content(), curses.init_color(), curses.init_pair() và curses.pair_content() sử dụng một cách minh bạch. Một hàm mới, curses.has_extended_color_support(), cho biết liệu thư viện ncurses cơ bản có cung cấp hỗ trợ màu mở rộng hay không. (Được đóng góp bởi Jeffrey Kintscher và Hans Petter Jansson trong bpo-36982.)
Các hằng số BUTTON5_* hiện được hiển thị trong mô-đun curses nếu chúng được cung cấp bởi thư viện lời nguyền cơ bản. (Được đóng góp bởi Zackery Spytz trong bpo-39273.)
các lớp dữ liệu¶
__khe__¶
Đã thêm tham số slots trong trang trí dataclasses.dataclass(). (Được đóng góp bởi Yurii Karabas trong bpo-42269)
Các trường chỉ có từ khóa¶
các lớp dữ liệu hiện hỗ trợ các trường chỉ có từ khóa trong phương thức __init__ được tạo. Có một số cách để chỉ định các trường chỉ có từ khóa.
Bạn có thể nói rằng mọi trường chỉ có từ khóa:
từ các lớp dữ liệu nhập lớp dữ liệu
@dataclass(kw_only=True)
Ngày sinh của lớp:
tên: str
sinh nhật: datetime.date
Cả name và birthday đều là các tham số chỉ có từ khóa cho phương thức __init__ được tạo.
Bạn có thể chỉ định từ khóa trên cơ sở từng trường:
từ các lớp dữ liệu nhập lớp dữ liệu, trường
@dataclass
Ngày sinh của lớp:
tên: str
ngày sinh: datetime.date = field(kw_only=True)
Ở đây chỉ có birthday là từ khóa. Nếu bạn đặt kw_only trên các trường riêng lẻ, hãy lưu ý rằng có các quy tắc về sắp xếp lại các trường do các trường chỉ có từ khóa cần phải theo sau các trường không chỉ có từ khóa. Xem tài liệu đầy đủ về lớp dữ liệu để biết chi tiết.
Bạn cũng có thể chỉ định rằng tất cả các trường theo sau điểm đánh dấu KW_ONLY đều chỉ chứa từ khóa. Đây có lẽ sẽ là cách sử dụng phổ biến nhất:
từ các lớp dữ liệu nhập lớp dữ liệu, KW_ONLY
@dataclass
Điểm lớp:
x: nổi
y: trôi nổi
_: KW_ONLY
z: phao = 0,0
t: phao = 0,0
Ở đây, z và t là các tham số chỉ dành cho từ khóa, trong khi x và y thì không. (Được đóng góp bởi Eric V. Smith trong bpo-43532.)
nước cất¶
Toàn bộ gói distutils không được dùng nữa và sẽ bị xóa trong Python 3.12. Chức năng chỉ định các bản dựng gói của nó đã được thay thế hoàn toàn bằng các gói setuptools và packaging của bên thứ ba, đồng thời hầu hết các API được sử dụng phổ biến khác đều có sẵn ở những nơi khác trong thư viện chuẩn (chẳng hạn như platform, shutil, subprocess hoặc sysconfig). Không có kế hoạch di chuyển bất kỳ chức năng nào khác từ distutils và các ứng dụng đang sử dụng các chức năng khác nên có kế hoạch tạo các bản sao mã riêng tư. Tham khảo PEP 632 để thảo luận.
Lệnh bdist_wininst không được dùng nữa trong Python 3.8 đã bị xóa. Lệnh bdist_wheel hiện được khuyến nghị để phân phối các gói nhị phân trên Windows. (Được đóng góp bởi Victor Stinner trong bpo-42802.)
doc nhất¶
Khi một mô-đun không xác định __loader__, hãy quay lại __spec__.loader. (Được đóng góp bởi Brett Cannon trong bpo-42133.)
mã hóa¶
encodings.normalize_encoding() hiện bỏ qua các ký tự không phải ASCII. (Được đóng góp bởi Hai Shi trong bpo-39337.)
liệt kê¶
Enum __repr__() hiện trả về enum_name.member_name và __str__() hiện trả về member_name. Các enum Stdlib có sẵn dưới dạng hằng số mô-đun có repr() là module_name.member_name. (Được đóng góp bởi Ethan Furman trong bpo-40066.)
Thêm enum.StrEnum cho enum trong đó tất cả thành viên đều là chuỗi. (Được đóng góp bởi Ethan Furman trong bpo-41816.)
đầu vào tập tin¶
Thêm thông số encoding và errors trong fileinput.input() và fileinput.FileInput. (Được đóng góp bởi Inada Naoki trong bpo-43712.)
fileinput.hook_compressed() hiện trả về đối tượng TextIOWrapper khi mode là "r" và tệp được nén, giống như tệp không nén. (Được đóng góp bởi Inada Naoki trong bpo-5758.)
người xử lý lỗi¶
Mô-đun faulthandler hiện phát hiện xem có xảy ra lỗi nghiêm trọng trong quá trình thu thập rác hay không. (Được đóng góp bởi Victor Stinner trong bpo-44466.)
gc¶
Thêm móc kiểm tra cho gc.get_objects(), gc.get_referrers() và gc.get_referents(). (Được đóng góp bởi Pablo Galindo trong bpo-43439.)
quả địa cầu¶
Thêm tham số root_dir và dir_fd trong glob() và iglob() cho phép chỉ định thư mục gốc để tìm kiếm. (Được đóng góp bởi Serhiy Storchaka trong bpo-38144.)
hàm băm¶
Mô-đun hashlib yêu cầu OpenSSL 1.1.1 hoặc mới hơn. (Được đóng góp bởi Christian Heimes trong PEP 644 và bpo-43669.)
Mô-đun hashlib có hỗ trợ sơ bộ cho OpenSSL 3.0.0. (Được đóng góp bởi Christian Heimes trên bpo-38820 và các số khác.)
Dự phòng Python thuần túy của pbkdf2_hmac() không được dùng nữa. Trong tương lai PBKDF2-HMAC sẽ chỉ khả dụng khi Python được xây dựng với sự hỗ trợ OpenSSL. (Được đóng góp bởi Christian Heimes trong bpo-43880.)
hmac¶
Mô-đun hmac hiện sử dụng triển khai HMAC của OpenSSL trong nội bộ. (Được đóng góp bởi Christian Heimes trong bpo-40645.)
IDLE và nhàn rỗi¶
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.)
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.)
Những thay đổi ở trên đã được chuyển sang bản phát hành bảo trì 3.9.
Thêm thanh bên Shell. Di chuyển dấu nhắc chính ('>>>') sang thanh bên. Thêm lời nhắc phụ ('...') vào thanh bên. Nhấp chuột trái và kéo tùy chọn sẽ chọn một hoặc nhiều dòng văn bản, giống như với thanh bên số dòng của trình soạn thảo. Nhấp chuột phải sau khi chọn dòng văn bản sẽ hiển thị menu ngữ cảnh với 'sao chép có lời nhắc'. Thao tác này sẽ kết hợp các lời nhắc từ thanh bên với các dòng từ văn bản đã chọn. Tùy chọn này cũng xuất hiện trên menu ngữ cảnh cho văn bản. (Được đóng góp bởi Tal Einat trong bpo-37903.)
Sử dụng dấu cách thay vì tab để thụt lề mã tương tác. Điều này làm cho các mục nhập mã tương tác 'nhìn đúng'. Làm cho điều này trở nên khả thi là động lực chính để thêm thanh bên shell. (Được đóng góp bởi Terry Jan Reedy trong bpo-37892.)
Làm nổi bật soft keywords match, case và _ mới trong các câu lệnh khớp mẫu. Tuy nhiên, việc tô sáng này không hoàn hảo và sẽ không chính xác trong một số trường hợp hiếm gặp, bao gồm một số _-s trong mẫu case. (Được đóng góp bởi Tal Einat trong bpo-44010.)
Tính năng mới trong bản phát hành bảo trì 3.10.
Áp dụng tô sáng cú pháp cho các tệp .pyi. (Được đóng góp bởi Alex Waygood và Terry Jan Reedy trong bpo-45447.)
Bao gồm các lời nhắc khi lưu Shell với đầu vào và đầu ra. (Được đóng góp bởi Terry Jan Reedy trong gh-95191.)
importlib.metadata¶
Tính năng tương đương với importlib_metadata 4.6 (history).
importlib.metadata entry points hiện cung cấp trải nghiệm thú vị hơn khi chọn điểm vào theo nhóm và tên thông qua lớp importlib.metadata.EntryPoints mới. Xem Ghi chú tương thích trong tài liệu để biết thêm thông tin về việc không dùng nữa và cách sử dụng.
Đã thêm importlib.metadata.packages_distributions() để phân giải các mô-đun và gói Python cấp cao nhất vào importlib.metadata.Distribution của chúng.
kiểm tra¶
Khi một mô-đun không xác định __loader__, hãy quay lại __spec__.loader. (Được đóng góp bởi Brett Cannon trong bpo-42133.)
Thêm inspect.get_annotations(), tính toán an toàn các chú thích được xác định trên một đối tượng. Nó giải quyết những vấn đề khó khăn khi truy cập các chú thích trên nhiều loại đối tượng khác nhau và đưa ra rất ít giả định về đối tượng mà nó kiểm tra. inspect.get_annotations() cũng có thể hủy chuỗi các chú thích được xâu chuỗi một cách chính xác. inspect.get_annotations() hiện được coi là cách thực hành tốt nhất để truy cập vào chú thích dict được xác định trên bất kỳ đối tượng Python nào; để biết thêm thông tin về các phương pháp hay nhất để làm việc với chú thích, vui lòng xem Các phương pháp hay nhất về chú thích. Liên quan, inspect.signature(), inspect.Signature.from_callable() và inspect.Signature.from_function() hiện gọi inspect.get_annotations() để truy xuất chú thích. Điều này có nghĩa là inspect.signature() và inspect.Signature.from_callable() hiện cũng có thể hủy chuỗi các chú thích dạng chuỗi. (Được đóng góp bởi Larry Hastings trong bpo-43817.)
itertools¶
Thêm itertools.pairwise(). (Được đóng góp bởi Raymond Hettinger trong bpo-38200.)
bộ đệm dòng¶
Khi một mô-đun không xác định __loader__, hãy quay lại __spec__.loader. (Được đóng góp bởi Brett Cannon trong bpo-42133.)
hệ điều hành¶
Thêm hỗ trợ os.cpu_count() cho VxWorks RTOS. (Được đóng góp bởi Peixing Xin trong bpo-41440.)
Thêm chức năng mới os.eventfd() và các trợ giúp liên quan để bao bọc tòa nhà eventfd2 trên Linux. (Được đóng góp bởi Christian Heimes trong bpo-41001.)
Thêm os.splice() cho phép di chuyển dữ liệu giữa hai bộ mô tả tệp mà không cần sao chép giữa không gian địa chỉ kernel và không gian địa chỉ người dùng, trong đó một trong các bộ mô tả tệp phải tham chiếu đến một đường dẫn. (Được đóng góp bởi Pablo Galindo trong bpo-41625.)
Thêm O_EVTONLY, O_FSYNC, O_SYMLINK và O_NOFOLLOW_ANY cho macOS. (Được đóng góp bởi Donghee Na trong bpo-43106.)
os.path¶
os.path.realpath() hiện chấp nhận đối số chỉ từ khóa strict. Khi được đặt thành True, OSError sẽ được nâng lên nếu đường dẫn không tồn tại hoặc gặp phải vòng lặp liên kết tượng trưng. (Được đóng góp bởi Barney Gale trong bpo-43757.)
đường dẫn¶
Thêm hỗ trợ lát cho PurePath.parents. (Được đóng góp bởi Joshua Cannon trong bpo-35498.)
Thêm hỗ trợ lập chỉ mục tiêu cực cho PurePath.parents. (Được đóng góp bởi Yaroslav Pankovych trong bpo-21041.)
Thêm phương thức Path.hardlink_to thay thế link_to(). Phương thức mới có cùng thứ tự đối số như symlink_to(). (Được đóng góp bởi Barney Gale trong bpo-39950.)
pathlib.Path.stat() và chmod() hiện chấp nhận đối số chỉ từ khóa follow_symlinks để đảm bảo tính nhất quán với các hàm tương ứng trong mô-đun os. (Được đóng góp bởi Barney Gale trong bpo-39906.)
nền tảng¶
Thêm platform.freedesktop_os_release() để truy xuất nhận dạng hệ điều hành từ tệp tiêu chuẩn freedesktop.org os-release. (Được đóng góp bởi Christian Heimes trong bpo-28468.)
in ấn¶
pprint.pprint() hiện chấp nhận đối số từ khóa underscore_numbers mới. (Được đóng góp bởi sblondon trong bpo-42914.)
pprint hiện có thể in đẹp các phiên bản dataclasses.dataclass. (Được đóng góp bởi Lewis Gaul trong bpo-43080.)
py_compile¶
Thêm tùy chọn --quiet vào giao diện dòng lệnh của py_compile. (Được đóng góp bởi Gregory Schevchenko trong bpo-38731.)
pyclbr¶
Thêm thuộc tính end_lineno vào các đối tượng Function và Class trong cây được trả về bởi pyclbr.readmodule() và pyclbr.readmodule_ex(). Nó khớp với lineno (bắt đầu) hiện có. (Được đóng góp bởi Aviral Srivastava trong bpo-38307.)
kệ¶
Mô-đun shelve hiện sử dụng pickle.DEFAULT_PROTOCOL theo mặc định thay vì giao thức pickle 3 khi tạo giá. (Được đóng góp bởi Zackery Spytz trong bpo-34204.)
thống kê¶
Thêm covariance(), correlation() của Pearson và các hàm linear_regression() đơn giản. (Được đóng góp bởi Tymoteusz Wołodźko trong bpo-38490.)
trang web¶
Khi một mô-đun không xác định __loader__, hãy quay lại __spec__.loader. (Được đóng góp bởi Brett Cannon trong bpo-42133.)
ổ cắm¶
Ngoại lệ socket.timeout hiện là bí danh của TimeoutError. (Được đóng góp bởi Christian Heimes trong bpo-42413.)
Thêm tùy chọn để tạo ổ cắm MPTCP với IPPROTO_MPTCP (Được đóng góp bởi Rui Cunha trong bpo-43571.)
Thêm tùy chọn IP_RECVTOS để nhận loại dịch vụ (ToS) hoặc các trường DSCP/ECN (Được đóng góp bởi Georg Sauthoff trong bpo-44077.)
ssl¶
Mô-đun ssl yêu cầu OpenSSL 1.1.1 hoặc mới hơn. (Được đóng góp bởi Christian Heimes trong PEP 644 và bpo-43669.)
Mô-đun ssl có hỗ trợ sơ bộ cho OpenSSL 3.0.0 và tùy chọn mới OP_IGNORE_UNEXPECTED_EOF. (Được đóng góp bởi Christian Heimes trong bpo-38820, bpo-43794, bpo-43788, bpo-43791, bpo-43799, bpo-43920, bpo-43789 và bpo-43811.)
Hàm không được dùng nữa và việc sử dụng các hằng số không được dùng nữa hiện dẫn đến DeprecationWarning. ssl.SSLContext.options có OP_NO_SSLv2 và OP_NO_SSLv3 được đặt theo mặc định và do đó không thể cảnh báo về việc đặt lại cờ. Zz004zz có danh sách các tính năng không được dùng nữa. (Được đóng góp bởi Christian Heimes trong bpo-43880.)
Mô-đun ssl hiện có cài đặt mặc định an toàn hơn. Mật mã không có tính bảo mật chuyển tiếp hoặc SHA-1 MAC bị tắt theo mặc định. Mức độ bảo mật 2 cấm các khóa RSA, DH và ECC yếu có mức bảo mật dưới 112 bit. SSLContext mặc định là phiên bản giao thức tối thiểu TLS 1.2. Cài đặt dựa trên nghiên cứu của Hynek Schlawack. (Được đóng góp bởi Christian Heimes trong bpo-43998.)
Các giao thức không dùng nữa SSL 3.0, TLS 1.0 và TLS 1.1 không còn được hỗ trợ chính thức. Python không chủ động chặn chúng. Tuy nhiên, các tùy chọn xây dựng OpenSSL, cấu hình phân phối, bản vá của nhà cung cấp và bộ mật mã có thể ngăn cản việc bắt tay thành công.
Thêm tham số timeout vào hàm ssl.get_server_certificate(). (Được đóng góp bởi Zackery Spytz trong bpo-31870.)
Mô-đun ssl sử dụng kiểu khởi tạo heap và nhiều pha. (Được đóng góp bởi Christian Heimes trong bpo-42333.)
Cờ xác minh mới VERIFY_X509_PARTIAL_CHAIN đã được thêm vào. (Được đóng góp bởi l0x trong bpo-40849.)
sqlite3¶
Thêm sự kiện kiểm tra cho connect(), enable_load_extension() và load_extension(). (Được đóng góp bởi Erlend E. Aasland trong bpo-43762.)
hệ thống¶
Thêm thuộc tính sys.orig_argv: danh sách các đối số dòng lệnh gốc được truyền cho tệp thực thi Python. (Được đóng góp bởi Victor Stinner trong bpo-23427.)
Thêm sys.stdlib_module_names, chứa danh sách tên mô-đun thư viện tiêu chuẩn. (Được đóng góp bởi Victor Stinner trong bpo-42955.)
_chủ đề¶
_thread.interrupt_main() hiện lấy số tín hiệu tùy chọn để mô phỏng (mặc định vẫn là signal.SIGINT). (Được đóng góp bởi Antoine Pitrou trong bpo-43356.)
luồng¶
Thêm threading.gettrace() và threading.getprofile() để truy xuất các hàm do threading.settrace() và threading.setprofile() thiết lập tương ứng. (Được đóng góp bởi Mario Corchero trong bpo-42251.)
Thêm threading.__excepthook__ để cho phép truy xuất giá trị ban đầu của threading.excepthook() trong trường hợp nó được đặt thành giá trị bị hỏng hoặc giá trị khác. (Được đóng góp bởi Mario Corchero trong bpo-42308.)
truy nguyên¶
Các hàm format_exception(), format_exception_only() và print_exception() hiện có thể lấy một đối tượng ngoại lệ làm đối số chỉ có vị trí. (Được đóng góp bởi Zackery Spytz và Matthias Bussonnier trong bpo-26389.)
các loại¶
Giới thiệu lại các lớp types.EllipsisType, types.NoneType và types.NotImplementedType, cung cấp một tập hợp các loại mới mà trình kiểm tra loại có thể hiểu được một cách dễ dàng. (Được đóng góp bởi Bas van Beek trong bpo-41810.)
đánh máy¶
Để biết những thay đổi lớn, hãy xem Các tính năng mới liên quan đến gợi ý loại.
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ố không thể băm 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.)
Thêm chức năng mới typing.is_typeddict() để xem xét nội tâm nếu chú thích là typing.TypedDict. (Được đóng góp bởi Patrick Reader trong bpo-41792.)
Các lớp con của typing.Protocol chỉ có các biến dữ liệu được khai báo giờ đây sẽ tăng TypeError khi được kiểm tra bằng isinstance trừ khi chúng được trang trí bằng runtime_checkable(). Trước đây, những cuộc kiểm tra này diễn ra một cách âm thầm. Người dùng nên trang trí các lớp con của mình bằng trình trang trí runtime_checkable() nếu họ muốn các giao thức thời gian chạy. (Được đóng góp bởi Yurii Karabas trong bpo-38908.)
Việc nhập từ các mô-đun con typing.io và typing.re giờ đây sẽ phát ra DeprecationWarning. Các mô-đun con này không được dùng nữa kể từ Python 3.8 và sẽ bị xóa trong phiên bản Python trong tương lai. Thay vào đó, mọi thứ thuộc về các mô-đun con đó phải được nhập trực tiếp từ typing. (Được đóng góp bởi Sebastian Rittau trong bpo-38291.)
nhỏ nhất¶
Thêm phương thức mới assertNoLogs() để bổ sung cho assertLogs() hiện có. (Được đóng góp bởi Kit Yan Choi trong bpo-39385.)
urllib.parse¶
Các phiên bản Python cũ hơn Python 3.10 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.)
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)
xml¶
Thêm lớp LexicalHandler vào mô-đun xml.sax.handler. (Được đóng góp bởi Jonathan Gossage và Zackery Spytz trong bpo-35018.)
nhập khẩu zip¶
Thêm các phương thức liên quan đến PEP 451: find_spec(), zipimport.zipimporter.create_module() và zipimport.zipimporter.exec_module(). (Được đóng góp bởi Brett Cannon trong bpo-42131.)
Thêm phương thức invalidate_caches(). (Được đóng góp bởi Desmond Cheong trong bpo-14678.)
Tối ưu hóa¶
Các hàm tạo
str(),bytes()vàbytearray()hiện nhanh hơn (khoảng 30--40% đối với các vật thể nhỏ). (Được đóng góp bởi Serhiy Storchaka trong bpo-41334.)Mô-đun
runpyhiện nhập ít mô-đun hơn. Thời gian khởi động lệnhpython3 -m module-nametrung bình nhanh hơn 1,4 lần. Trên Linux,python3 -I -m module-namenhập 69 mô-đun trên Python 3.9, trong khi nó chỉ nhập 51 mô-đun (-18) trên Python 3.10. (Được đóng góp bởi Victor Stinner trong bpo-41006 và bpo-41718.)Lệnh
LOAD_ATTRhiện sử dụng cơ chế "mỗi bộ đệm opcode" mới. Hiện tại, nó nhanh hơn khoảng 36% đối với các thuộc tính thông thường và nhanh hơn 44% đối với các vị trí. (Được đóng góp bởi Pablo Galindo và Yury Selivanov trong bpo-42093 và Guido van Rossum trong bpo-42927, dựa trên các ý tưởng được triển khai ban đầu trong PyPy và MicroPython.)Khi xây dựng Python với
--enable-optimizationsbây giờ-fno-semantic-interpositionđược thêm vào cả dòng biên dịch và dòng liên kết. Điều này tăng tốc độ xây dựng trình thông dịch Python được tạo bằng--enable-sharedvớigcclên tới 30%. Xem this article để biết thêm chi tiết. (Được đóng góp bởi Victor Stinner và Pablo Galindo trong bpo-38980.)Sử dụng mã quản lý bộ đệm đầu ra mới cho các mô-đun
bz2/lzma/zlibvà thêm chức năng.readall()vào lớp_compression.DecompressReader. Giải nén bz2 hiện nhanh hơn 1,09x ~ 1,17 lần, giải nén lzma nhanh hơn 1,20x ~ 1,32 lần,GzipFile.read(-1)nhanh hơn 1,11x ~ 1,18 lần. (Được đóng góp bởi Ma Lin, được đánh giá bởi Gregory P. Smith, trong bpo-41486)Khi sử dụng các chú thích được xâu chuỗi, các chú thích cho hàm không còn được tạo khi hàm được tạo. Thay vào đó, chúng được lưu trữ dưới dạng một bộ chuỗi và đối tượng hàm chuyển đổi một cách lười biếng chuỗi này thành các chú thích theo yêu cầu. Việc tối ưu hóa này giúp giảm một nửa thời gian CPU cần thiết để xác định hàm chú thích. (Được đóng góp bởi Yurii Karabas và Inada Naoki trong bpo-42202.)
Các hàm tìm kiếm chuỗi con như
str1 in str2vàstr2.find(str1)hiện nay đôi khi sử dụng thuật toán tìm kiếm chuỗi "Hai chiều" của Crochemore & Perrin để tránh hành vi bậc hai trên các chuỗi dài. (Được đóng góp bởi Dennis Sweeney trong bpo-41972)Thêm các tính năng tối ưu hóa vi mô vào
_PyType_Lookup()để cải thiện hiệu suất tra cứu bộ đệm thuộc tính loại trong trường hợp phổ biến là các lần truy cập bộ đệm. Điều này làm cho trình thông dịch nhanh hơn trung bình 1,04 lần. (Được đóng góp bởi Dino Viehland trong bpo-43452.)Các hàm tích hợp sau hiện hỗ trợ quy ước gọi vectorcall PEP 590 nhanh hơn:
map(),filter(),reversed(),bool()vàfloat(). (Được đóng góp bởi Donghee Na và Jeroen Demeyer trong bpo-43575, bpo-43287, bpo-41922, bpo-41873 và bpo-41870.)Hiệu suất
BZ2Fileđược cải thiện bằng cách loại bỏRLockbên trong. Điều này làm cho luồngBZ2Filekhông an toàn khi đối mặt với nhiều người đọc hoặc người viết đồng thời, giống như các lớp tương đương của nó tronggzipvàlzmaluôn như vậy. (Được đóng góp bởi Inada Naoki trong bpo-43785.)
Không được dùng nữa¶
Hiện tại Python chấp nhận các ký tự số ngay sau các từ khóa, ví dụ
0in x,1or x,0if 1else 2. Nó cho phép các biểu thức khó hiểu và mơ hồ như[0x1for x in y](có thể hiểu là[0x1 for x in y]hoặc[0x1f or x in y]). Bắt đầu từ bản phát hành này, cảnh báo không dùng nữa sẽ được đưa ra nếu chữ số đứng ngay sau một trong các từ khóaand,else,for,if,in,isvàor. Trong các bản phát hành sau này, nó sẽ được thay đổi thành cảnh báo cú pháp và cuối cùng là lỗi cú pháp. (Được đóng góp bởi Serhiy Storchaka trong bpo-43833.)Bắt đầu từ bản phát hành này, sẽ có nỗ lực phối hợp để bắt đầu dọn dẹp ngữ nghĩa nhập cũ được giữ lại để tương thích với Python 2.7. Cụ thể,
find_loader()/find_module()(được thay thế bởifind_spec()),load_module()(được thay thế bởiexec_module()),module_repr()(hệ thống nhập sẽ xử lý cho bạn), thuộc tính__package__(được thay thế bởi__spec__.parent), thuộc tính__loader__(được thay thế bởi__spec__.loader) và thuộc tính__cached__(được thay thế bởi__spec__.cached) sẽ dần bị xóa (cũng như các lớp và phương thức khác trongimportlib).ImportWarningvà/hoặcDeprecationWarningsẽ được nâng lên khi thích hợp để giúp xác định mã cần cập nhật trong quá trình chuyển đổi này.Toàn bộ không gian tên
distutilskhông được dùng nữa và sẽ bị xóa trong Python 3.12. Tham khảo phần module changes để biết thêm thông tin.Các đối số không nguyên cho
random.randrange()không được dùng nữa. Zz001zz không còn được dùng nữa để thay thế choTypeError. (Được đóng góp bởi Serhiy Storchaka và Raymond Hettinger trong bpo-37319.)Các phương thức
load_module()khác nhau củaimportlibđã được ghi nhận là không dùng nữa kể từ Python 3.6, nhưng giờ đây cũng sẽ kích hoạtDeprecationWarning. Thay vào đó hãy sử dụngexec_module(). (Được đóng góp bởi Brett Cannon trong bpo-26131.)zimport.zipimporter.load_module()không còn được dùng nữa để ưu tiên choexec_module(). (Được đóng góp bởi Brett Cannon trong bpo-26131.)Việc hệ thống nhập sử dụng
load_module()hiện kích hoạtImportWarningvìexec_module()được ưu tiên hơn. (Được đóng góp bởi Brett Cannon trong bpo-26131.)Việc sử dụng
importlib.abc.MetaPathFinder.find_module()vàimportlib.abc.PathEntryFinder.find_module()bởi hệ thống nhập hiện kích hoạtImportWarningvìimportlib.abc.MetaPathFinder.find_spec()vàimportlib.abc.PathEntryFinder.find_spec()tương ứng được ưu tiên. Bạn có thể sử dụngimportlib.util.spec_from_loader()để trợ giúp chuyển. (Được đóng góp bởi Brett Cannon trong bpo-42134.)Việc hệ thống nhập sử dụng
importlib.abc.PathEntryFinder.find_loader()hiện kích hoạtImportWarningvìimportlib.abc.PathEntryFinder.find_spec()được ưu tiên hơn. Bạn có thể sử dụngimportlib.util.spec_from_loader()để hỗ trợ chuyển. (Được đóng góp bởi Brett Cannon trong bpo-43672.)Các cách triển khai khác nhau của
importlib.abc.MetaPathFinder.find_module()(importlib.machinery.BuiltinImporter.find_module(),importlib.machinery.FrozenImporter.find_module(),importlib.machinery.WindowsRegistryFinder.find_module(),importlib.machinery.PathFinder.find_module(),importlib.abc.MetaPathFinder.find_module()),importlib.abc.PathEntryFinder.find_module()(importlib.machinery.FileFinder.find_module()) vàimportlib.abc.PathEntryFinder.find_loader()(importlib.machinery.FileFinder.find_loader()) hiện đã nâng cấpDeprecationWarningvà dự kiến sẽ bị xóa trong Python 3.12 (trước đây chúng được ghi nhận là không dùng nữa trong Python 3.4). (Được đóng góp bởi Brett Cannon trong bpo-42135.)importlib.abc.Finderkhông được dùng nữa (bao gồm cả phương thức duy nhất của nó,find_module()). Cảimportlib.abc.MetaPathFindervàimportlib.abc.PathEntryFinderđều không còn kế thừa từ lớp này nữa. Thay vào đó, người dùng nên kế thừa từ một trong hai lớp này nếu thích hợp. (Được đóng góp bởi Brett Cannon trong bpo-42135.)Việc ngừng sử dụng
imp,importlib.find_loader(),importlib.util.set_package_wrapper(),importlib.util.set_loader_wrapper(),importlib.util.module_for_loader(),pkgutil.ImpImportervàpkgutil.ImpLoaderđều đã được cập nhật để liệt kê Python 3.12 là phiên bản loại bỏ dự kiến (họ đã bắt đầu nâng cấpDeprecationWarningtrong các phiên bản trước của Python). (Được đóng góp bởi Brett Cannon trong bpo-43720.)Hệ thống nhập hiện sử dụng thuộc tính
__spec__trên các mô-đun trước khi quay lạimodule_repr()cho phương thức__repr__()của mô-đun. Việc loại bỏ việc sử dụngmodule_repr()được lên kế hoạch cho Python 3.12. (Được đóng góp bởi Brett Cannon trong bpo-42137.)importlib.abc.Loader.module_repr(),importlib.machinery.FrozenLoader.module_repr()vàimportlib.machinery.BuiltinLoader.module_repr()không được dùng nữa và dự kiến sẽ bị xóa trong Python 3.12. (Được đóng góp bởi Brett Cannon trong bpo-42136.)sqlite3.OptimizedUnicodeđã không có giấy tờ và lỗi thời kể từ Python 3.3, khi nó được đặt bí danh làstr. Hiện tại nó không còn được dùng nữa và đã được lên lịch xóa trong Python 3.12. (Được đóng góp bởi Erlend E. Aasland trong bpo-42264.)Hàm tích hợp không có giấy tờ
sqlite3.enable_shared_cachehiện không được dùng nữa và được lên lịch xóa trong Python 3.12. Việc sử dụng nó bị tài liệu SQLite3 không khuyến khích. Xem the SQLite3 docs để biết thêm chi tiết. Nếu phải sử dụng bộ nhớ đệm dùng chung, hãy mở cơ sở dữ liệu ở chế độ URI bằng tham số truy vấncache=shared. (Được đóng góp bởi Erlend E. Aasland trong bpo-24464.)Các phương pháp
threadingsau đây hiện không được dùng nữa:threading.currentThread=>threading.current_thread()threading.activeCount=>threading.active_count()threading.Condition.notifyAll=>threading.Condition.notify_all()threading.Event.isSet=>threading.Event.is_set()threading.Thread.setName=>threading.Thread.namethreading.thread.getName=>threading.Thread.namethreading.Thread.isDaemon=>threading.Thread.daemonthreading.Thread.setDaemon=>threading.Thread.daemon
(Được đóng góp bởi Jelle Zijlstra trong gh-87889.)
pathlib.Path.link_to()không được dùng nữa và dự kiến sẽ bị xóa trong Python 3.12. Thay vào đó hãy sử dụngpathlib.Path.hardlink_to(). (Được đóng góp bởi Barney Gale trong bpo-39950.)cgi.log()không được dùng nữa và dự kiến sẽ bị xóa trong Python 3.12. (Được đóng góp bởi Inada Naoki trong bpo-41139.)Các tính năng
sslsau đây đã không được dùng nữa kể từ Python 3.6, Python 3.7 hoặc OpenSSL 1.1.0 và sẽ bị xóa trong phiên bản 3.11:OP_NO_SSLv2,OP_NO_SSLv3,OP_NO_TLSv1,OP_NO_TLSv1_1,OP_NO_TLSv1_2vàOP_NO_TLSv1_3được thay thế bằngminimum_versionvàmaximum_version.PROTOCOL_SSLv2,PROTOCOL_SSLv3,PROTOCOL_SSLv23,PROTOCOL_TLSv1,PROTOCOL_TLSv1_1,PROTOCOL_TLSv1_2vàPROTOCOL_TLSkhông được dùng nữa mà thay vào đó làPROTOCOL_TLS_CLIENTvàPROTOCOL_TLS_SERVERwrap_socket()được thay thế bằngssl.SSLContext.wrap_socket()match_hostname()RAND_pseudo_bytes(),RAND_egd()Các tính năng của NPN như
ssl.SSLSocket.selected_npn_protocol()vàssl.SSLContext.set_npn_protocols()được thay thế bằng ALPN.
Gỡ lỗi luồng (biến môi trường
PYTHONTHREADDEBUG) không được dùng nữa trong Python 3.10 và sẽ bị xóa trong Python 3.12. Tính năng này yêu cầu debug build of Python. (Được đóng góp bởi Victor Stinner trong bpo-44584.)Việc nhập từ các mô-đun con
typing.iovàtyping.regiờ đây sẽ phát raDeprecationWarning. Các mô-đun con này sẽ bị xóa trong phiên bản Python trong tương lai. Thay vào đó, mọi thứ thuộc về các mô-đun con này phải được nhập trực tiếp từtyping. (Được đóng góp bởi Sebastian Rittau trong bpo-38291.)
Đã xóa¶
Đã xóa các phương thức đặc biệt
__int__,__float__,__floordiv__,__mod__,__divmod__,__rfloordiv__,__rmod__và__rdivmod__của lớpcomplex. Họ luôn huy động đượcTypeError. (Được đóng góp bởi Serhiy Storchaka trong bpo-41974.)Phương thức
ParserBase.error()từ mô-đun_markupbaseriêng tư và không có giấy tờ đã bị xóa.html.parser.HTMLParserlà lớp con duy nhất củaParserBasevà việc triển khaierror()của nó đã bị xóa trong Python 3.5. (Được đóng góp bởi Berker Peksag trong bpo-31844.)Đã xóa thuộc tính
unicodedata.ucnhash_CAPIvốn là đối tượng PyCapsule nội bộ. Cấu trúc_PyUnicode_Name_CAPIriêng tư có liên quan đã được chuyển sang C API nội bộ. (Được đóng góp bởi Victor Stinner trong bpo-42157.)Đã xóa mô-đun
parser, mô-đun này không được dùng nữa trong phiên bản 3.9 do chuyển sang trình phân tích cú pháp PEG mới, cũng như tất cả các tệp tiêu đề và nguồn C chỉ được trình phân tích cú pháp cũ sử dụng, bao gồmnode.h,parser.h,graminit.hvàgrammar.h.Đã xóa các hàm API công khai của C
PyParser_SimpleParseStringFlags,PyParser_SimpleParseStringFlagsFilename,PyParser_SimpleParseFileFlagsvàPyNode_Compilekhông được dùng nữa trong phiên bản 3.9 do chuyển sang trình phân tích cú pháp PEG mới.Đã xóa mô-đun
formatter, mô-đun này không được dùng nữa trong Python 3.4. Nó hơi lỗi thời, ít được sử dụng và chưa được thử nghiệm. Ban đầu nó được lên kế hoạch xóa trong Python 3.6, nhưng việc xóa như vậy đã bị trì hoãn cho đến sau Python 2.7 EOL. Người dùng hiện tại nên sao chép bất kỳ lớp nào họ sử dụng vào mã của họ. (Được đóng góp bởi Donghee Na và Terry J. Reedy trong bpo-42299.)Đã xóa chức năng
PyModule_GetWarningsModule()hiện không còn sử dụng do mô-đun_warningsđã được chuyển đổi thành mô-đun dựng sẵn trong 2.6. (Được đóng góp bởi Hai Shi trong bpo-42599.)Xóa các bí danh không được dùng nữa thành Bộ sưu tập Các lớp cơ sở trừu tượng khỏi mô-đun
collections. (Được đóng góp bởi Victor Stinner trong bpo-37324.)Tham số
loopđã bị xóa khỏi hầu hết high-level API củaasynciosau khi không dùng nữa trong Python 3.8. Động lực đằng sau sự thay đổi này rất đa dạng:Điều này giúp đơn giản hóa API cấp cao.
Các hàm trong API cấp cao đã ngầm nhận vòng lặp sự kiện đang chạy của luồng hiện tại kể từ Python 3.7. Không cần phải chuyển vòng lặp sự kiện tới API trong hầu hết các trường hợp sử dụng thông thường.
Việc truyền vòng lặp sự kiện dễ xảy ra lỗi, đặc biệt khi xử lý các vòng lặp chạy trong các luồng khác nhau.
Lưu ý rằng API cấp thấp vẫn sẽ chấp nhận
loop. Xem Những thay đổi trong Python API để biết ví dụ về cách thay thế mã hiện có.(Được đóng góp bởi Yurii Karabas, Andrew Svetlov, Yury Selivanov và Kyle Stanley trong bpo-42392.)
Chuyển sang Python 3.10¶
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 cú pháp Python¶
Cảnh báo không dùng nữa hiện được đưa ra khi biên dịch cú pháp hợp lệ trước đó nếu chữ số được theo sau ngay lập tức bởi một từ khóa (như trong
0in x). Trong các bản phát hành sau này, nó sẽ được thay đổi thành cảnh báo cú pháp và cuối cùng là lỗi cú pháp. Để loại bỏ cảnh báo và làm cho mã tương thích với các bản phát hành trong tương lai, chỉ cần thêm dấu cách giữa chữ số và từ khóa sau. (Được đóng góp bởi Serhiy Storchaka trong bpo-43833.)
Những thay đổi trong Python API¶
Các tham số etype của các hàm
format_exception(),format_exception_only()vàprint_exception()trong mô-đuntracebackđã được đổi tên thành exc. (Được đóng góp bởi Zackery Spytz và Matthias Bussonnier trong bpo-26389.)atexit: Khi thoát Python, nếu lệnh gọi lại được đăng ký vớiatexit.register()không thành công thì ngoại lệ của nó hiện đã được ghi lại. Trước đây, chỉ có một số ngoại lệ được ghi lại và ngoại lệ cuối cùng luôn bị bỏ qua một cách âm thầm. (Được đóng góp bởi Victor Stinner trong bpo-42639.)collections.abc.Callablegeneric hiện làm phẳng các tham số loại, tương tự như những gìtyping.Callablehiệ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). Mã truy cập các đối số thông quatyping.get_args()hoặc__args__cần tính đến sự thay đổi này. Hơn nữa,TypeErrorcó thể được nâng lên đối với các dạng tham số hóacollections.abc.Callablekhông hợp lệ có thể đã được truyền âm thầm trong Python 3.9. (Được đóng góp bởi Ken Jin trong bpo-42195.)socket.htons()vàsocket.ntohs()hiện tăngOverflowErrorthay vìDeprecationWarningnếu tham số đã cho không vừa với số nguyên không dấu 16 bit. (Được đóng góp bởi Erlend E. Aasland trong bpo-42393.)Tham số
loopđã bị xóa khỏi hầu hết high-level API củaasynciosau khi không dùng nữa trong Python 3.8.Một coroutine hiện trông như thế này:
async def foo (vòng lặp): đang chờ asyncio.sleep(1, loop=loop)
Nên thay thế bằng cái này:
async def foo(): đang chờ asyncio.sleep(1)
Nếu
foo()được thiết kế đặc biệt not để chạy trong vòng lặp sự kiện đang chạy của luồng hiện tại (ví dụ: chạy trong vòng lặp sự kiện của luồng khác), thay vào đó hãy xem xét sử dụngasyncio.run_coroutine_threadsafe().(Được đóng góp bởi Yurii Karabas, Andrew Svetlov, Yury Selivanov và Kyle Stanley trong bpo-42392.)
Hàm tạo
types.FunctionTypehiện kế thừa các nội trang hiện tại nếu từ điển globals không có khóa"__builtins__", thay vì sử dụng{"None": None}làm nội trang: hành vi tương tự như các hàmeval()vàexec(). Việc xác định hàm bằngdef function(...): ...trong Python không bị ảnh hưởng, không thể ghi đè toàn cục bằng cú pháp này: nó cũng kế thừa các nội dung hiện tại. (Được đóng góp bởi Victor Stinner trong bpo-42990.)
Những thay đổi trong C API¶
Các hàm C API
PyParser_SimpleParseStringFlags,PyParser_SimpleParseStringFlagsFilename,PyParser_SimpleParseFileFlags,PyNode_Compilevà loại được các hàm này sử dụng,struct _node, đã bị xóa do chuyển sang trình phân tích cú pháp PEG mới.Bây giờ, nguồn sẽ được biên dịch trực tiếp thành một đối tượng mã bằng cách sử dụng
Py_CompileString(). Đối tượng mã kết quả sau đó có thể được đánh giá bằng cách sử dụng, ví dụ:PyEval_EvalCode().Cụ thể:
Có thể thay thế lệnh gọi tới
PyParser_SimpleParseStringFlagstheo sau làPyNode_Compilebằng cách gọiPy_CompileString().Không có sự thay thế trực tiếp cho
PyParser_SimpleParseFileFlags. Để biên dịch mã từ đối sốFILE *, bạn sẽ cần đọc tệp bằng C và chuyển bộ đệm kết quả tớiPy_CompileString().Để biên dịch một tệp có tên tệp
char *, hãy mở tệp một cách rõ ràng, đọc nó và biên dịch kết quả. Một cách để thực hiện việc này là sử dụng mô-đuniovớiPyImport_ImportModule(),PyObject_CallMethod(),PyBytes_AsString()vàPy_CompileString(), như được phác họa bên dưới. (Bỏ qua phần khai báo và xử lý lỗi.)io_module = Import_ImportModule("io"); fileobject = PyObject_CallMethod(io_module, "open", "ss", tên tệp, "rb"); source_bytes_object = PyObject_CallMethod(fileobject, "read", ""); result = PyObject_CallMethod(fileobject, "close", ""); source_buf = PyBytes_AsString(source_bytes_object); code = Py_CompileString(source_buf, filename, Py_file_input);
Đối với các đối tượng
FrameObject, thành viênf_lastihiện đại diện cho phần bù mã từ thay vì phần bù đơn giản trong chuỗi mã byte. Điều này có nghĩa là số này cần phải được nhân với 2 để sử dụng với các API yêu cầu bù byte (ví dụ nhưPyCode_Addr2Line()). Cũng lưu ý rằng thành viênf_lasticủa đối tượngFrameObjectkhông được coi là ổn định: thay vào đó hãy sử dụngPyFrame_GetLineNumber().
Thay đổi mã byte CPython¶
Lệnh
MAKE_FUNCTIONhiện chấp nhận một lệnh hoặc một bộ chuỗi làm chú thích của hàm. (Được đóng góp bởi Yurii Karabas và Inada Naoki trong bpo-42202.)
Xây dựng thay đổi¶
PEP 644: Python hiện yêu cầu OpenSSL 1.1.1 trở lên. OpenSSL 1.0.2 không còn được hỗ trợ. (Được đóng góp bởi Christian Heimes trong bpo-43669.)
Các hàm C99
snprintf()vàvsnprintf()hiện được yêu cầu để xây dựng Python. (Được đóng góp bởi Victor Stinner trong bpo-36020.)sqlite3yêu cầu SQLite 3.7.15 trở lên. (Được đóng góp bởi Sergey Fedoseev và Erlend E. Aasland trong bpo-40744 và bpo-40810.)Mô-đun
atexitbây giờ phải luôn được xây dựng dưới dạng mô-đun tích hợp. (Được đóng góp bởi Victor Stinner trong bpo-42639.)Thêm tùy chọn
--disable-test-modulesvào tập lệnhconfigure: không xây dựng cũng như cài đặt các mô-đun thử nghiệm. (Được đóng góp bởi Xavier de Gaye, Thomas Petazzoni và Peixing Xin trong bpo-27640.)Thêm
--with-wheel-pkg-dir=PATH optionvào tập lệnh./configure. Nếu được chỉ định, mô-đunensurepipsẽ tìm các gói bánh xesetuptoolsvàpiptrong thư mục này: nếu cả hai đều có mặt, các gói bánh xe này sẽ được sử dụng thay vì các gói bánh xe đi kèm Ensurepip.Một số chính sách đóng gói phân phối Linux khuyến nghị không nên đóng gói phụ thuộc. Ví dụ: Fedora cài đặt các gói bánh xe trong thư mục
/usr/share/python-wheels/và không cài đặt góiensurepip._bundled.(Được đóng góp bởi Victor Stinner trong bpo-42856.)
Thêm một
configure --without-static-libpython optionmới để không xây dựng thư viện tĩnhlibpythonMAJOR.MINOR.avà không cài đặt tệp đối tượngpython.o.(Được đóng góp bởi Victor Stinner trong bpo-43103.)
Tập lệnh
configurehiện sử dụng tiện íchpkg-config, nếu có, để phát hiện vị trí của các tiêu đề và thư viện Tcl/Tk. Như trước đây, những vị trí đó có thể được chỉ định rõ ràng bằng các tùy chọn cấu hình--with-tcltk-includesvà--with-tcltk-libs. (Được đóng góp bởi Manolis Stamatogiannakis trong bpo-42603.)Thêm tùy chọn
--with-openssl-rpathvào tập lệnhconfigure. Tùy chọn này giúp đơn giản hóa việc xây dựng Python bằng cài đặt OpenSSL tùy chỉnh, ví dụ:./configure --with-openssl=/path/to/openssl --with-openssl-rpath=auto. (Được đóng góp bởi Christian Heimes trong bpo-43466.)
C API Thay đổi¶
PEP 652: Duy trì ổn định ABI¶
ABI ổn định (Giao diện nhị phân ứng dụng) cho các mô-đun mở rộng hoặc nhúng Python hiện đã được xác định rõ ràng. C API Tính ổn định mô tả sự đảm bảo về độ ổn định của C API và ABI cùng với các phương pháp hay nhất để sử dụng ABI Ổn định.
(Được đóng góp bởi Petr Viktorin trong PEP 652 và bpo-43795.)
Tính năng mới¶
Kết quả của
PyNumber_Index()hiện luôn có loạiintchính xác. Trước đây, kết quả có thể là một phiên bản của lớp con củaint. (Được đóng góp bởi Serhiy Storchaka trong bpo-40792.)Thêm thành viên
orig_argvmới vào cấu trúcPyConfig: danh sách các đối số dòng lệnh ban đầu được truyền cho tệp thực thi Python. (Được đóng góp bởi Victor Stinner trong bpo-23427.)Các macro
PyDateTime_DATE_GET_TZINFO()vàPyDateTime_TIME_GET_TZINFO()đã được thêm vào để truy cập các thuộc tínhtzinfocủa các đối tượngdatetime.datetimevàdatetime.time. (Được đóng góp bởi Zackery Spytz trong bpo-30155.)Thêm chức năng
PyCodec_Unregister()để hủy đăng ký chức năng tìm kiếm codec. (Được đóng góp bởi Hai Shi trong bpo-41842.)Hàm
PyIter_Send()đã được thêm vào để cho phép gửi giá trị vào iterator mà không đưa ra ngoại lệStopIteration. (Được đóng góp bởi Vladimir Matveev trong bpo-41756.)Thêm
PyUnicode_AsUTF8AndSize()vào C API giới hạn. (Được đóng góp bởi Alex Gaynor trong bpo-41784.)Thêm chức năng
PyModule_AddObjectRef(): tương tự nhưPyModule_AddObject()nhưng không lấy tham chiếu về giá trị khi thành công. (Được đóng góp bởi Victor Stinner trong bpo-1635741.)Thêm các hàm
Py_NewRef()vàPy_XNewRef()để tăng số lượng tham chiếu của một đối tượng và trả về đối tượng đó. (Được đóng góp bởi Victor Stinner trong bpo-42262.)Các hàm
PyType_FromSpecWithBases()vàPyType_FromModuleAndSpec()hiện chấp nhận một lớp duy nhất làm đối số bases. (Được đóng góp bởi Serhiy Storchaka trong bpo-42423.)Chức năng
PyType_FromModuleAndSpec()hiện chấp nhận khe cắm NULLtp_doc. (Được đóng góp bởi Hai Shi trong bpo-41832.)Chức năng
PyType_GetSlot()có thể chấp nhận static types. (Được đóng góp bởi Hai Shi và Petr Viktorin trong bpo-41073.)Thêm hàm
PySet_CheckExact()mới vào C-API để kiểm tra xem một đối tượng có phải là phiên bản củasetnhưng không phải là phiên bản của kiểu con hay không. (Được đóng góp bởi Pablo Galindo trong bpo-43277.)Thêm
PyErr_SetInterruptEx()cho phép truyền số tín hiệu để mô phỏng. (Được đóng góp bởi Antoine Pitrou trong bpo-43356.)C API giới hạn hiện được hỗ trợ nếu Python is built in debug mode (nếu macro
Py_DEBUGđược xác định). Trong C API giới hạn, các hàmPy_INCREF()vàPy_DECREF()hiện được triển khai dưới dạng lệnh gọi hàm mờ, thay vì truy cập trực tiếp vào thành viênPyObject.ob_refcnt, nếu Python được xây dựng ở chế độ gỡ lỗi và macroPy_LIMITED_APInhắm mục tiêu Python 3.10 trở lên. Có thể hỗ trợ C API giới hạn ở chế độ gỡ lỗi vì cấu trúcPyObjectgiống nhau ở chế độ phát hành và gỡ lỗi kể từ Python 3.8 (xem bpo-36465).C API giới hạn vẫn không được hỗ trợ trong bản dựng đặc biệt
--with-trace-refs(macroPy_TRACE_REFS). (Được đóng góp bởi Victor Stinner trong bpo-43688.)Thêm hàm
Py_Is(x, y)để kiểm tra xem đối tượng x có phải là đối tượng y hay không, giống nhưx is ytrong Python. Ngoài ra, hãy thêm các hàmPy_IsNone(),Py_IsTrue(),Py_IsFalse()để kiểm tra xem một đối tượng lần lượt làNonesingleton,Truesingleton hayFalsesingleton. (Được đóng góp bởi Victor Stinner trong bpo-43753.)Thêm chức năng mới điều khiển trình thu gom rác từ mã C:
PyGC_Enable(),PyGC_Disable(),PyGC_IsEnabled(). Các chức năng này cho phép kích hoạt, hủy kích hoạt và truy vấn trạng thái của trình thu gom rác từ mã C mà không cần phải nhập mô-đungc.Thêm cờ loại
Py_TPFLAGS_DISALLOW_INSTANTIATIONmới để không cho phép tạo phiên bản loại. (Được đóng góp bởi Victor Stinner trong bpo-43916.)Thêm cờ loại
Py_TPFLAGS_IMMUTABLETYPEmới để tạo đối tượng loại bất biến: thuộc tính loại không thể được đặt cũng như không thể xóa. (Được đóng góp bởi Victor Stinner và Erlend E. Aasland trong bpo-43908.)
Chuyển sang Python 3.10¶
Macro
PY_SSIZE_T_CLEANhiện phải được xác định để sử dụng các định dạngPyArg_ParseTuple()vàPy_BuildValue()sử dụng#:es#,et#,s#,u#,y#,z#,U#vàZ#. Xem Phân tích đối số và xây dựng giá trị và PEP 353. (Được đóng góp bởi Victor Stinner trong bpo-40943.)Vì
Py_REFCNT()được thay đổi thành hàm tĩnh nội tuyến, nênPy_REFCNT(obj) = new_refcntphải được thay thế bằngPy_SET_REFCNT(obj, new_refcnt): xemPy_SET_REFCNT()(có sẵn từ Python 3.9). Để tương thích ngược, macro này có thể được sử dụng#if PY_VERSION_HEX < 0x030900A4 # define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0) #endif
(Được đóng góp bởi Victor Stinner trong bpo-39573.)
Việc gọi
PyDict_GetItem()mà không giữ GIL đã được cho phép vì lý do lịch sử. Nó không còn được phép. (Được đóng góp bởi Victor Stinner trong bpo-40839.)PyUnicode_FromUnicode(NULL, size)vàPyUnicode_FromStringAndSize(NULL, size)tăngDeprecationWarningngay bây giờ. Sử dụngPyUnicode_New()để phân bổ đối tượng Unicode không có dữ liệu ban đầu. (Được đóng góp bởi Inada Naoki trong bpo-36346.)Cấu trúc
_PyUnicode_Name_CAPIriêng của PyCapsule APIunicodedata.ucnhash_CAPIđã được chuyển sang C API bên trong. (Được đóng góp bởi Victor Stinner trong bpo-42157.)Các hàm
Py_GetPath(),Py_GetPrefix(),Py_GetExecPrefix(),Py_GetProgramFullPath(),Py_GetPythonHome()vàPy_GetProgramName()hiện trả vềNULLnếu được gọi trướcPy_Initialize()(trước khi Python được khởi tạo). Sử dụng Cấu hình khởi tạo Python API mới để nhận Cấu hình đường dẫn Python. (Được đóng góp bởi Victor Stinner trong bpo-42260.)Các macro
PyList_SET_ITEM(),PyTuple_SET_ITEM()vàPyCell_SET()không còn có thể được sử dụng làm giá trị l hoặc giá trị r nữa. Ví dụ:x = PyList_SET_ITEM(a, b, c)vàPyList_SET_ITEM(a, b, c) = xhiện không thành công do lỗi trình biên dịch. Nó ngăn chặn các lỗi như kiểm traif (PyList_SET_ITEM (a, b, c) < 0) .... (Được đóng góp bởi Zackery Spytz và Victor Stinner trong bpo-30459.)Các tệp API không giới hạn
odictobject.h,parser_interface.h,picklebufobject.h,pyarena.h,pyctype.h,pydebug.h,pyfpe.hvàpytime.hđã được chuyển đến thư mụcInclude/cpython. Không được đưa trực tiếp các tệp này vào vì chúng đã được đưa vàoPython.h; xem Bao gồm các tệp. Nếu chúng đã được đưa trực tiếp vào, thay vào đó hãy xem xét việc đưa vàoPython.h. (Được đóng góp bởi Nicholas Sim trong bpo-35134.)Sử dụng cờ loại
Py_TPFLAGS_IMMUTABLETYPEđể tạo các đối tượng loại bất biến. Đừng dựa vàoPy_TPFLAGS_HEAPTYPEđể quyết định xem một đối tượng loại có thể thay đổi được hay không; thay vào đó hãy kiểm tra xemPy_TPFLAGS_IMMUTABLETYPEcó được đặt không. (Được đóng góp bởi Victor Stinner và Erlend E. Aasland trong bpo-43908.)Hàm
Py_FrozenMainkhông có giấy tờ đã bị xóa khỏi API bị giới hạn. Hàm này chủ yếu hữu ích cho các bản dựng Python tùy chỉnh. (Được đóng góp bởi Petr Viktorin trong bpo-26241.)
Không được dùng nữa¶
Hàm
PyUnicode_InternImmortal()hiện không được dùng nữa và sẽ bị xóa trong Python 3.12: thay vào đó hãy sử dụngPyUnicode_InternInPlace(). (Được đóng góp bởi Victor Stinner trong bpo-41692.)
Đã xóa¶
Đã xóa các hàm
Py_UNICODE_str*thao tác với chuỗiPy_UNICODE*. (Được đóng góp bởi Inada Naoki trong bpo-41123.)Py_UNICODE_strlen: sử dụngPyUnicode_GetLength()hoặcPyUnicode_GET_LENGTHPy_UNICODE_strcat: sử dụngPyUnicode_CopyCharacters()hoặcPyUnicode_FromFormat()Py_UNICODE_strcpy,Py_UNICODE_strncpy: sử dụngPyUnicode_CopyCharacters()hoặcPyUnicode_Substring()Py_UNICODE_strcmp: sử dụngPyUnicode_Compare()Py_UNICODE_strncmp: sử dụngPyUnicode_Tailmatch()Py_UNICODE_strchr,Py_UNICODE_strrchr: sử dụngPyUnicode_FindChar()
Đã xóa
PyUnicode_GetMax(). Vui lòng di chuyển sang API (PEP 393) mới. (Được đóng góp bởi Inada Naoki trong bpo-41103.)Đã xóa
PyLong_FromUnicode(). Vui lòng di chuyển sangPyLong_FromUnicodeObject(). (Được đóng góp bởi Inada Naoki trong bpo-41103.)Đã xóa
PyUnicode_AsUnicodeCopy(). Vui lòng sử dụngPyUnicode_AsUCS4Copy()hoặcPyUnicode_AsWideCharString()(Được đóng góp bởi Inada Naoki trong bpo-41103.)Đã xóa biến
_Py_CheckRecursionLimit: nó đã được thay thế bằngceval.recursion_limitcủa cấu trúcPyInterpreterState. (Được đóng góp bởi Victor Stinner trong bpo-41834.)Đã xóa các macro
Py_ALLOW_RECURSIONvàPy_END_ALLOW_RECURSIONkhông có giấy tờ cũng như trườngrecursion_criticalcủa cấu trúcPyInterpreterState. (Được đóng góp bởi Serhiy Storchaka trong bpo-41936.)Đã xóa chức năng
PyOS_InitInterrupts()không có giấy tờ. Đang khởi tạo Python đã ngầm cài đặt trình xử lý tín hiệu: xemPyConfig.install_signal_handlers. (Được đóng góp bởi Victor Stinner trong bpo-41713.)Loại bỏ chức năng
PyAST_Validate(). Không thể xây dựng đối tượng AST (loạimod_ty) bằng C API công khai. Chức năng này đã bị loại khỏi C API (PEP 384) giới hạn. (Được đóng góp bởi Victor Stinner trong bpo-43244.)Xóa tệp tiêu đề
symtable.hvà các hàm không có giấy tờ:PyST_GetScope()PySymtable_Build()PySymtable_BuildObject()PySymtable_Free()Py_SymtableString()Py_SymtableStringObject()
Chức năng
Py_SymtableString()là một phần của ABI ổn định do nhầm lẫn nhưng nó không thể được sử dụng vì tệp tiêu đềsymtable.hđã bị loại khỏi C API giới hạn.Thay vào đó hãy sử dụng mô-đun Python
symtable. (Được đóng góp bởi Victor Stinner trong bpo-43244.)Xóa
PyOS_ReadlineFunctionPointer()khỏi các tiêu đề C API giới hạn và khỏipython3.dll, thư viện cung cấp ABI ổn định trên Windows. Vì hàm lấy đối sốFILE*nên độ ổn định ABI của nó không thể được đảm bảo. (Được đóng góp bởi Petr Viktorin trong bpo-43868.)Xóa các tệp tiêu đề
ast.h,asdl.hvàPython-ast.h. Các chức năng này không có giấy tờ và bị loại khỏi C API giới hạn. Hầu hết các tên được xác định bởi các tệp tiêu đề này không có tiền tốPyvà do đó có thể tạo ra xung đột tên. Ví dụ:Python-ast.hđã xác định macroYieldxung đột với tênYieldđược sử dụng bởi tiêu đề<winbase.h>của Windows. Thay vào đó hãy sử dụng mô-đun Pythonast. (Được đóng góp bởi Victor Stinner trong bpo-43244.)Xóa các hàm trình biên dịch và trình phân tích cú pháp bằng cách sử dụng loại
struct _mod, vì AST C API công khai đã bị xóa:PyAST_Compile()PyAST_CompileEx()PyAST_CompileObject()PyFuture_FromAST()PyFuture_FromASTObject()PyParser_ASTFromFile()PyParser_ASTFromFileObject()PyParser_ASTFromFilename()PyParser_ASTFromString()PyParser_ASTFromStringObject()
Các chức năng này không có giấy tờ và bị loại khỏi C API giới hạn. (Được đóng góp bởi Victor Stinner trong bpo-43244.)
Xóa tệp tiêu đề
pyarena.hcó chức năng:PyArena_New()PyArena_Free()PyArena_Malloc()PyArena_AddPyObject()
Các hàm này không có giấy tờ, bị loại khỏi C API giới hạn và chỉ được trình biên dịch sử dụng nội bộ. (Được đóng góp bởi Victor Stinner trong bpo-43244.)
Thành viên
PyThreadState.use_tracingđã bị xóa để tối ưu hóa Python. (Được đóng góp bởi Mark Shannon trong bpo-43760.)
Tính năng bảo mật đáng chú ý trong 3.10.7¶
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.
Tính năng bảo mật đáng chú ý trong 3.10.8¶
Mô-đun mailcap không được dùng nữa hiện từ chối đưa văn bản không an toàn (tên tệp, loại MIME, tham số) vào các lệnh shell. Thay vì sử dụng văn bản như vậy, nó sẽ cảnh báo và hoạt động như thể không tìm thấy kết quả trùng khớp (hoặc đối với các lệnh kiểm tra, như thể kiểm tra thất bại). (Được đóng góp bởi Petr Viktorin trong gh-98966.)
Những thay đổi đáng chú ý trong 3.10.12¶
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.)