Có gì mới trong Python 3.8¶
- Biên tập viên:
Raymond Hettinger
Bài viết này giải thích các tính năng mới trong Python 3.8, so với 3.7. Python 3.8 được phát hành vào ngày 14 tháng 10 năm 2019. Để biết chi tiết đầy đủ, hãy xem changelog.
Tóm tắt -- Phát hành điểm nổi bật¶
Tính năng mới¶
biểu thức gán¶
Có cú pháp mới := gán giá trị cho các biến như một phần của biểu thức lớn hơn. Nó được trìu mến gọi là "người điều khiển hải mã" do nó giống với the eyes and tusks of a walrus.
Trong ví dụ này, biểu thức gán giúp tránh gọi len() hai lần:
nếu (n := len(a)) > 10:
print(f"Danh sách quá dài ({n} phần tử, dự kiến <= 10)")
Một lợi ích tương tự phát sinh trong quá trình so khớp biểu thức chính quy trong đó cần có các đối tượng so khớp hai lần, một lần để kiểm tra xem có khớp hay không và một lần khác để trích xuất một nhóm con
giảm giá = 0,0
if (mo := re.search(r'(\d+)% giảm giá', quảng cáo)):
chiết khấu = float(mo.group(1)) / 100.0
Toán tử cũng hữu ích với các vòng lặp while tính toán một giá trị để kiểm tra việc kết thúc vòng lặp và sau đó cần lại giá trị đó trong phần thân của vòng lặp:
# Loop trên các khối có chiều dài cố định
while (chặn := f.read(256)) != '':
quá trình (khối)
Một trường hợp sử dụng thúc đẩy khác phát sinh trong việc hiểu danh sách trong đó cũng cần có một giá trị được tính toán trong điều kiện lọc trong phần thân biểu thức:
[clean_name.title() cho tên trong tên
if (clean_name := normalize('NFC', name)) in allow_names]
Cố gắng hạn chế sử dụng toán tử hải mã để làm sạch các trường hợp giúp giảm độ phức tạp và cải thiện khả năng đọc.
Xem PEP 572 để biết mô tả đầy đủ.
(Được đóng góp bởi Emily Morehouse trong bpo-35224.)
Tham số chỉ có vị trí¶
Có một cú pháp tham số hàm mới / để chỉ ra rằng một số tham số hàm phải được chỉ định theo vị trí và không thể được sử dụng làm đối số từ khóa. Đây là ký hiệu tương tự được hiển thị bởi help() cho các hàm C được chú thích bằng công cụ Argument Clinic của Larry Hastings.
Trong ví dụ sau, các tham số a và b chỉ mang tính vị trí, trong khi c hoặc d có thể là vị trí hoặc từ khóa và e hoặc f bắt buộc phải là từ khóa:
def f(a, b, /, c, d, *, e, f):
in(a, b, c, d, e, f)
Sau đây là cuộc gọi hợp lệ:
f(10, 20, 30, d=40, e=50, f=60)
Tuy nhiên, đây là những cuộc gọi không hợp lệ:
f(10, b=20, c=30, d=40, e=50, f=60) # b không thể là đối số từ khóa
f(10, 20, 30, 40, 50, f=60) # e phải là một đối số từ khóa
Một trường hợp sử dụng cho ký hiệu này là nó cho phép các hàm Python thuần túy mô phỏng đầy đủ hành vi của các hàm được mã hóa C hiện có. Ví dụ: hàm divmod() tích hợp không chấp nhận đối số từ khóa
def divmod(a, b, /):
"Mô phỏng hàm divmod() tích hợp"
trả về (a // b, a % b)
Một trường hợp sử dụng khác là loại trừ các đối số từ khóa khi tên tham số không hữu ích. Ví dụ: hàm len() dựng sẵn có chữ ký len(obj, /). Điều này ngăn cản các cuộc gọi khó xử như:
đối số từ khóa len(obj='hello') # The "obj" làm suy yếu khả năng đọc
Một lợi ích nữa của việc đánh dấu một tham số chỉ là vị trí là nó cho phép thay đổi tên tham số trong tương lai mà không có nguy cơ phá vỡ mã máy khách. Ví dụ: trong mô-đun statistics, tên tham số dist có thể được thay đổi trong tương lai. Điều này có thể thực hiện được nhờ đặc tả chức năng sau:
định lượng def(dist, /, *, n=4, Method='exclusive')
...
Vì các tham số ở bên trái của / không được hiển thị dưới dạng từ khóa có thể có nên tên tham số vẫn có sẵn để sử dụng trong **kwargs:
>>> def f(a, b, /, **kwargs):
... print(a, b, kwargs)
...
>>> f(10, 20, a=1, b=2, c=3) # a và b được sử dụng theo hai cách
10 20 {'a': 1, 'b': 2, 'c': 3}
Điều này giúp đơn giản hóa đáng kể việc triển khai các hàm và phương thức cần chấp nhận các đối số từ khóa tùy ý. Ví dụ: đây là đoạn trích từ mã trong mô-đun collections
Bộ đếm lớp (dict):
def __init__(self, iterable=None, /, **kwds):
# Note "iterable" là một đối số từ khóa có thể
Xem PEP 570 để biết mô tả đầy đủ.
(Được đóng góp bởi Pablo Galindo trong bpo-36540.)
Bộ đệm hệ thống tệp song song cho các tệp mã byte được biên dịch¶
Cài đặt PYTHONPYCACHEPREFIX mới (cũng có sẵn dưới dạng -X pycache_prefix) định cấu hình bộ đệm ẩn mã byte để sử dụng cây hệ thống tệp song song riêng biệt, thay vì các thư mục con __pycache__ mặc định trong mỗi thư mục nguồn.
Vị trí của bộ đệm được báo cáo trong sys.pycache_prefix (None cho biết vị trí mặc định trong thư mục con __pycache__).
(Được đóng góp bởi Carl Meyer trong bpo-33499.)
Bản dựng gỡ lỗi sử dụng ABI giống như bản phát hành¶
Zz001zz của Python debug builds hiện tương thích với các bản phát hành Python. Trên Unix, khi Python được xây dựng ở chế độ gỡ lỗi, giờ đây có thể tải các phần mở rộng C được xây dựng ở chế độ phát hành và các phần mở rộng C được xây dựng bằng ABI ổn định. Điều ngược lại là không đúng vì bản dựng gỡ lỗi hiển thị các ký hiệu bổ sung không có sẵn trong bản phát hành.
Việc xác định macro Py_DEBUG không còn bao hàm macro Py_TRACE_REFS, điều này gây ra sự không tương thích duy nhất với ABI. Macro Py_TRACE_REFS, bổ sung chức năng sys.getobjects() và biến môi trường PYTHONDUMPREFS, có thể được đặt bằng tùy chọn xây dựng ./configure --with-trace-refs mới. (Được đóng góp bởi Victor Stinner trong bpo-36465.)
Trên Unix, tiện ích mở rộng C không còn được liên kết với libpython ngoại trừ trên Android và Cygwin. Giờ đây, Python được liên kết tĩnh có thể tải tiện ích mở rộng C được xây dựng bằng thư viện dùng chung Python. (Được đóng góp bởi Victor Stinner trong bpo-21536.)
Trên Unix, khi Python được xây dựng ở chế độ gỡ lỗi, giờ đây, quá trình nhập cũng tìm kiếm các phần mở rộng C được biên dịch ở chế độ phát hành và các phần mở rộng C được biên dịch bằng ABI ổn định. (Được đóng góp bởi Victor Stinner trong bpo-36722.)
Để nhúng Python vào một ứng dụng, tùy chọn --embed mới phải được chuyển tới python3-config --libs --embed để nhận -lpython3.8 (liên kết ứng dụng với libpython). Để hỗ trợ cả 3.8 trở lên, hãy thử python3-config --libs --embed trước và dự phòng về python3-config --libs (không có --embed) nếu lệnh trước đó không thành công.
Thêm mô-đun pkg-config python-3.8-embed để nhúng Python vào một ứng dụng: pkg-config python-3.8-embed --libs bao gồm -lpython3.8. Để hỗ trợ cả phiên bản 3.8 trở lên, hãy thử pkg-config python-X.Y-embed --libs trước và dự phòng thành pkg-config python-X.Y --libs (không có --embed) nếu lệnh trước đó không thành công (thay thế X.Y bằng phiên bản Python).
Mặt khác, pkg-config python3.8 --libs không còn chứa -lpython3.8 nữa. Không được liên kết tiện ích mở rộng C với libpython (ngoại trừ trên Android và Cygwin, các trường hợp được xử lý bằng tập lệnh); sự thay đổi này có mục đích không tương thích ngược. (Được đóng góp bởi Victor Stinner trong bpo-36721.)
chuỗi f hỗ trợ = để tự ghi lại các biểu thức và gỡ lỗi¶
Đã thêm công cụ xác định = vào f-strings. Một chuỗi f chẳng hạn như f'{expr=}' sẽ mở rộng sang văn bản của biểu thức, dấu bằng, sau đó là biểu diễn của biểu thức được đánh giá. Ví dụ:
>>> import datetime as dt
>>> user = 'eric_idle'
>>> member_since = dt.date(1975, 7, 31)
>>> f'{user=} {member_since=}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"
Zz000zz thông thường cho phép kiểm soát nhiều hơn cách hiển thị kết quả của biểu thức
>>> delta = dt.date.today() - member_since
>>> f'{user=!s} {delta.days=:,d}'
'người dùng=eric_idle delta.days=16.075'
Trình xác định = sẽ hiển thị toàn bộ biểu thức để có thể hiển thị các phép tính
>>> print(f'{theta=} {cos(radians(theta))=:.3f}')
theta=30 cos(radian(theta))=0,866
(Được đóng góp bởi Eric V. Smith và Larry Hastings trong bpo-36817.)
PEP 578: Móc kiểm tra thời gian chạy Python¶
Zz000zz bổ sung Móc kiểm tra và Móc mở đã được xác minh. Cả hai đều có sẵn từ Python và mã gốc, cho phép các ứng dụng và khung được viết bằng mã Python thuần túy tận dụng các thông báo bổ sung, đồng thời cho phép các trình nhúng hoặc quản trị viên hệ thống triển khai các bản dựng Python trong đó tính năng kiểm tra luôn được bật.
Xem PEP 578 để biết chi tiết đầy đủ.
PEP 587: Cấu hình khởi tạo Python¶
Zz000zz bổ sung C API mới để định cấu hình Khởi tạo Python cung cấp khả năng kiểm soát tốt hơn trên toàn bộ cấu hình và báo cáo lỗi tốt hơn.
Cấu trúc mới:
Chức năng mới:
PEP này cũng thêm các trường _PyRuntimeState.preconfig (loại PyPreConfig) và PyInterpreterState.config (loại PyConfig) vào các cấu trúc bên trong này. PyInterpreterState.config trở thành cấu hình tham chiếu mới, thay thế các biến cấu hình chung và các biến riêng tư khác.
Xem Python Initialization Configuration để biết tài liệu.
Xem PEP 587 để biết mô tả đầy đủ.
(Được đóng góp bởi Victor Stinner trong bpo-36763.)
PEP 590: Vectorcall: giao thức gọi nhanh cho CPython¶
Giao thức Vectorcall được thêm vào API Python/C. Nó nhằm mục đích chính thức hóa các tối ưu hóa hiện có đã được thực hiện cho các lớp khác nhau. Bất kỳ static type nào triển khai lệnh gọi đều có thể sử dụng giao thức này.
Điều này hiện đang tạm thời. Mục đích là làm cho nó hoàn toàn công khai trong Python 3.9.
Xem PEP 590 để biết mô tả đầy đủ.
(Được đóng góp bởi Jeroen Demeyer, Mark Shannon và Petr Viktorin trong bpo-36974.)
Giao thức Pickle 5 với bộ đệm dữ liệu ngoài băng tần¶
Khi pickle được sử dụng để truyền dữ liệu lớn giữa các quy trình Python nhằm tận dụng khả năng xử lý đa lõi hoặc nhiều máy, điều quan trọng là phải tối ưu hóa quá trình truyền bằng cách giảm bản sao bộ nhớ và có thể bằng cách áp dụng các kỹ thuật tùy chỉnh như nén phụ thuộc dữ liệu.
Giao thức pickle 5 giới thiệu hỗ trợ cho bộ đệm ngoài băng tần trong đó dữ liệu tương thích với PEP 3118 có thể được truyền riêng biệt khỏi luồng dữ liệu chính, theo quyết định của lớp giao tiếp.
Xem PEP 574 để biết mô tả đầy đủ.
(Được đóng góp bởi Antoine Pitrou trong bpo-36785.)
Những thay đổi ngôn ngữ khác¶
Câu lệnh
continuelà bất hợp pháp trong mệnh đềfinallydo có vấn đề trong quá trình triển khai. Trong Python 3.8 hạn chế này đã được dỡ bỏ. (Được đóng góp bởi Serhiy Storchaka trong bpo-32489.)Các loại
bool,intvàfractions.Fractionhiện có phương thứcas_integer_ratio()giống như phương thức được tìm thấy trongfloatvàdecimal.Decimal. Tiện ích mở rộng API nhỏ này giúp bạn có thể viếtnumerator, denominator = x.as_integer_ratio()và hoạt động trên nhiều loại số. (Được đóng góp bởi Lisa Roach trong bpo-33073 và Raymond Hettinger trong bpo-37819.)Các nhà xây dựng của
int,floatvàcomplexbây giờ sẽ sử dụng phương thức đặc biệt__index__(), nếu có và phương thức tương ứng__int__(),__float__()hoặc__complex__()không có sẵn. (Được đóng góp bởi Serhiy Storchaka trong bpo-20092.)Đã thêm hỗ trợ thoát
\N{name}trongregular expressions:>>> thông báo = 'Bản quyền © 2019' >>> Copyright_year_pattern = re.compile(r'\N{copyright sign}\s*(\d{4})') >>> int(copyright_year_pattern.search(notice).group(1)) 2019
(Được đóng góp bởi Jonathan Eunice và Serhiy Storchaka trong bpo-30688.)
Giờ đây, chế độ xem chính tả và chế độ xem chính tả có thể lặp lại theo thứ tự chèn đảo ngược bằng cách sử dụng
reversed(). (Được đóng góp bởi Rémi Lapeyre trong bpo-33462.)Cú pháp được phép cho tên từ khóa trong lệnh gọi hàm bị hạn chế hơn nữa. Đặc biệt,
f((keyword)=arg)không còn được phép sử dụng. Nó không bao giờ có ý định cho phép nhiều hơn một tên trống ở phía bên trái của thuật ngữ gán đối số từ khóa. (Được đóng góp bởi Benjamin Peterson trong bpo-34641.)Việc giải nén tổng quát có thể lặp lại trong câu lệnh
yieldvàreturnkhông còn yêu cầu dấu ngoặc đơn kèm theo nữa. Điều này làm cho cú pháp yield và return phù hợp hơn với cú pháp gán thông thường:>>> phân tích cú pháp def (gia đình): ... họ, *thành viên = family.split() ... trả về họ.upper(), *thành viên ... >>> phân tích cú pháp ('simpsons homer marge bart lisa maggie') ('SIMPSONS', 'homer', 'marge', 'bart', 'lisa', 'maggie')
(Được đóng góp bởi David Cuthbert và Jordan Chapman trong bpo-32117.)
Khi thiếu dấu phẩy trong mã, chẳng hạn như
[(10, 20) (30, 40)], trình biên dịch sẽ hiển thịSyntaxWarningkèm theo gợi ý hữu ích. Điều này cải thiện khi chỉ cóTypeErrorcho biết rằng bộ dữ liệu đầu tiên không thể gọi được. (Được đóng góp bởi Serhiy Storchaka trong bpo-15248.)Các phép toán số học giữa các lớp con của các đối tượng
datetime.datehoặcdatetime.datetimevàdatetime.timedeltahiện trả về một thể hiện của lớp con, thay vì lớp cơ sở. Điều này cũng ảnh hưởng đến kiểu trả về của các hoạt động mà việc triển khai (trực tiếp hoặc gián tiếp) sử dụng số họcdatetime.timedelta, chẳng hạn nhưastimezone(). (Được đóng góp bởi Paul Ganssle trong bpo-32417.)Khi trình thông dịch Python bị gián đoạn bởi Ctrl-C (SIGINT) và ngoại lệ
KeyboardInterruptkhông bị bắt, quy trình Python hiện thoát thông qua tín hiệu SIGINT hoặc với mã thoát chính xác để quy trình gọi có thể phát hiện ra rằng nó đã chết do Ctrl-C. Shell trên POSIX và Windows sử dụng điều này để chấm dứt chính xác các tập lệnh trong các phiên tương tác. (Được Google đóng góp thông qua Gregory P. Smith trong bpo-1054041.)Một số kiểu lập trình nâng cao yêu cầu cập nhật đối tượng
types.CodeTypecho một hàm hiện có. Vì các đối tượng mã là bất biến nên cần phải tạo một đối tượng mã mới, một đối tượng được mô hình hóa trên đối tượng mã hiện có. Với 19 tham số, việc này có phần tẻ nhạt. Giờ đây, phương phápreplace()mới cho phép tạo một bản sao với một vài thông số được thay đổi.Sau đây là ví dụ thay đổi hàm
statistics.mean()để ngăn không cho tham số data được sử dụng làm đối số từ khóa:>>> từ ý nghĩa nhập số liệu thống kê >>> trung bình(dữ liệu=[10, 20, 90]) 40 >>> trung bình.__code__ = trung bình.__code__.replace(co_posonlyargcount=1) >>> trung bình(dữ liệu=[10, 20, 90]) Traceback (cuộc gọi gần đây nhất): ... TypeError: Mean() nhận được một số đối số chỉ có vị trí được truyền dưới dạng đối số từ khóa: 'data'
(Được đóng góp bởi Victor Stinner trong bpo-37032.)
Đối với số nguyên, dạng ba đối số của hàm
pow()hiện cho phép số mũ âm trong trường hợp cơ số nguyên tố cùng nhau với mô đun. Sau đó, nó tính toán nghịch đảo mô-đun cho cơ số khi số mũ là-1và lũy thừa thích hợp của nghịch đảo đó cho các số mũ âm khác. Ví dụ, để tính modular multiplicative inverse của 38 modulo 137, hãy viết:>>> pow(38, -1, 137) 119 >>> 119 * 38 % 137 1
Nghịch đảo mô đun phát sinh trong nghiệm linear Diophantine equations. Ví dụ: để tìm nghiệm số nguyên cho
4258𝑥 + 147𝑦 = 369, trước tiên hãy viết lại thành4258𝑥 ≡ 369 (mod 147)sau đó giải:>>> x = 369 * pow(4258, -1, 147) % 147 >>> y = (4258 * x - 369) // -147 >>> 4258 * x + 147 * y 369
(Được đóng góp bởi Mark Dickinson trong bpo-36027.)
Khả năng hiểu chính tả đã được đồng bộ hóa với các ký tự chính tả để khóa được tính trước và giá trị thứ hai
>>> hiểu # Dict >>> cast = {input('role? '): input('actor? ') for i in range(2)} vai trò? Vua Arthur diễn viên? Chapman vai trò? Hiệp sĩ đen diễn viên? Cleese >>> # Dict theo nghĩa đen >>> cast = {input('role? '): input('actor? ')} vai trò? Ngài Robin diễn viên? Eric nhàn rỗi
Thứ tự thực hiện được đảm bảo sẽ hữu ích với các biểu thức gán vì các biến được gán trong biểu thức khóa sẽ có sẵn trong biểu thức giá trị:
>>> tên = ['Martin von Löwis', 'Łukasz Langa', 'Walter Dörwald'] >>> {(n := normalize('NFC', name)).casefold() : n cho tên trong tên} {'martin von löwis': 'Martin von Löwis', 'łukasz langa': 'Łukasz Langa', 'walter dörwald': 'Walter Dörwald'}
(Được đóng góp bởi Jörn Heissler trong bpo-35224.)
Phương thức
object.__reduce__()hiện có thể trả về một bộ dữ liệu dài từ hai đến sáu phần tử. Trước đây, năm là giới hạn. Phần tử thứ sáu mới, tùy chọn là một phần tử có thể gọi được với chữ ký(obj, state). Điều này cho phép kiểm soát trực tiếp hành vi cập nhật trạng thái của một đối tượng cụ thể. Nếu không phải None, lệnh gọi này sẽ được ưu tiên hơn phương thức__setstate__()của đối tượng. (Được đóng góp bởi Pierre Glaser và Olivier Grisel trong bpo-35900.)
Mô-đun mới¶
Mô-đun
importlib.metadatamới cung cấp hỗ trợ (tạm thời) để đọc siêu dữ liệu từ các gói của bên thứ ba. Ví dụ: nó có thể trích xuất số phiên bản của gói đã cài đặt, danh sách các điểm vào, v.v.>>> # Note ví dụ sau đây yêu cầu các "yêu cầu" phổ biến >>> # package đã được cài đặt. >>> >>> từ phiên bản nhập importlib.metadata, yêu cầu, tệp >>> phiên bản('request') '2.22.0' >>> danh sách(yêu cầu('requests')) ['củ cải đường (<3.1.0,>=3.0.2)'] >>> danh sách(tệp('requests'))[:5] [PackagePath('requests-2.22.0.dist-info/INSTALLER'), PackagePath('requests-2.22.0.dist-info/LICENSE'), PackagePath('requests-2.22.0.dist-info/METADATA'), PackagePath('requests-2.22.0.dist-info/RECORD'), PackagePath('requests-2.22.0.dist-info/WHEEL')]
(Được đóng góp bởi Barry Warsaw và Jason R. Coombs trong bpo-34632.)
Mô-đun cải tiến¶
ast¶
Các nút AST hiện có các thuộc tính end_lineno và end_col_offset, cung cấp vị trí chính xác ở cuối nút. (Điều này chỉ áp dụng cho các nút có thuộc tính lineno và col_offset.)
Hàm mới ast.get_source_segment() trả về mã nguồn cho một nút AST cụ thể.
(Được đóng góp bởi Ivan Levkivskyi trong bpo-33416.)
Hàm ast.parse() có một số cờ mới:
type_comments=Truekhiến nó trả về văn bản của các nhận xét loại PEP 484 và PEP 526 được liên kết với các nút AST nhất định;mode='func_type'có thể được sử dụng để phân tích cú pháp "nhận xét loại chữ ký" của PEP 484 (được trả về cho các nút AST định nghĩa hàm);feature_version=(3, N)cho phép chỉ định phiên bản Python 3 cũ hơn. Ví dụ:feature_version=(3, 4)sẽ coiasyncvàawaitlà những từ không dành riêng.
(Được đóng góp bởi Guido van Rossum trong bpo-35766.)
asyncio¶
asyncio.run() đã chuyển từ API tạm thời sang ổn định. Hàm này có thể được sử dụng để thực thi coroutine và trả về kết quả trong khi tự động quản lý vòng lặp sự kiện. Ví dụ:
nhập asyncio
async def main():
đang chờ asyncio.sleep(0)
trở lại 42
asyncio.run(chính())
Đây là roughly tương đương với:
nhập asyncio
async def main():
đang chờ asyncio.sleep(0)
trở lại 42
vòng lặp = asyncio.new_event_loop()
asyncio.set_event_loop(vòng lặp)
thử:
loop.run_until_complete(main())
cuối cùng:
asyncio.set_event_loop(Không có)
loop.close()
Việc thực hiện thực tế phức tạp hơn đáng kể. Vì vậy, asyncio.run() sẽ là cách ưu tiên để chạy các chương trình asyncio.
(Được đóng góp bởi Yury Selivanov trong bpo-32314.)
Chạy python -m asyncio sẽ khởi chạy REPL không đồng bộ. Điều này cho phép thử nghiệm nhanh chóng với mã có await cấp cao nhất. Không còn cần phải gọi trực tiếp asyncio.run() để tạo ra một vòng lặp sự kiện mới trên mỗi lệnh gọi:
$ trăn -m asyncio
asyncio REPL 3.8.0
Sử dụng trực tiếp "await" thay vì "asyncio.run()".
Nhập "trợ giúp", "bản quyền", "tín dụng" hoặc "giấy phép" để biết thêm thông tin.
>>> nhập asyncio
>>> đang chờ asyncio.sleep(10, result='hello')
xin chào
(Được đóng góp bởi Yury Selivanov trong bpo-37028.)
Ngoại lệ asyncio.CancelledError hiện kế thừa từ BaseException thay vì Exception và không còn kế thừa từ concurrent.futures.CancelledError nữa. (Được đóng góp bởi Yury Selivanov trong bpo-32528.)
Trên Windows, vòng lặp sự kiện mặc định bây giờ là ProactorEventLoop. (Được đóng góp bởi Victor Stinner trong bpo-34687.)
ProactorEventLoop hiện cũng hỗ trợ UDP. (Được đóng góp bởi Adam Meily và Andrew Svetlov trong bpo-29883.)
ProactorEventLoop hiện có thể bị gián đoạn bởi KeyboardInterrupt ("CTRL+C"). (Được đóng góp bởi Vladimir Matveev trong bpo-23057.)
Đã thêm asyncio.Task.get_coro() để nhận coroutine được gói trong asyncio.Task. (Được đóng góp bởi Alex Grönholm trong bpo-36999.)
Giờ đây, các tác vụ Asyncio có thể được đặt tên bằng cách chuyển đối số từ khóa name cho asyncio.create_task() hoặc phương thức vòng lặp sự kiện create_task() hoặc bằng cách gọi phương thức set_name() trên đối tượng tác vụ. Tên tác vụ hiển thị trong đầu ra repr() của asyncio.Task và cũng có thể được truy xuất bằng phương pháp get_name(). (Được đóng góp bởi Alex Grönholm trong bpo-34270.)
Đã thêm hỗ trợ cho Happy Eyeballs vào asyncio.loop.create_connection(). Để chỉ định hành vi, hai tham số mới đã được thêm vào: happy_eyeballs_delay và interleave. Thuật toán Happy Eyeballs cải thiện khả năng phản hồi trong các ứng dụng hỗ trợ IPv4 và IPv6 bằng cách cố gắng kết nối đồng thời bằng cả hai. (Được đóng góp bởi đại sứ twisteroid trong bpo-33530.)
nội dung¶
Tích hợp compile() đã được cải tiến để chấp nhận cờ ast.PyCF_ALLOW_TOP_LEVEL_AWAIT. Với cờ mới này được thông qua, compile() sẽ cho phép các cấu trúc await, async for và async with cấp cao nhất thường được coi là cú pháp không hợp lệ. Đối tượng mã không đồng bộ được đánh dấu bằng cờ CO_COROUTINE sau đó có thể được trả về. (Được đóng góp bởi Matthias Bussonnier trong bpo-34616)
bộ sưu tập¶
Phương thức _asdict() cho collections.namedtuple() hiện trả về dict thay vì collections.OrderedDict. Điều này hoạt động vì các lệnh thông thường đã đảm bảo thứ tự kể từ Python 3.7. Nếu cần có các tính năng bổ sung của OrderedDict, cách khắc phục được đề xuất là chuyển kết quả sang loại mong muốn: OrderedDict(nt._asdict()). (Được đóng góp bởi Raymond Hettinger trong bpo-35864.)
hồ sơ c¶
Lớp cProfile.Profile hiện có thể được sử dụng làm trình quản lý bối cảnh. Cấu hình một khối mã bằng cách chạy:
nhập cProfile
với cProfile.Profile() làm trình lược tả:
# code để được lập hồ sơ
...
(Được đóng góp bởi Scott Sanderson trong bpo-29235.)
csv¶
Zz000zz hiện trả về các phiên bản của dict thay vì collections.OrderedDict. Công cụ này hiện nhanh hơn và sử dụng ít bộ nhớ hơn trong khi vẫn giữ nguyên thứ tự trường. (Được đóng góp bởi Michael Selik trong bpo-34003.)
chửi rủa¶
Đã thêm một biến mới chứa thông tin phiên bản có cấu trúc cho thư viện ncurses cơ bản: ncurses_version. (Được đóng góp bởi Serhiy Storchaka trong bpo-31680.)
ctypes¶
Trên Windows, CDLL và các lớp con hiện chấp nhận tham số winmode để chỉ định cờ cho lệnh gọi LoadLibraryEx cơ bản. Cờ mặc định được đặt thành chỉ tải các phần phụ thuộc DLL từ các vị trí đáng tin cậy, bao gồm đường dẫn lưu trữ DLL (nếu đường dẫn đầy đủ hoặc một phần được sử dụng để tải DLL ban đầu) và các đường dẫn được thêm bởi add_dll_directory(). (Được đóng góp bởi Steve Dower trong bpo-36085.)
ngày giờ¶
Đã thêm các hàm tạo thay thế mới datetime.date.fromisocalendar() và datetime.datetime.fromisocalendar(), xây dựng các đối tượng date và datetime tương ứng từ ISO năm, số tuần và ngày trong tuần; đây là nghịch đảo của phương thức isocalendar của mỗi lớp. (Được đóng góp bởi Paul Ganssle trong bpo-36004.)
công cụ chức năng¶
functools.lru_cache() hiện có thể được sử dụng như một công cụ trang trí thẳng thay vì là một hàm trả về một công cụ trang trí. Vì vậy, cả hai điều này hiện đều được hỗ trợ
@lru_cache
định nghĩa f(x):
...
@lru_cache(maxsize=256)
định nghĩa f(x):
...
(Được đóng góp bởi Raymond Hettinger trong bpo-36772.)
Đã thêm trình trang trí functools.cached_property() mới, dành cho các thuộc tính được tính toán được lưu vào bộ nhớ đệm trong suốt thời gian hoạt động của phiên bản.
nhập khẩu funtools
thống kê nhập khẩu
Bộ dữ liệu lớp:
def __init__(self, dãy_of_numbers):
self.data = dãy_of_numbers
@functools.cached_property
phương sai def (tự):
trả về số liệu thống kê.variance(self.data)
(Được đóng góp bởi Carl Meyer trong bpo-21145)
Đã thêm trình trang trí functools.singledispatchmethod() mới để chuyển đổi các phương thức thành generic functions bằng cách sử dụng single dispatch:
từ functools nhập phương thức singledispatch
từ ngăn chặn nhập ngữ cảnh
lớp Trình quản lý tác vụ:
def __init__(bản thân, nhiệm vụ):
self.tasks = danh sách(nhiệm vụ)
@singledispatchmethod
def loại bỏ (tự, giá trị):
với triệt tiêu (ValueError):
self.tasks.remove(value)
@discard.register(danh sách)
def _(bản thân, nhiệm vụ):
mục tiêu = đặt (nhiệm vụ)
self.tasks = [x cho x trong self.tasks nếu x không có trong mục tiêu]
(Được đóng góp bởi Ethan Smith trong bpo-32380)
gc¶
get_objects() hiện có thể nhận tham số generation tùy chọn cho biết thế hệ để lấy đối tượng từ đó. (Được đóng góp bởi Pablo Galindo trong bpo-36016.)
nhận được văn bản¶
Đã thêm pgettext() và các biến thể của nó. (Được đóng góp bởi Franz Glasner, Éric Araujo và Cheryl Sabella trong bpo-2504.)
gzip¶
Đã thêm tham số mtime vào gzip.compress() để có đầu ra có thể lặp lại. (Được đóng góp bởi Guo Ci Teo trong bpo-34898.)
Một ngoại lệ BadGzipFile hiện được đưa ra thay vì OSError đối với một số loại tệp gzip không hợp lệ hoặc bị hỏng. (Được đóng góp bởi Filip Gruszczyński, Michele Orrù và Zackery Spytz trong bpo-6584.)
IDLE và nhàn rỗi¶
Đầu ra trên N dòng (50 theo mặc định) được nén xuống một nút. N có thể được thay đổi trong phần PyShell của trang Chung của hộp thoại Cài đặt. Các dòng ít hơn, nhưng có thể dài hơn, có thể được nén bằng cách nhấp chuột phải vào đầu ra. Đầu ra bị nén có thể được mở rộng tại chỗ bằng cách nhấp đúp vào nút hoặc vào bảng tạm hoặc một cửa sổ riêng bằng cách nhấp chuột phải vào nút. (Được đóng góp bởi Tal Einat trong bpo-1529353.)
Thêm "Chạy tùy chỉnh" vào menu Chạy để chạy mô-đun có cài đặt tùy chỉnh. Mọi đối số dòng lệnh đã nhập đều được thêm vào sys.argv. Chúng cũng xuất hiện lại trong hộp cho lần chạy tùy chỉnh tiếp theo. Người ta cũng có thể ngăn chặn việc khởi động lại mô-đun chính Shell thông thường. (Được đóng góp bởi Cheryl Sabella, Terry Jan Reedy và những người khác trong bpo-5680 và bpo-37627.)
Đã thêm số dòng tùy chọn cho cửa sổ soạn thảo IDLE. Windows mở mà không có số dòng trừ khi được đặt khác trong tab Chung của hộp thoại cấu hình. Số dòng cho cửa sổ hiện có được hiển thị và ẩn trong menu Tùy chọn. (Được đóng góp bởi Tal Einat và Saimadhav Heblikar trong bpo-17535.)
Mã hóa gốc của hệ điều hành hiện được sử dụng để chuyển đổi giữa chuỗi Python và đối tượng Tcl. Điều này cho phép IDLE hoạt động với biểu tượng cảm xúc và các ký tự không phải BMP khác. Những ký tự này có thể được hiển thị hoặc sao chép và dán vào hoặc từ bảng ghi tạm. Chuyển đổi chuỗi từ Tcl sang Python và ngược lại không bao giờ thất bại. (Nhiều người đã làm việc này trong 8 năm nhưng vấn đề cuối cùng đã được giải quyết bởi Serhiy Storchaka trong bpo-13153.)
Mới trong phiên bản 3.8.1:
Thêm tùy chọn để tắt con trỏ nhấp nháy. (Đượ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.)
Những thay đổi ở trên đã được đưa vào bản phát hành bảo trì 3.7.
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.)
kiểm tra¶
Hàm inspect.getdoc() hiện có thể tìm chuỗi tài liệu cho __slots__ nếu thuộc tính đó là dict trong đó các giá trị là chuỗi tài liệu. Điều này cung cấp các tùy chọn tài liệu tương tự như những gì chúng tôi đã có cho property(), classmethod() và staticmethod():
lớp AudioClip:
__slots__ = {'bit_rate': 'được biểu thị bằng kilohertz đến một chữ số thập phân',
'thời lượng': 'tính bằng giây, được làm tròn thành số nguyên'}
def __init__(self, bit_rate, thời lượng):
self.bit_rate = vòng(bit_rate / 1000.0, 1)
self.duration = ceil(thời lượng)
(Được đóng góp bởi Raymond Hettinger trong bpo-36326.)
io¶
Trong chế độ phát triển (-X env) và trong debug build, trình hoàn thiện io.IOBase hiện ghi lại ngoại lệ nếu phương thức close() không thành công. Theo mặc định, ngoại lệ được bỏ qua một cách âm thầm trong bản phát hành. (Được đóng góp bởi Victor Stinner trong bpo-18748.)
itertools¶
Hàm itertools.accumulate() đã thêm một đối số từ khóa initial tùy chọn để chỉ định giá trị ban đầu:
>>> tích lũy từ nhập itertools
>>> danh sách(tích lũy([10, 5, 30, 15], khởi tạo=1000))
[1000, 1010, 1015, 1045, 1060]
(Được đóng góp bởi Lisa Roach trong bpo-34659.)
json.tool¶
Thêm tùy chọn --json-lines để phân tích từng dòng đầu vào dưới dạng một đối tượng JSON riêng biệt. (Được đóng góp bởi Weipeng Hong trong bpo-31553.)
khai thác gỗ¶
Đã thêm đối số từ khóa force vào logging.basicConfig(). Khi được đặt thành true, mọi trình xử lý hiện có được gắn vào bộ ghi nhật ký gốc sẽ bị xóa và đóng trước khi thực hiện cấu hình được chỉ định bởi các đối số khác.
Điều này giải quyết một vấn đề lâu dài. Khi một logger hoặc basicConfig() đã được gọi, các cuộc gọi tiếp theo tới basicConfig() sẽ bị bỏ qua trong âm thầm. Điều này gây khó khăn cho việc cập nhật, thử nghiệm hoặc hướng dẫn các tùy chọn cấu hình ghi nhật ký khác nhau bằng lời nhắc tương tác hoặc sổ ghi chép Jupyter.
(Được đề xuất bởi Raymond Hettinger, Donghee Na thực hiện và Vinay Sajip đánh giá trong bpo-33897.)
môn toán¶
Đã thêm chức năng mới math.dist() để tính khoảng cách Euclide giữa hai điểm. (Được đóng góp bởi Raymond Hettinger trong bpo-33089.)
Đã mở rộng chức năng math.hypot() để xử lý nhiều thứ nguyên. Trước đây, nó chỉ hỗ trợ trường hợp 2-D. (Được đóng góp bởi Raymond Hettinger trong bpo-33089.)
Đã thêm hàm mới, math.prod(), dưới dạng hàm tương tự với sum() trả về tích của giá trị 'bắt đầu' (mặc định: 1) nhân với một số lặp:
>>> trước = 0,8
>>> khả năng = [0,625, 0,84, 0,30]
>>> math.prod(khả năng, start=prior)
0,126
(Được đóng góp bởi Pablo Galindo trong bpo-35606.)
Đã thêm hai hàm tổ hợp mới math.perm() và math.comb():
>>> math.perm(10, 3) # Permutations trong số 10 thứ được lấy 3 thứ cùng một lúc
720
>>> math.comb(10, 3) # Combinations trong số 10 thứ lấy 3 thứ cùng một lúc
120
(Được đóng góp bởi Yash Aggarwal, Keller Fuchs, Serhiy Storchaka và Raymond Hettinger trong bpo-37128, bpo-37178 và bpo-35431.)
Đã thêm chức năng mới math.isqrt() để tính toán căn bậc hai số nguyên chính xác mà không cần chuyển đổi sang dấu phẩy động. Hàm mới hỗ trợ số nguyên lớn tùy ý. Nó nhanh hơn floor(sqrt(n)) nhưng chậm hơn math.sqrt():
>>> r = 650320427
>>> s = r ** 2
>>> isqrt(s - 1) # correct
650320426
>>> tầng(sqrt(s - 1)) # incorrect
650320427
(Được đóng góp bởi Mark Dickinson trong bpo-36887.)
Hàm math.factorial() không còn chấp nhận các đối số không giống int. (Được đóng góp bởi Pablo Galindo trong bpo-33083.)
mmap¶
Lớp mmap.mmap hiện có phương thức madvise() để truy cập lệnh gọi hệ thống madvise(). (Được đóng góp bởi Zackery Spytz trong bpo-32941.)
đa xử lý¶
Đã thêm mô-đun multiprocessing.shared_memory mới. (Được đóng góp bởi Davin Potts trong bpo-35813.)
Trên macOS, phương thức khởi động spawn hiện được sử dụng theo mặc định. (Được đóng góp bởi Victor Stinner trong bpo-33725.)
hệ điều hành¶
Đã thêm chức năng mới add_dll_directory() trên Windows để cung cấp đường dẫn tìm kiếm bổ sung cho các phần phụ thuộc gốc khi nhập mô-đun mở rộng hoặc tải DLL bằng ctypes. (Được đóng góp bởi Steve Dower trong bpo-36085.)
Một chức năng os.memfd_create() mới đã được thêm vào để bao bọc tòa nhà memfd_create(). (Được đóng góp bởi Zackery Spytz và Christian Heimes trong bpo-26836.)
Trên Windows, phần lớn logic thủ công để xử lý các điểm lặp lại (bao gồm các liên kết tượng trưng và các mối nối thư mục) đã được ủy quyền cho hệ điều hành. Cụ thể, os.stat() giờ đây sẽ duyệt qua mọi thứ được hệ điều hành hỗ trợ, trong khi os.lstat() sẽ chỉ mở các điểm phân tích lại được xác định là "tên thay thế" trong khi các điểm khác được mở như đối với os.stat(). Trong mọi trường hợp, os.stat_result.st_mode sẽ chỉ được đặt S_IFLNK cho các liên kết tượng trưng chứ không phải các loại điểm phân tích lại khác. Để xác định các loại điểm phân tích lại khác, hãy kiểm tra thuộc tính os.stat_result.st_reparse_tag mới.
Trên Windows, os.readlink() hiện có thể đọc các mối nối thư mục. Lưu ý rằng islink() sẽ trả về False cho các mối nối thư mục và do đó, mã kiểm tra islink trước tiên sẽ tiếp tục coi các mối nối là thư mục, trong khi mã xử lý các lỗi từ os.readlink() giờ đây có thể coi các mối nối là liên kết.
(Được đóng góp bởi Steve Dower trong bpo-37834.)
os.path¶
Các hàm os.path trả về kết quả boolean như exists(), lexists(), isdir(), isfile(), islink() và ismount() hiện trả về False thay vì tăng ValueError hoặc các lớp con UnicodeEncodeError và UnicodeDecodeError của nó cho các đường dẫn chứa các ký tự hoặc byte không thể biểu thị ở cấp hệ điều hành. (Được đóng góp bởi Serhiy Storchaka trong bpo-33721.)
expanduser() trên Windows hiện thích biến môi trường USERPROFILE hơn và không sử dụng HOME, biến này thường không được đặt cho tài khoản người dùng thông thường. (Được đóng góp bởi Anthony Sottile trong bpo-36264.)
isdir() trên Windows không còn trả về True cho liên kết đến thư mục không tồn tại.
realpath() trên Windows hiện giải quyết các điểm lặp lại, bao gồm các liên kết tượng trưng và các mối nối thư mục.
(Được đóng góp bởi Steve Dower trong bpo-37834.)
đường dẫn¶
Các phương thức pathlib.Path trả về kết quả boolean như exists(), is_dir(), is_file(), is_mount(), is_symlink(), is_block_device(), is_char_device(), is_fifo(), is_socket() hiện trả về False thay vì tăng ValueError hoặc lớp con UnicodeEncodeError của nó cho các đường dẫn chứa các ký tự không thể biểu thị ở cấp hệ điều hành. (Được đóng góp bởi Serhiy Storchaka trong bpo-33721.)
Đã thêm pathlib.Path.link_to() để tạo liên kết cứng trỏ đến một đường dẫn. (Được đóng góp bởi Joannah Nanjekye trong bpo-26978) Lưu ý rằng link_to không được dùng nữa trong 3.10 và bị xóa trong 3.12 để thay thế bằng phương thức hardlink_to được thêm vào trong 3.10 phù hợp với ngữ nghĩa của phương thức symlink_to hiện có.
dưa chua¶
Các tiện ích mở rộng pickle phân lớp Pickler được tối ưu hóa cho C giờ đây có thể ghi đè logic tẩy của các hàm và lớp bằng cách xác định phương thức reducer_override() đặc biệt. (Được đóng góp bởi Pierre Glaser và Olivier Grisel trong bpo-35900.)
plistlib¶
Đã thêm plistlib.UID mới và hỗ trợ đọc và ghi các bản sao nhị phân được mã hóa NSKeyedArchiver. (Được đóng góp bởi Jon Janzen trong bpo-26707.)
in ấn¶
Mô-đun pprint đã thêm tham số sort_dicts vào một số chức năng. Theo mặc định, các hàm đó tiếp tục sắp xếp từ điển trước khi hiển thị hoặc in. Tuy nhiên, nếu sort_dicts được đặt thành false, từ điển sẽ giữ nguyên thứ tự các phím được chèn vào. Điều này có thể hữu ích khi so sánh với đầu vào JSON trong quá trình gỡ lỗi.
Ngoài ra, còn có một chức năng mới tiện lợi, pprint.pp() giống như pprint.pprint() nhưng với sort_dicts mặc định là False:
>>> từ pprint nhập pprint, pp
>>> d = dict(source='input.txt', Operation='filter', Destination='output.txt')
>>> pp(d, width=40) thứ tự # Original
{'nguồn': 'input.txt',
'hoạt động': 'bộ lọc',
'đích': 'output.txt'}
>>> pprint(d, width=40) # Keys được sắp xếp theo thứ tự abc
{'destination': 'output.txt',
'hoạt động': 'bộ lọc',
'nguồn': 'input.txt'}
(Được đóng góp bởi Rémi Lapeyre trong bpo-30670.)
py_compile¶
py_compile.compile() hiện hỗ trợ chế độ im lặng. (Được đóng góp bởi Joannah Nanjekye trong bpo-22640.)
shlex¶
Hàm shlex.join() mới hoạt động như nghịch đảo của shlex.split(). (Được đóng góp bởi Bo Bayles trong bpo-32102.)
im lặng¶
shutil.copytree() hiện chấp nhận đối số từ khóa dirs_exist_ok mới. (Được đóng góp bởi Josh Bronson trong bpo-20849.)
shutil.make_archive() hiện mặc định ở định dạng pax (POSIX.1-2001) hiện đại cho các kho lưu trữ mới để cải thiện tính di động và sự tuân thủ tiêu chuẩn, được kế thừa từ thay đổi tương ứng đối với mô-đun tarfile. (Được đóng góp bởi C.A.M. Gerlach trong bpo-30661.)
shutil.rmtree() trên Windows hiện loại bỏ các mối nối thư mục mà không cần xóa đệ quy nội dung của chúng trước. (Được đóng góp bởi Steve Dower trong bpo-37834.)
ổ cắm¶
Đã thêm các chức năng tiện lợi create_server() và has_dualstack_ipv6() để tự động hóa các tác vụ cần thiết thường liên quan khi tạo ổ cắm máy chủ, bao gồm cả việc chấp nhận cả kết nối IPv4 và IPv6 trên cùng một ổ cắm. (Được đóng góp bởi Giampaolo Rodolà trong bpo-17561.)
Các chức năng socket.if_nameindex(), socket.if_nametoindex() và socket.if_indextoname() đã được triển khai trên Windows. (Được đóng góp bởi Zackery Spytz trong bpo-37007.)
ssl¶
Đã thêm post_handshake_auth để bật và verify_client_post_handshake() để bắt đầu xác thực sau bắt tay TLS 1.3. (Được đóng góp bởi Christian Heimes trong bpo-34670.)
thống kê¶
Đã thêm statistics.fmean() dưới dạng biến thể dấu phẩy động nhanh hơn của statistics.mean(). (Được đóng góp bởi Raymond Hettinger và Steven D'Aprano trong bpo-35904.)
Đã thêm statistics.geometric_mean() (Được đóng góp bởi Raymond Hettinger trong bpo-27181.)
Đã thêm statistics.multimode() trả về danh sách các giá trị phổ biến nhất. (Được đóng góp bởi Raymond Hettinger trong bpo-35892.)
Đã thêm statistics.quantiles() để phân chia dữ liệu hoặc phân phối thành các khoảng có thể xác suất được (ví dụ: tứ phân vị, thập phân vị hoặc phân vị). (Được đóng góp bởi Raymond Hettinger trong bpo-36546.)
Đã thêm statistics.NormalDist, một công cụ để tạo và thao tác phân phối chuẩn của một biến ngẫu nhiên. (Được đóng góp bởi Raymond Hettinger trong bpo-36018.)
>>> nhiệt độ_feb = NormalDist.from_samples([4, 12, -3, 2, 7, 14])
>>> nhiệt độ_feb.mean
6.0
>>> nhiệt độ_feb.stdev
6.356099432828281
>>> nhiệt độ_feb.cdf(3) # Chance dưới 3 độ
0.3184678262814532
>>> # Relative khả năng là 7 độ so với 10 độ
>>> nhiệt độ_feb.pdf(7) / nhiệt độ_feb.pdf(10)
1.2039930378537762
>>> el_niño = NormalDist(4, 2.5)
>>> nhiệt độ_feb += el_niño # Add trong hiệu ứng khí hậu
>>> nhiệt độ_tháng 2
NormalDist(mu=10.0, sigma=6.830080526611674)
>>> nhiệt độ_tháng hai * (5/9) + 32 # Convert sang độ F
NormalDist(mu=50.0, sigma=12.294144947901014)
>>> các mẫu ngẫu nhiên của temp_feb.samples(3) # Generate
[7.672102882379219, 12.000027119750287, 4.647488369766392]
hệ thống¶
Thêm chức năng sys.unraisablehook() mới có thể được ghi đè để kiểm soát cách xử lý "các ngoại lệ không thể xử lý được". Nó được gọi khi có ngoại lệ xảy ra nhưng Python không có cách nào để xử lý nó. Ví dụ: khi hàm hủy tạo ra một ngoại lệ hoặc trong quá trình thu gom rác (gc.collect()). (Được đóng góp bởi Victor Stinner trong bpo-36829.)
hồ dầu¶
Mô-đun tarfile hiện mặc định ở định dạng pax (POSIX.1-2001) hiện đại cho các kho lưu trữ mới, thay vì định dạng dành riêng cho GNU trước đó. Điều này cải thiện khả năng di động đa nền tảng với mã hóa nhất quán (UTF-8) ở định dạng được tiêu chuẩn hóa và có thể mở rộng, đồng thời mang lại một số lợi ích khác. (Được đóng góp bởi C.A.M. Gerlach trong bpo-36268.)
luồng¶
Thêm chức năng threading.excepthook() mới để xử lý ngoại lệ threading.Thread.run() chưa được phát hiện. Nó có thể được ghi đè để kiểm soát cách xử lý các ngoại lệ threading.Thread.run() chưa được xử lý. (Được đóng góp bởi Victor Stinner trong bpo-1230540.)
Thêm chức năng threading.get_native_id() mới và thuộc tính native_id vào lớp threading.Thread. Chúng trả về ID luồng tích phân gốc của luồng hiện tại được hạt nhân gán. Tính năng này chỉ khả dụng trên một số nền tảng nhất định, xem get_native_id để biết thêm thông tin. (Được đóng góp bởi Jake Tesler trong bpo-36084.)
mã hóa¶
Mô-đun tokenize hiện ngầm phát ra mã thông báo NEWLINE khi được cung cấp đầu vào không có dòng mới ở cuối. Hành vi này hiện khớp với những gì mã thông báo C thực hiện trong nội bộ. (Được đóng góp bởi Ammar Askar trong bpo-33899.)
tkinter¶
Đã thêm các phương thức selection_from(), selection_present(), selection_range() và selection_to() trong lớp tkinter.Spinbox. (Được đóng góp bởi Juliette Monsel trong bpo-34829.)
Đã thêm phương thức moveto() trong lớp tkinter.Canvas. (Được đóng góp bởi Juliette Monsel trong bpo-23831.)
Lớp tkinter.PhotoImage hiện có các phương thức transparency_get() và transparency_set(). (Được đóng góp bởi Zackery Spytz trong bpo-25451.)
thời gian¶
Đã thêm đồng hồ mới CLOCK_UPTIME_RAW cho macOS 10.12. (Được đóng góp bởi Joannah Nanjekye trong bpo-35702.)
đánh máy¶
Mô-đun typing kết hợp một số tính năng mới:
Một loại từ điển với các loại mỗi khóa. Xem PEP 589 và
typing.TypedDict. TypedDict chỉ sử dụng các phím chuỗi. Theo mặc định, mọi khóa đều phải có mặt. Chỉ định "total=False" để cho phép các khóa là tùy chọn:Vị trí lớp (TypedDict, Total=False): lat_long: bộ dữ liệu lưới_square: str xy_coordine: bộ dữ liệu
Các loại chữ. Xem PEP 586 và
typing.Literal. Các kiểu chữ chỉ ra rằng một tham số hoặc giá trị trả về bị ràng buộc ở một hoặc nhiều giá trị chữ cụ thể:def get_status(port: int) -> Literal['connected', 'disconnected']: ...
Các biến, hàm, phương thức và lớp "cuối cùng". Xem PEP 591,
typing.Finalvàtyping.final(). Vòng loại cuối cùng hướng dẫn trình kiểm tra loại tĩnh để hạn chế phân lớp, ghi đè hoặc gán lại:pi: Cuối cùng[float] = 3.1415926536
Định nghĩa giao thức. Xem PEP 544,
typing.Protocolvàtyping.runtime_checkable(). Các ABC đơn giản nhưtyping.SupportsInthiện là lớp conProtocol.Lớp giao thức mới
typing.SupportsIndex.Chức năng mới
typing.get_origin()vàtyping.get_args().
dữ liệu unicode¶
Mô-đun unicodedata đã được nâng cấp để sử dụng phiên bản Unicode 12.1.0.
Hàm mới is_normalized() có thể được sử dụng để xác minh một chuỗi ở dạng chuẩn cụ thể, thường nhanh hơn nhiều so với việc chuẩn hóa chuỗi đó. (Được đóng góp bởi Max Belanger, David Euresti và Greg Price trong bpo-32285 và bpo-37966).
nhỏ nhất¶
Đã thêm AsyncMock để hỗ trợ phiên bản không đồng bộ của Mock. Các chức năng xác nhận mới phù hợp để thử nghiệm cũng đã được thêm vào. (Được đóng góp bởi Lisa Roach trong bpo-26467).
Đã thêm addModuleCleanup() và addClassCleanup() vào unittest để hỗ trợ dọn dẹp setUpModule() và setUpClass(). (Được đóng góp bởi Lisa Roach trong bpo-24412.)
Một số hàm xác nhận giả hiện nay cũng in danh sách các lệnh gọi thực tế khi bị lỗi. (Được đóng góp bởi Petter Strandmark trong bpo-35047.)
Mô-đun unittest đã hỗ trợ các coroutine được sử dụng làm trường hợp thử nghiệm với unittest.IsolatedAsyncioTestCase. (Được đóng góp bởi Andrew Svetlov trong bpo-32972.)
Ví dụ:
nhập khẩu đơn vị nhất
lớp TestRequest(unittest.IsolatedAsyncioTestCase):
async def asyncSetUp(self):
self.connection = đang chờ AsyncConnection()
async def test_get(self):
phản hồi = đang chờ self.connection.get ("https://example.com")
self.assertEqual(response.status_code, 200)
async def asyncTearDown(self):
đang chờ self.connection.close()
nếu __name__ == "__main__":
unittest.main()
venv¶
venv hiện bao gồm tập lệnh Activate.ps1 trên tất cả các nền tảng để kích hoạt môi trường ảo trong PowerShell Core 6.1. (Được đóng góp bởi Brett Cannon trong bpo-32718.)
điểm yếu¶
Các đối tượng proxy được weakref.proxy() trả về hiện hỗ trợ các toán tử nhân ma trận @ và @= ngoài các toán tử số khác. (Được đóng góp bởi Mark Dickinson trong bpo-36669.)
xml¶
Để giảm thiểu khả năng truy xuất DTD và thực thể bên ngoài, các mô-đun xml.dom.minidom và xml.sax không còn xử lý các thực thể bên ngoài theo mặc định nữa. (Được đóng góp bởi Christian Heimes trong bpo-17239.)
Các phương thức .find*() trong mô-đun xml.etree.ElementTree hỗ trợ tìm kiếm ký tự đại diện như {*}tag bỏ qua không gian tên và {namespace}* trả về tất cả các thẻ trong không gian tên đã cho. (Được đóng góp bởi Stefan Behnel trong bpo-28238.)
Mô-đun xml.etree.ElementTree cung cấp chức năng mới canonicalize() triển khai C14N 2.0. (Được đóng góp bởi Stefan Behnel trong bpo-13611.)
Đối tượng mục tiêu của xml.etree.ElementTree.XMLParser có thể nhận các sự kiện khai báo vùng tên thông qua các phương thức gọi lại mới start_ns() và end_ns(). Ngoài ra, mục tiêu xml.etree.ElementTree.TreeBuilder có thể được cấu hình để xử lý các sự kiện về nhận xét và hướng dẫn xử lý để đưa chúng vào cây được tạo. (Được đóng góp bởi Stefan Behnel trong bpo-36676 và bpo-36673.)
xmlrpc¶
xmlrpc.client.ServerProxy hiện hỗ trợ đối số từ khóa headers tùy chọn cho một chuỗi các tiêu đề HTTP được gửi cùng với mỗi yêu cầu. Trong số những thứ khác, điều này giúp có thể nâng cấp từ xác thực cơ bản mặc định lên xác thực phiên nhanh hơn. (Được đóng góp bởi Cédric Krier trong bpo-35153.)
Tối ưu hóa¶
Mô-đun
subprocesshiện có thể sử dụng chức năngos.posix_spawn()trong một số trường hợp để có hiệu suất tốt hơn. Hiện tại, nó chỉ được sử dụng trên macOS và Linux (sử dụng glibc 2.24 trở lên) nếu đáp ứng tất cả các điều kiện sau:close_fds là sai;
Các thông số preexec_fn, pass_fds, cwd và start_new_session không được đặt;
đường dẫn executable chứa một thư mục.
(Được đóng góp bởi Joannah Nanjekye và Victor Stinner trong bpo-35537.)
shutil.copyfile(),shutil.copy(),shutil.copy2(),shutil.copytree()vàshutil.move()sử dụng các tòa nhà "sao chép nhanh" dành riêng cho nền tảng trên Linux và macOS để sao chép tệp hiệu quả hơn. "sao chép nhanh" có nghĩa là hoạt động sao chép xảy ra trong kernel, tránh việc sử dụng vùng đệm vùng người dùng trong Python như trong "outfd.write(infd.read())". Trên Windowsshutil.copyfile()sử dụng kích thước bộ đệm mặc định lớn hơn (1 MiB thay vì 16 KiB) và sử dụng biến thểshutil.copyfileobj()dựa trênmemoryview(). Tốc độ sao chép tệp 512 MiB trong cùng một phân vùng là khoảng +26% trên Linux, +50% trên macOS và +40% trên Windows. Ngoài ra, chu kỳ CPU được tiêu thụ ít hơn nhiều. Xem phần Hoạt động sao chép hiệu quả phụ thuộc vào nền tảng. (Được đóng góp bởi Giampaolo Rodolà trong bpo-33671.)shutil.copytree()sử dụng chức năngos.scandir()và tất cả các chức năng sao chép tùy thuộc vào nó sử dụng các giá trịos.stat()được lưu trong bộ nhớ cache. Tốc độ sao chép thư mục chứa 8000 tệp tăng lên khoảng +9% trên Linux, +20% trên Windows và +30% trên chia sẻ Windows SMB. Ngoài ra, số lượng tòa nhàos.stat()cũng giảm 38%, khiếnshutil.copytree()đặc biệt nhanh hơn trên các hệ thống tệp mạng. (Được đóng góp bởi Giampaolo Rodolà trong bpo-33695.)Giao thức mặc định trong mô-đun
picklehiện là Giao thức 4, được giới thiệu lần đầu trong Python 3.4. Nó cung cấp hiệu suất tốt hơn và kích thước nhỏ hơn so với Giao thức 3 có sẵn kể từ Python 3.0.Đã xóa một thành viên
Py_ssize_tkhỏiPyGC_Head. Kích thước của tất cả các đối tượng được theo dõi GC (ví dụ: tuple, list, dict) đều giảm 4 hoặc 8 byte. (Được đóng góp bởi Inada Naoki trong bpo-33597.)uuid.UUIDhiện sử dụng__slots__để giảm dung lượng bộ nhớ. (Được đóng góp bởi Wouter Bolsterlee và Tal Einat trong bpo-30977)Cải thiện hiệu suất của
operator.itemgetter()thêm 33%. Tối ưu hóa việc xử lý đối số và thêm một đường dẫn nhanh cho trường hợp chung của một chỉ mục số nguyên không âm vào một bộ dữ liệu (là trường hợp sử dụng điển hình trong thư viện chuẩn). (Được đóng góp bởi Raymond Hettinger trong bpo-35664.)Tra cứu trường tăng tốc trong
collections.namedtuple(). Giờ đây chúng nhanh hơn gấp hai lần, khiến chúng trở thành hình thức tra cứu biến mẫu nhanh nhất trong Python. (Được đóng góp bởi Raymond Hettinger, Pablo Galindo và Joe Jevnik, Serhiy Storchaka trong bpo-32492.)Hàm tạo
listkhông phân bổ tổng thể bộ đệm mục bên trong nếu iterable đầu vào có độ dài đã biết (đầu vào triển khai__len__). Điều này làm cho danh sách được tạo trung bình nhỏ hơn 12%. (Được đóng góp bởi Raymond Hettinger và Pablo Galindo trong bpo-33234.)Tăng gấp đôi tốc độ ghi biến lớp. Khi một thuộc tính không phải là dunder được cập nhật, sẽ có lệnh gọi cập nhật vị trí không cần thiết. (Được đóng góp bởi Stefan Behnel, Pablo Galindo Salgado, Raymond Hettinger, Neil Schenauer và Serhiy Storchaka trong bpo-36012.)
Giảm chi phí chuyển đổi các đối số được truyền cho nhiều hàm và phương thức dựng sẵn. Điều này đã tăng tốc độ gọi một số hàm và phương thức dựng sẵn đơn giản lên tới 20--50%. (Được đóng góp bởi Serhiy Storchaka trong bpo-23867, bpo-35582 và bpo-36127.)
Lệnh
LOAD_GLOBALhiện sử dụng cơ chế "mỗi bộ đệm opcode" mới. Bây giờ nó nhanh hơn khoảng 40%. (Được đóng góp bởi Yury Selivanov và Inada Naoki trong bpo-26219.)
Xây dựng và thay đổi C API¶
sys.abiflagsmặc định đã trở thành một chuỗi trống: cờmcho pymalloc trở nên vô dụng (các bản dựng có và không có pymalloc đều tương thích với ABI) và do đó đã bị xóa. (Được đóng góp bởi Victor Stinner trong bpo-36707.)Ví dụ về những thay đổi:
Chỉ có chương trình
python3.8được cài đặt, chương trìnhpython3.8mkhông còn nữa.Chỉ tập lệnh
python3.8-configđược cài đặt, tập lệnhpython3.8m-configkhông còn nữa.Cờ
mđã bị xóa khỏi hậu tố của tên tệp thư viện động: các mô-đun mở rộng trong thư viện tiêu chuẩn cũng như các mô-đun được sản xuất và cài đặt bởi các gói bên thứ ba, như các gói được tải xuống từ PyPI. Ví dụ: trên Linux, hậu tố.cpython-37m-x86_64-linux-gnu.socủa Python 3.7 đã trở thành.cpython-38-x86_64-linux-gnu.sotrong Python 3.8.
Các tệp tiêu đề đã được sắp xếp lại để phân tách tốt hơn các loại API khác nhau:
Include/*.hphải là C API ổn định công cộng di động.Include/cpython/*.hphải là C API không ổn định dành riêng cho CPython; API công khai, với một số API riêng tư có tiền tố là_Pyhoặc_PY.Include/internal/*.hlà C API nội bộ riêng tư rất cụ thể cho CPython. Zz003zz này không được bảo hành về khả năng tương thích ngược và không được sử dụng bên ngoài CPython. Nó chỉ được hiển thị cho các nhu cầu rất cụ thể như trình gỡ lỗi và cấu hình phải truy cập vào nội bộ CPython mà không cần gọi hàm. Zz004zz này hiện đã được cài đặt bởimake install.
(Được đóng góp bởi Victor Stinner trong bpo-35134 và bpo-35081, công việc do Eric Snow khởi xướng trong Python 3.7.)
Một số macro đã được chuyển đổi thành các hàm nội tuyến tĩnh: các loại tham số và kiểu trả về được xác định rõ ràng, chúng không có vấn đề cụ thể đối với macro, các biến có phạm vi cục bộ. Ví dụ:
PyObject_INIT,PyObject_INIT_VARChức năng riêng:
_PyObject_GC_TRACK(),_PyObject_GC_UNTRACK(),_Py_Dealloc()
(Được đóng góp bởi Victor Stinner trong bpo-35059.)
Các chức năng
PyByteArray_Init()vàPyByteArray_Fini()đã bị xóa. Họ không làm gì vì Python 2.7.4 và Python 3.2.0, đã bị loại khỏi API giới hạn (ABI ổn định) và không được ghi lại. (Được đóng góp bởi Victor Stinner trong bpo-35713.)Kết quả của
PyExceptionClass_Name()hiện thuộc loạiconst char *thay vìchar *. (Được đóng góp bởi Serhiy Storchaka trong bpo-33818.)Tính hai mặt của
Modules/Setup.distvàModules/Setupđã bị loại bỏ. Trước đây, khi cập nhật cây nguồn CPython, người ta phải sao chép thủ côngModules/Setup.dist(bên trong cây nguồn) sangModules/Setup(bên trong cây xây dựng) để phản ánh mọi thay đổi ngược dòng. Đây là một lợi ích nhỏ đối với các nhà đóng gói nhưng lại gây khó chịu cho các nhà phát triển sau quá trình phát triển CPython, vì việc quên sao chép tệp có thể gây ra lỗi xây dựng.Bây giờ hệ thống xây dựng luôn đọc từ
Modules/Setupbên trong cây nguồn. Những người muốn tùy chỉnh tệp đó được khuyến khích duy trì các thay đổi của họ trong nhánh git của CPython hoặc dưới dạng tệp vá, giống như cách họ làm đối với bất kỳ thay đổi nào khác đối với cây nguồn.(Được đóng góp bởi Antoine Pitrou trong bpo-32430.)
Các hàm chuyển đổi số Python thành số nguyên C như
PyLong_AsLong()và các hàm phân tích đối số nhưPyArg_ParseTuple()với các đơn vị định dạng chuyển đổi số nguyên như'i'giờ đây sẽ sử dụng phương thức đặc biệt__index__()thay vì__int__(), nếu có. Cảnh báo không dùng nữa sẽ được đưa ra đối với các đối tượng có phương thức__int__()nhưng không có phương thức__index__()(nhưDecimalvàFraction).PyNumber_Check()bây giờ sẽ trả về1cho các đối tượng triển khai__index__().PyNumber_Long(),PyNumber_Float()vàPyFloat_AsDouble()hiện cũng sử dụng phương pháp__index__()nếu có. (Được đóng góp bởi Serhiy Storchaka trong bpo-36048 và bpo-20092.)Các đối tượng loại được phân bổ heap giờ đây sẽ tăng số lượng tham chiếu của chúng trong
PyObject_Init()(và macroPyObject_INITsong song của nó) thay vì trongPyType_GenericAlloc(). Các loại sửa đổi phân bổ hoặc phân bổ phiên bản có thể cần phải được điều chỉnh. (Được đóng góp bởi Eddie Elizondo trong bpo-35810.)Hàm mới
PyCode_NewWithPosOnlyArgs()cho phép tạo các đối tượng mã nhưPyCode_New(), nhưng có thêm tham số posonlyargcount để chỉ ra số lượng đối số chỉ có vị trí. (Được đóng góp bởi Pablo Galindo trong bpo-37221.)Py_SetPath()hiện đặtsys.executablethành đường dẫn đầy đủ của chương trình (Py_GetProgramFullPath()) thay vì tên chương trình (Py_GetProgramName()). (Được đóng góp bởi Victor Stinner trong bpo-38234.)
Không được dùng nữa¶
Lệnh distutils
bdist_wininsthiệ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 Victor Stinner trong bpo-37481.)Các phương thức không dùng nữa
getchildren()vàgetiterator()trong mô-đunElementTreehiện phát raDeprecationWarningthay vìPendingDeprecationWarning. Chúng sẽ bị xóa trong Python 3.9. (Được đóng góp bởi Serhiy Storchaka trong bpo-29209.)Việc chuyển một đối tượng không phải là phiên bản của
concurrent.futures.ThreadPoolExecutorsangloop.set_default_executor()không được dùng nữa và sẽ bị cấm trong Python 3.9. (Được đóng góp bởi Elvis Pranskevichus trong bpo-34075.)Các phương thức
__getitem__()củaxml.dom.pulldom.DOMEventStream,wsgiref.util.FileWrappervàfileinput.FileInputkhông còn được dùng nữa.Việc triển khai các phương thức này đã bỏ qua tham số index của chúng và thay vào đó trả về mục tiếp theo. (Được đóng góp bởi Berker Peksag trong bpo-9372.)
Lớp
typing.NamedTupleđã không dùng thuộc tính_field_typesnữa mà thay vào đó là thuộc tính__annotations__có cùng thông tin. (Được đóng góp bởi Raymond Hettinger trong bpo-36320.)Các lớp
astNum,Str,Bytes,NameConstantvàEllipsisđượ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.Constantnên được sử dụng thay thế. (Được đóng góp bởi Serhiy Storchaka trong bpo-32892.)Các phương thức
ast.NodeVisitorvisit_Num(),visit_Str(),visit_Bytes(),visit_NameConstant()vàvisit_Ellipsis()hiện không được dùng nữa và sẽ không được gọi trong các phiên bản Python trong tương lai. Thêm phương thứcvisit_Constant()để xử lý tất cả các nút không đổi. (Được đóng góp bởi Serhiy Storchaka trong bpo-36917.)@asyncio.coroutinedecorator không được dùng nữa và sẽ bị xóa trong phiên bản 3.10. Thay vì@asyncio.coroutine, hãy sử dụngasync def. (Được đóng góp bởi Andrew Svetlov trong bpo-36921.)Trong
asyncio, việc truyền rõ ràng đối số loop không được dùng nữa và sẽ bị xóa trong phiên bản 3.10 đối với các đối số sau:asyncio.sleep(),asyncio.gather(),asyncio.shield(),asyncio.wait_for(),asyncio.wait(),asyncio.as_completed(),asyncio.Task,asyncio.Lock,asyncio.Event,asyncio.Condition,asyncio.Semaphore,asyncio.BoundedSemaphore,asyncio.Queue,asyncio.create_subprocess_exec()vàasyncio.create_subprocess_shell().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 trong bpo-34790.)Các hàm và phương thức sau không được dùng nữa trong mô-đun
gettext:lgettext(),ldgettext(),lngettext()vàldngettext(). Chúng trả về các byte được mã hóa và có thể bạn sẽ gặp phải các ngoại lệ không mong muốn liên quan đến Unicode nếu có vấn đề về mã hóa với chuỗi được dịch. Sẽ tốt hơn nhiều nếu sử dụng các giải pháp thay thế trả về chuỗi Unicode trong Python 3. Các hàm này đã bị hỏng từ lâu.Hàm
bind_textdomain_codeset(), các phương thứcNullTranslations.output_charset()vàNullTranslations.set_output_charset()cũng như tham số codeset của các hàmtranslation()vàinstall()cũng không được dùng nữa vì chúng chỉ được sử dụng cho các hàml*gettext(). (Được đóng góp bởi Serhiy Storchaka trong bpo-33710.)Phương thức
isAlive()củathreading.Threadkhông còn được dùng nữa. (Được đóng góp bởi Donghee Na trong bpo-35283.)Nhiều hàm dựng sẵn và mở rộng lấy đối số nguyên giờ đây sẽ phát ra cảnh báo không dùng nữa đối với
Decimals,Fractions và bất kỳ đối tượng nào 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__()). Trong phiên bản tương lai chúng sẽ có lỗi. (Được đóng góp bởi Serhiy Storchaka trong bpo-36048.)Không được dùng nữa khi chuyển các đối số sau làm đối số từ khóa:
func trong
functools.partialmethod(),weakref.finalize(),profile.Profile.runcall(),cProfile.Profile.runcall(),bdb.Bdb.runcall(),trace.Trace.runfunc()vàcurses.wrapper().function trong
unittest.TestCase.addCleanup().fn trong phương thức
submit()củaconcurrent.futures.ThreadPoolExecutorvàconcurrent.futures.ProcessPoolExecutor.callback trong
contextlib.ExitStack.callback(),contextlib.AsyncExitStack.callback()vàcontextlib.AsyncExitStack.push_async_callback().c và typeid trong phương thức
create()củamultiprocessing.managers.Servervàmultiprocessing.managers.SharedMemoryServer.obj trong
weakref.finalize().
Trong các bản phát hành Python trong tương lai, chúng sẽ là positional-only. (Được đóng góp bởi Serhiy Storchaka trong bpo-36492.)
API và loại bỏ tính năng¶
Các tính năng và API sau đã bị xóa khỏi Python 3.8:
Bắt đầu với Python 3.3, việc nhập ABC từ
collectionskhông còn được dùng nữa và việc nhập phải được thực hiện từcollections.abc. Khả năng nhập từ các bộ sưu tập đã được đánh dấu là sẽ bị xóa trong phiên bản 3.8 nhưng đã bị trì hoãn ở phiên bản 3.9. (Xem gh-81134.)Mô-đun
macpath, không được dùng nữa trong Python 3.7, đã bị xóa. (Được đóng góp bởi Victor Stinner trong bpo-35471.)Hàm
platform.popen()đã bị xóa sau khi không được dùng nữa kể từ Python 3.3: thay vào đó hãy sử dụngos.popen(). (Được đóng góp bởi Victor Stinner trong bpo-35345.)Hàm
time.clock()đã bị xóa sau khi không được dùng nữa kể từ Python 3.3: thay vào đó, hãy sử dụngtime.perf_counter()hoặctime.process_time(), tùy theo yêu cầu của bạn, để có hành vi được xác định rõ ràng. (Được đóng góp bởi Matthias Bussonnier trong bpo-36895.)Tập lệnh
pyvenvđã bị xóa để thay thế chopython3.8 -m venvnhằm giúp loại bỏ sự nhầm lẫn về trình thông dịch Python mà tập lệnhpyvenvđược gắn vào. (Được đóng góp bởi Brett Cannon trong bpo-25427.)parse_qs,parse_qslvàescapebị xóa khỏi mô-đuncgi. Chúng không được dùng nữa trong Python 3.2 trở lên. Thay vào đó, chúng nên được nhập từ các mô-đunurllib.parsevàhtml.Chức năng
filemodebị xóa khỏi mô-đuntarfile. Nó không được ghi lại và không được dùng nữa kể từ Python 3.3.Hàm tạo
XMLParserkhông còn chấp nhận đối số html nữa. Nó không bao giờ có hiệu lực và không được dùng nữa trong Python 3.4. Tất cả các thông số khác bây giờ là keyword-only. (Được đóng góp bởi Serhiy Storchaka trong bpo-29209.)Đã xóa phương thức
doctype()củaXMLParser. (Được đóng góp bởi Serhiy Storchaka trong bpo-29209.)Codec "unicode_internal" bị xóa. (Được đóng góp bởi Inada Naoki trong bpo-36297.)
Các đối tượng
CachevàStatementcủa mô-đunsqlite3không được hiển thị cho người dùng. (Được đóng góp bởi Aviv Palivoda trong bpo-30262.)Đối số từ khóa
bufsizecủafileinput.input()vàfileinput.FileInput()đã bị bỏ qua và không được dùng nữa kể từ khi Python 3.6 bị xóa. bpo-36952 (Đóng góp bởi Matthias Bussonnier.)Các hàm
sys.set_coroutine_wrapper()vàsys.get_coroutine_wrapper()không được dùng nữa trong Python 3.7 đã bị xóa; bpo-36933 (Đóng góp bởi Matthias Bussonnier.)
Chuyển sang Python 3.8¶
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 hành vi của Python¶
Biểu thức lợi nhuận (cả mệnh đề
yieldvàyield from) hiện không được phép trong biểu thức hiểu và biểu thức trình tạo (ngoài biểu thức có thể lặp lại trong mệnh đềforngoài cùng bên trái). (Được đóng góp bởi Serhiy Storchaka trong bpo-10544.)Trình biên dịch hiện tạo ra
SyntaxWarningkhi sử dụng kiểm tra danh tính (isvàis not) với một số loại chữ nhất định (ví dụ: chuỗi, số). Những thứ này thường có thể hoạt động một cách tình cờ trong CPython, nhưng không được đảm bảo bởi thông số ngôn ngữ. Cảnh báo khuyên người dùng nên sử dụng các bài kiểm tra đẳng thức (==và!=) để thay thế. (Được đóng góp bởi Serhiy Storchaka trong bpo-34850.)Trình thông dịch CPython có thể nuốt các ngoại lệ trong một số trường hợp. Trong Python 3.8, điều này xảy ra với ít trường hợp hơn. Đặc biệt, các ngoại lệ được nêu ra khi lấy thuộc tính từ từ điển loại không còn bị bỏ qua. (Được đóng góp bởi Serhiy Storchaka trong bpo-35459.)
Đã xóa việc triển khai
__str__khỏi các kiểu dựng sẵnbool,int,float,complexvà một số lớp khỏi thư viện chuẩn. Bây giờ họ kế thừa__str__()từobject. Do đó, việc xác định phương thức__repr__()trong lớp con của các lớp này sẽ ảnh hưởng đến việc biểu diễn chuỗi của chúng. (Được đóng góp bởi Serhiy Storchaka trong bpo-36793.)Trên AIX,
sys.platformkhông còn chứa phiên bản chính nữa. Nó luôn là'aix', thay vì'aix3'..'aix7'. Vì các phiên bản Python cũ hơn bao gồm số phiên bản nên bạn nên luôn sử dụngsys.platform.startswith('aix'). (Được đóng góp bởi M. Felt trong bpo-36588.)PyEval_AcquireLock()vàPyEval_AcquireThread()hiện chấm dứt chuỗi hiện tại nếu được gọi trong khi trình thông dịch đang hoàn tất, làm cho chúng nhất quán vớiPyEval_RestoreThread(),Py_END_ALLOW_THREADS()vàPyGILState_Ensure(). Nếu hành vi này không mong muốn, hãy bảo vệ cuộc gọi bằng cách kiểm tra_Py_IsFinalizing()hoặcsys.is_finalizing(). (Được đóng góp bởi Joannah Nanjekye trong bpo-36475.)
Những thay đổi trong Python API¶
Hàm
os.getcwdb()hiện sử dụng mã hóa UTF-8 trên Windows, thay vì trang mã ANSI: xem PEP 529 để biết lý do. Chức năng này không còn được dùng nữa trên Windows. (Được đóng góp bởi Victor Stinner trong bpo-37412.)subprocess.Popenhiện có thể sử dụngos.posix_spawn()trong một số trường hợp để có hiệu suất tốt hơn. Trên Hệ thống con Windows dành cho Linux và Mô phỏng người dùng QEMU, hàm tạoPopensử dụngos.posix_spawn()không còn đưa ra ngoại lệ đối với các lỗi như "thiếu chương trình". Thay vào đó, quá trình con không thành công vớireturncodekhác 0. (Được đóng góp bởi Joannah Nanjekye và Victor Stinner trong bpo-35537.)Đối số preexec_fn của *
subprocess.Popenkhông còn tương thích với trình thông dịch phụ. Việc sử dụng tham số trong trình thông dịch phụ hiện làm tăngRuntimeError. (Được đóng góp bởi Eric Snow trong bpo-34651, được sửa đổi bởi Christian Heimes trong bpo-37951.)Phương thức
imaplib.IMAP4.logout()không còn âm thầm bỏ qua các ngoại lệ tùy ý nữa. (Được đóng góp bởi Victor Stinner trong bpo-36348.)Hàm
platform.popen()đã bị xóa sau khi không được dùng nữa kể từ Python 3.3: thay vào đó hãy sử dụngos.popen(). (Được đóng góp bởi Victor Stinner trong bpo-35345.)Hàm
statistics.mode()không còn đưa ra ngoại lệ khi được cung cấp dữ liệu đa phương thức. Thay vào đó, nó trả về chế độ đầu tiên gặp phải trong dữ liệu đầu vào. (Được đóng góp bởi Raymond Hettinger trong bpo-35892.)Phương thức
selection()của lớptkinter.ttk.Treeviewkhông còn nhận đối số nữa. Việc sử dụng nó với các đối số để thay đổi lựa chọn không được dùng nữa trong Python 3.6. Sử dụng các phương pháp chuyên dụng nhưselection_set()để thay đổi vùng chọn. (Được đóng góp bởi Serhiy Storchaka trong bpo-31508.)Các phương thức
writexml(),toxml()vàtoprettyxml()củaxml.dom.minidomvà phương thứcwrite()củaxml.etree.ElementTreehiện giữ nguyên thứ tự thuộc tính do người dùng chỉ định. (Được đóng góp bởi Diego Rojas và Raymond Hettinger trong bpo-34160.)Cơ sở dữ liệu
dbm.dumbđược mở bằng cờ'r'hiện ở chế độ chỉ đọc.dbm.dumb.open()với cờ'r'và'w'không còn tạo cơ sở dữ liệu nếu nó không tồn tại. (Được đóng góp bởi Serhiy Storchaka trong bpo-32749.)Phương thức
doctype()được xác định trong lớp con củaXMLParsersẽ không còn được gọi và sẽ phát raRuntimeWarningthay vìDeprecationWarning. Xác định phương thứcdoctype()trên mục tiêu để xử lý khai báo loại tài liệu XML. (Được đóng góp bởi Serhiy Storchaka trong bpo-29209.)Một
RuntimeErrorhiện được đưa ra khi siêu dữ liệu tùy chỉnh không cung cấp mục nhập__classcell__trong không gian tên được chuyển tớitype.__new__. MộtDeprecationWarningđược phát ra trong Python 3.6--3.7. (Được đóng góp bởi Serhiy Storchaka trong bpo-23722.)Lớp
cProfile.Profilehiện có thể được sử dụng làm trình quản lý bối cảnh. (Được đóng góp bởi Scott Sanderson trong bpo-29235.)shutil.copyfile(),shutil.copy(),shutil.copy2(),shutil.copytree()vàshutil.move()sử dụng các tòa nhà cao tầng "sao chép nhanh" dành riêng cho nền tảng (xem phần Hoạt động sao chép hiệu quả phụ thuộc vào nền tảng).Kích thước bộ đệm mặc định
shutil.copyfile()trên Windows đã được thay đổi từ 16 KiB thành 1 MiB.Cấu trúc
PyGC_Headđã thay đổi hoàn toàn. Tất cả mã chạm vào thành viên cấu trúc phải được viết lại. (Xem bpo-33597.)Cấu trúc
PyInterpreterStateđã được chuyển vào các tệp tiêu đề "nội bộ" (cụ thể là Bao gồm/nội bộ/pycore_pystate.h). MộtPyInterpreterStatemờ vẫn có sẵn như một phần của API công khai (và ABI ổn định). Các tài liệu chỉ ra rằng không có trường nào của struct là công khai, vì vậy chúng tôi hy vọng chưa có ai sử dụng chúng. Tuy nhiên, nếu bạn dựa vào một hoặc nhiều trường riêng tư đó và không có giải pháp thay thế thì vui lòng mở vấn đề BPO. Chúng tôi sẽ nỗ lực giúp bạn điều chỉnh (có thể bao gồm việc thêm các chức năng truy cập vào API công khai). (Xem bpo-35886.)Phương thức
mmap.flush()hiện trả vềNonekhi thành công và đưa ra một ngoại lệ về lỗi trên tất cả các nền tảng. Trước đây, hành vi của nó phụ thuộc vào nền tảng: giá trị khác 0 được trả về khi thành công; số 0 được trả về do lỗi trong Windows. Giá trị 0 được trả về khi thành công; một ngoại lệ đã được đưa ra do lỗi trong Unix. (Được đóng góp bởi Berker Peksag trong bpo-2122.)Các mô-đun
xml.dom.minidomvàxml.saxkhông còn xử lý các thực thể bên ngoài theo mặc định nữa. (Được đóng góp bởi Christian Heimes trong bpo-17239.)Xóa khóa khỏi cơ sở dữ liệu
dbmchỉ đọc (dbm.dumb,dbm.gnuhoặcdbm.ndbm) sẽ tăngerror(dbm.dumb.error,dbm.gnu.errorhoặcdbm.ndbm.error) thay vìKeyError. (Được đóng góp bởi Xiang Zhang trong bpo-33106.)AST được đơn giản hóa cho chữ. Tất cả các hằng số sẽ được biểu diễn dưới dạng phiên bản
ast.Constant. Việc khởi tạo các lớp cũNum,Str,Bytes,NameConstantvàEllipsissẽ trả về một phiên bản củaConstant. (Được đóng góp bởi Serhiy Storchaka trong bpo-32892.)expanduser()trên Windows hiện thích biến môi trườngUSERPROFILEhơn và không sử dụngHOME, biến này thường không được đặt cho tài khoản người dùng thông thường. (Được đóng góp bởi Anthony Sottile trong bpo-36264.)Ngoại lệ
asyncio.CancelledErrorhiện kế thừa từBaseExceptionthay vìExceptionvà không còn kế thừa từconcurrent.futures.CancelledErrornữa. (Được đóng góp bởi Yury Selivanov trong bpo-32528.)Hàm
asyncio.wait_for()hiện chờ hủy chính xác khi sử dụng phiên bảnasyncio.Task. Trước đây khi đạt tới timeout thì nó đã bị hủy và quay trở lại ngay lập tức. (Được đóng góp bởi Elvis Pranskevichus trong bpo-32751.)Hàm
asyncio.BaseTransport.get_extra_info()bây giờ trả về một đối tượng socket an toàn để sử dụng khi 'socket' được truyền cho tham số name. (Được đóng góp bởi Yury Selivanov trong bpo-37027.)asyncio.BufferedProtocolđã chuyển sang API ổn định.
Các phần phụ thuộc của DLL cho các mô-đun mở rộng và các tệp DLL được tải bằng
ctypestrên Windows hiện được giải quyết an toàn hơn. Chỉ các đường dẫn hệ thống, thư mục chứa tệp DLL hoặc PYD và các thư mục được thêm bằngadd_dll_directory()mới được tìm kiếm các phụ thuộc thời gian tải. Cụ thể,PATHvà thư mục làm việc hiện tại không còn được sử dụng nữa và các sửa đổi đối với chúng sẽ không còn ảnh hưởng gì đến độ phân giải DLL thông thường nữa. Nếu ứng dụng của bạn dựa trên các cơ chế này, bạn nên kiểm traadd_dll_directory()và nếu nó tồn tại, hãy sử dụng nó để thêm thư mục DLL trong khi tải thư viện của bạn. Lưu ý rằng người dùng Windows 7 sẽ cần đảm bảo rằng Windows Update KB2533623 đã được cài đặt (điều này cũng được trình cài đặt xác minh). (Được đóng góp bởi Steve Dower trong bpo-36085.)Các tệp tiêu đề và hàm liên quan đến pgen đã bị xóa sau khi được thay thế bằng triển khai Python thuần túy. (Được đóng góp bởi Pablo Galindo trong bpo-36623.)
types.CodeTypecó một tham số mới ở vị trí thứ hai của hàm tạo (posonlyargcount) để hỗ trợ các đối số chỉ có vị trí được xác định trong PEP 570. Đối số đầu tiên (argcount) hiện đại diện cho tổng số đối số vị trí (bao gồm cả đối số chỉ có vị trí). Phương phápreplace()mới củatypes.CodeTypecó thể được sử dụng để làm cho mã có thể hoạt động được trong tương lai.Tham số
digestmodchohmac.new()không còn sử dụng thông báo MD5 theo mặc định nữa.
Những thay đổi trong C API¶
Cấu trúc
PyCompilerFlagscó trường cf_feature_version mới. Nó nên được khởi tạo thànhPY_MINOR_VERSION. Trường này bị bỏ qua theo mặc định và được sử dụng khi và chỉ khi cờPyCF_ONLY_ASTđược đặt trong cf_flags. (Được đóng góp bởi Guido van Rossum trong bpo-35766.)Chức năng
PyEval_ReInitThreads()đã bị xóa khỏi C API. Không nên gọi nó một cách rõ ràng: thay vào đó hãy sử dụngPyOS_AfterFork_Child(). (Được đóng góp bởi Victor Stinner trong bpo-36728.)Trên Unix, tiện ích mở rộng C không còn được liên kết với libpython ngoại trừ trên Android và Cygwin. Khi Python được nhúng,
libpythonkhông được tải bằngRTLD_LOCALmà thay vào đó làRTLD_GLOBAL. Trước đây, khi sử dụngRTLD_LOCAL, không thể tải các tiện ích mở rộng C không được liên kết vớilibpython, giống như các tiện ích mở rộng C của thư viện chuẩn được xây dựng bởi phần*shared*củaModules/Setup. (Được đóng góp bởi Victor Stinner trong bpo-21536.)Việc sử dụng các biến thể định dạng
#trong phân tích cú pháp hoặc xây dựng giá trị (ví dụ:PyArg_ParseTuple(),Py_BuildValue(),PyObject_CallFunction(), v.v.) mà không xác địnhPY_SSIZE_T_CLEANsẽ tăngDeprecationWarningngay bây giờ. Nó sẽ bị xóa trong 3.10 hoặc 4.0. Đọc Phân tích đối số và xây dựng giá trị để biết chi tiết. (Được đóng góp bởi Inada Naoki trong bpo-36381.)Các phiên bản của các loại được phân bổ heap (chẳng hạn như các loại được tạo bằng
PyType_FromSpec()) giữ một tham chiếu đến đối tượng loại của chúng. Việc tăng số lượng tham chiếu của các đối tượng loại này đã được chuyển từPyType_GenericAlloc()sang các hàm cấp thấp hơn,PyObject_Init()vàPyObject_INIT. Điều này làm cho các kiểu được tạo thông quaPyType_FromSpec()hoạt động giống như các lớp khác trong mã được quản lý.Statically allocated types không bị ảnh hưởng.
Đối với phần lớn các trường hợp, sẽ không có tác dụng phụ. Tuy nhiên, các loại tăng số lượng tham chiếu theo cách thủ công sau khi phân bổ một phiên bản (có thể để khắc phục lỗi) giờ đây có thể trở thành bất tử. Để tránh điều này, các lớp này cần gọi Py_DECREF trên đối tượng kiểu trong quá trình phân bổ cá thể.
Để chuyển chính xác các loại này sang 3.8, vui lòng áp dụng các thay đổi sau:
Xóa
Py_INCREFtrên đối tượng loại sau khi phân bổ một phiên bản - nếu có. Điều này có thể xảy ra sau khi gọiPyObject_New,PyObject_NewVar,PyObject_GC_New(),PyObject_GC_NewVar()hoặc bất kỳ bộ cấp phát tùy chỉnh nào khác sử dụngPyObject_Init()hoặcPyObject_INIT.Ví dụ:
foo_struct tĩnh * foo_new(PyObject *type) { loại foo_struct *foo = PyObject_GC_New(foo_struct, (PyTypeObject *)); nếu (foo == NULL) trả lại NULL; #if PY_VERSION_HEX < 0x03080000 // Giải pháp cho vấn đề Python 35810; không còn cần thiết trong Python 3.8 PY_INCREF(loại) #endif trả lại foo; }
Đảm bảo rằng tất cả các hàm
tp_dealloctùy chỉnh của các loại được phân bổ vùng heap đều giảm số lượng tham chiếu của loại đó.Ví dụ:
khoảng trống tĩnh foo_dealloc(foo_struct *instance) { PyObject *type = Py_TYPE(ví dụ); PyObject_GC_Del(ví dụ); #if PY_VERSION_HEX >= 0x03080000 // Điều này không cần thiết trước Python 3.8 (Vấn đề Python 35810) Py_DECREF(loại); #endif }
(Được đóng góp bởi Eddie Elizondo trong bpo-35810.)
Macro
Py_DEPRECATED()đã được triển khai cho MSVC. Macro bây giờ phải được đặt trước tên biểu tượng.Ví dụ:
Py_DEPRECATED(3.8) PyAPI_FUNC(int) Py_OldFunction(void);
(Được đóng góp bởi Zackery Spytz trong bpo-33407.)
Trình thông dịch không giả vờ hỗ trợ khả năng tương thích nhị phân của các loại tiện ích mở rộng trên các bản phát hành tính năng nữa. Một
PyTypeObjectđược xuất bởi mô-đun mở rộng của bên thứ ba được cho là có tất cả các vị trí dự kiến trong phiên bản Python hiện tại, bao gồm cảtp_finalize(Py_TPFLAGS_HAVE_FINALIZEkhông được kiểm tra nữa trước khi đọctp_finalize).(Được đóng góp bởi Antoine Pitrou trong bpo-32388.)
Các hàm
PyNode_AddChild()vàPyParser_AddToken()hiện chấp nhận hai đối sốintbổ sung là end_lineno và end_col_offset.Tệp
libpython38.ađể cho phép các công cụ MinGW liên kết trực tiếp vớipython38.dllkhông còn được bao gồm trong bản phân phối Windows thông thường. Nếu bạn yêu cầu tệp này, nó có thể được tạo bằng các công cụgendefvàdlltool, là một phần của gói binutils MinGW:gendef - python38.dll > tmp.def dlltool --dllname python38.dll --def tmp.def --output-lib libpython38.a
Vị trí của
pythonXY.dllđược cài đặt sẽ phụ thuộc vào các tùy chọn cài đặt cũng như phiên bản và ngôn ngữ của Windows. Xem Sử dụng Python trên Windows để biết thêm thông tin. Thư viện kết quả phải được đặt trong cùng thư mục vớipythonXY.lib, thường là thư mụclibstrong bản cài đặt Python của bạn.(Được đóng góp bởi Steve Dower trong bpo-37351.)
Thay đổi mã byte CPython¶
Vòng lặp trình thông dịch đã được đơn giản hóa bằng cách di chuyển logic hủy cuộn các khối vào trình biên dịch. Trình biên dịch hiện đưa ra các hướng dẫn rõ ràng để điều chỉnh ngăn xếp các giá trị và gọi mã dọn dẹp cho
break,continuevàreturn.Đã xóa các mã opcode
BREAK_LOOP,CONTINUE_LOOP,SETUP_LOOPvàSETUP_EXCEPT. Đã thêm các mã hoạt động mớiROT_FOUR,BEGIN_FINALLY,CALL_FINALLYvàPOP_FINALLY. Đã thay đổi hành vi củaEND_FINALLYvàWITH_CLEANUP_START.(Được đóng góp bởi Mark Shannon, Antoine Pitrou và Serhiy Storchaka trong bpo-17611.)
Đã thêm opcode
END_ASYNC_FORmới để xử lý các trường hợp ngoại lệ được đưa ra khi chờ mục tiếp theo trong vòng lặpasync for. (Được đóng góp bởi Serhiy Storchaka trong bpo-33041.)Zz000zz hiện mong đợi giá trị là phần tử đầu tiên trong ngăn xếp và khóa là phần tử thứ hai. Thay đổi này được thực hiện để khóa luôn được đánh giá trước giá trị trong phần hiểu từ điển, như đề xuất của PEP 572. (Được đóng góp bởi Jörn Heissler trong bpo-35224.)
Bản trình diễn và công cụ¶
Đã thêm tập lệnh chuẩn để tính thời gian theo nhiều cách khác nhau để truy cập các biến: Tools/scripts/var_access_benchmark.py. (Được đóng góp bởi Raymond Hettinger trong bpo-35884.)
Dưới đây là bản tóm tắt các cải tiến hiệu suất kể từ Python 3.3:
Phiên bản Python 3.3 3.4 3.5 3.6 3.7 3.8
-------------- --- --- --- --- --- ---
Quyền truy cập đọc biến và thuộc tính:
read_local 4.0 7.1 7.1 5.4 5.1 3.9
read_nonlocal 5,3 7,1 8,1 5,8 5,4 4,4
read_global 13,3 15,5 19,0 14,3 13,6 7,6
read_buildin 20,0 21,1 21,6 18,5 19,0 7,5
read_classvar_from_class 20,5 25,6 26,5 20,7 19,5 18,4
read_classvar_from_instance 18,5 22,8 23,5 18,8 17,1 16,4
read_instancevar 26,8 32,4 33,1 28,0 26,3 25,4
read_instancevar_slots 23,7 27,8 31,3 20,8 20,8 20,2
read_namedtuple 68,5 73,8 57,5 45,0 46,8 18,4
phương thức read_bound 29,8 37,6 37,9 29,6 26,9 27,7
Quyền truy cập ghi biến và thuộc tính:
write_local 4,6 8,7 9,3 5,5 5,3 4,3
write_nonlocal 7,3 10,5 11,1 5,6 5,5 4,7
write_global 15,9 19,7 21,2 18,0 18,0 15,8
write_classvar 81,9 92,9 96,0 104,6 102,1 39,2
write_instancevar 36,4 44,6 45,8 40,0 38,9 35,5
write_instancevar_slots 28,7 35,6 36,1 27,3 26,6 25,7
Truy cập đọc cấu trúc dữ liệu:
danh sách đọc 19,2 24,2 24,5 20,8 20,8 19,0
read_deque 19,9 24,7 25,5 20,2 20,6 19,8
read_dict 19,7 24,3 25,7 22,3 23,0 21,0
read_strdict 17,9 22,6 24,3 19,5 21,2 18,9
Quyền truy cập ghi cấu trúc dữ liệu:
write_list 21,2 27,1 28,5 22,5 21,6 20,0
write_deque 23,8 28,7 30,1 22,7 21,8 23,5
write_dict 25,9 31,4 33,3 29,3 29,2 24,7
write_strdict 22,9 28,4 29,9 27,5 25,2 23,1
Hoạt động ngăn xếp (hoặc hàng đợi):
list_append_pop 144,2 93,4 112,7 75,4 74,2 50,8
deque_append_pop 30,4 43,5 57,0 49,4 49,2 42,5
deque_append_popleft 30,8 43,7 57,3 49,7 49,7 42,8
Vòng lặp thời gian:
loop_overhead 0,3 0,5 0,6 0,4 0,3 0,3
Điểm chuẩn được đo trên một chiếc Intel® Core™ i7-4960HQ processor chạy bản dựng macOS 64-bit có tại python.org. Tập lệnh điểm chuẩn hiển thị thời gian tính bằng nano giây.
Những thay đổi đáng chú ý trong Python 3.8.1¶
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.)
Những thay đổi đáng chú ý trong Python 3.8.2¶
Đã sửa lỗi hồi quy với lệnh gọi lại ignore của shutil.copytree(). Các loại đối số bây giờ lại là str và List[str] . (Được đóng góp bởi Manuel Barkhau và Giampaolo Rodola trong gh-83571.)
Những thay đổi đáng chú ý trong Python 3.8.3¶
Giá trị không đổi của các cờ trong tương lai trong mô-đun __future__ được cập nhật để tránh xung đột với các cờ của trình biên dịch. Trước đây PyCF_ALLOW_TOP_LEVEL_AWAIT đã xung đột với CO_FUTURE_DIVISION. (Được đóng góp bởi Batuhan Taskaya trong gh-83743)
Những thay đổi đáng chú ý trong Python 3.8.8¶
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.8.9¶
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.8.10¶
Hỗ trợ macOS 11.0 (Big Sur) và Apple Silicon Mac¶
Kể từ phiên bản 3.8.10, Python hiện hỗ trợ xây dựng và chạy trên macOS 11 (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. Lưu ý rằng hỗ trợ cho "liên kết yếu", xây dựng các tệp nhị phân được nhắm mục tiêu cho các phiên bản macOS mới hơn cũng sẽ chạy chính xác trên các phiên bản cũ hơn bằng cách kiểm tra các tính năng bị thiếu trong thời gian chạy, không được bao gồm trong bản backport này từ Python 3.9; để hỗ trợ nhiều phiên bản macOS, hãy tiếp tục nhắm mục tiêu và xây dựng trên phiên bản cũ nhất trong phạm vi đó.
(Được đóng góp ban đầu bởi Ronald Oussoren và Lawrence D'Anna trong gh-85272, với các bản sửa lỗi của FX Coudert và Eli Rykoff, và được Maxime Bélanger và Ned Deily chuyển sang phiên bản 3.8)
Những thay đổi đáng chú ý trong Python 3.8.10¶
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 bpo-43882)
Những thay đổi đáng chú ý trong Python 3.8.12¶
Những thay đổi trong Python API¶
Bắt đầu với Python 3.8.12, mô-đun ipaddress không còn chấp nhận bất kỳ số 0 đứng đầu nào trong chuỗi địa chỉ IPv4. Các số 0 đứng đầu không rõ ràng và được một số thư viện hiểu là ký hiệu bát phân. Ví dụ: hàm kế thừa socket.inet_aton() xử lý các số 0 đứng đầu dưới dạng ký hiệu bát phân. Việc triển khai glibc của inet_pton() hiện đại không chấp nhận bất kỳ số 0 đứng đầu nào.
(Ban đầu được đóng góp bởi Christian Heimes trong bpo-36384 và được Achraf Merzouki chuyển sang 3.8.)
Tính năng bảo mật đáng chú ý trong 3.8.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.8.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.)