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ố ab 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 continue là bất hợp pháp trong mệnh đề finally do 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, intfractions.Fraction hiện có phương thức as_integer_ratio() giống như phương thức được tìm thấy trong floatdecimal.Decimal. Tiện ích mở rộng API nhỏ này giúp bạn có thể viết numerator, 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, floatcomplex bâ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} trong regular 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 yieldreturn khô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 yieldreturn phù hợp hơn với cú pháp gán thông thường:

    >>> phân tích  pháp def (gia đình):
    ... họ, *thành viên = family.split()
    ... trả về họ.upper(), *thành viên
    ...
    >>> phân tích  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ị SyntaxWarning kèm theo gợi ý hữu ích. Điều này cải thiện khi chỉ có TypeError cho 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.date hoặc datetime.datetimedatetime.timedelta hiệ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ọc datetime.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ệ KeyboardInterrupt khô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.CodeType cho 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áp replace() 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 
    >>> 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à -1 và 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ành 4258𝑥 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.metadata mớ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_linenoend_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 linenocol_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=True khiến nó trả về văn bản của các nhận xét loại PEP 484PEP 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ẽ coi asyncawait là 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 )
    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_delayinterleave. 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 forasync 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()datetime.datetime.fromisocalendar(), xây dựng các đối tượng datedatetime 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  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 .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  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  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-5680bpo-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()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()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-37178bpo-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()ismount() hiện trả về False thay vì tăng ValueError hoặc các lớp con UnicodeEncodeErrorUnicodeDecodeError 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()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()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()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()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 589typing.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 586typing.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.Finaltyping.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.Protocoltyping.runtime_checkable(). Các ABC đơn giản như typing.SupportsInt hiện là lớp con Protocol.

  • Lớp giao thức mới typing.SupportsIndex.

  • Chức năng mới typing.get_origin()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-32285bpo-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()addClassCleanup() vào unittest để hỗ trợ dọn dẹp setUpModule()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 @@= 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.minidomxml.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()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-36676bpo-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 subprocess hiện có thể sử dụng chức năng os.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, cwdstart_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()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 Windows shutil.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ên memoryview(). 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ăng os.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ến shutil.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 pickle hiệ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_t khỏi PyGC_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.UUID hiệ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 list khô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-35582bpo-36127.)

  • Lệnh LOAD_GLOBAL hiệ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.abiflags mặc định đã trở thành một chuỗi trống: cờ m cho 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ình python3.8m không còn nữa.

    • Chỉ tập lệnh python3.8-config được cài đặt, tập lệnh python3.8m-config khô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.so của Python 3.7 đã trở thành .cpython-38-x86_64-linux-gnu.so trong 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/*.h phải là C API ổn định công cộng di động.

    • Include/cpython/*.h phả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à _Py hoặc _PY.

    • Include/internal/*.h là 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ởi make install.

    (Được đóng góp bởi Victor Stinner trong bpo-35134bpo-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ụ:

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

  • Các chức năng PyByteArray_Init()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ại const char * thay vì char *. (Được đóng góp bởi Serhiy Storchaka trong bpo-33818.)

  • Tính hai mặt của Modules/Setup.distModules/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ông Modules/Setup.dist (bên trong cây nguồn) sang Modules/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/Setup bê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ư DecimalFraction). PyNumber_Check() bây giờ sẽ trả về 1 cho các đối tượng triển khai __index__(). PyNumber_Long(), PyNumber_Float()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-36048bpo-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à macro PyObject_INIT song song của nó) thay vì trong PyType_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 đặt sys.executable thà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

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ừ collections khô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ụng os.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ụng time.perf_counter() hoặc time.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ế cho python3.8 -m venv nhằm giúp loại bỏ sự nhầm lẫn về trình thông dịch Python mà tập lệnh pyvenv được gắn vào. (Được đóng góp bởi Brett Cannon trong bpo-25427.)

  • parse_qs, parse_qslescape bị xóa khỏi mô-đun cgi. 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ô-đun urllib.parsehtml.

  • Chức năng filemode bị xóa khỏi mô-đun tarfile. Nó không được ghi lại và không được dùng nữa kể từ Python 3.3.

  • Hàm tạo XMLParser khô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ủa XMLParser. (Đượ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 CacheStatement của mô-đun sqlite3 khô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 bufsize của fileinput.input()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()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 đề yieldyield 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 đề for ngoà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 SyntaxWarning khi sử dụng kiểm tra danh tính (isis 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 (==!=) để 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ẵn bool, int, float, complex và 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.platform khô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ụng sys.platform.startswith('aix'). (Được đóng góp bởi M. Felt trong bpo-36588.)

  • PyEval_AcquireLock()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ới PyEval_RestoreThread(), Py_END_ALLOW_THREADS()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ặc sys.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.Popen hiện có thể sử dụng os.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ạo Popen sử dụng os.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ới returncode khác 0. (Được đóng góp bởi Joannah Nanjekye và Victor Stinner trong bpo-35537.)

  • Đối số preexec_fn của * subprocess.Popen khô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ăng RuntimeError. (Đượ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ụng os.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ớp tkinter.ttk.Treeview khô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()toprettyxml() của xml.dom.minidom và phương thức write() của xml.etree.ElementTree hiệ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''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ủa XMLParser sẽ không còn được gọi và sẽ phát ra RuntimeWarning thay vì DeprecationWarning. Xác định phương thức doctype() 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 RuntimeError hiệ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ới type.__new__. Một DeprecationWarning được phát ra trong Python 3.6--3.7. (Được đóng góp bởi Serhiy Storchaka trong bpo-23722.)

  • Lớp cProfile.Profile hiệ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()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ột PyInterpreterState mờ 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ề None khi 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.minidomxml.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.)

  • Xóa khóa khỏi cơ sở dữ liệu dbm chỉ đọc (dbm.dumb, dbm.gnu hoặc dbm.ndbm) sẽ tăng error (dbm.dumb.error, dbm.gnu.error hoặc dbm.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, NameConstantEllipsis sẽ trả về một phiên bản của Constant. (Được đóng góp bởi Serhiy Storchaka trong bpo-32892.)

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

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

  • Hàm asyncio.wait_for() hiện chờ hủy chính xác khi sử dụng phiên bản asyncio.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 ctypes trê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ằng add_dll_directory() mới được tìm kiếm các phụ thuộc thời gian tải. Cụ thể, PATH và 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 tra add_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.CodeType có 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áp replace() mới của types.CodeType có thể được sử dụng để làm cho mã có thể hoạt động được trong tương lai.

  • Tham số digestmod cho hmac.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 PyCompilerFlags có trường cf_feature_version mới. Nó nên được khởi tạo thành PY_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ụng PyOS_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, libpython không được tải bằng RTLD_LOCAL mà thay vào đó là RTLD_GLOBAL. Trước đây, khi sử dụng RTLD_LOCAL, không thể tải các tiện ích mở rộng C không được liên kết với libpython, 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ủa Modules/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 định PY_SSIZE_T_CLEAN sẽ tăng DeprecationWarning ngay 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()PyObject_INIT. Điều này làm cho các kiểu được tạo thông qua PyType_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_INCREF trê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ọi PyObject_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ụng PyObject_Init() hoặc PyObject_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_dealloc tù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( dụ);
          PyObject_GC_Del( 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_FINALIZE không được kiểm tra nữa trước khi đọc tp_finalize).

    (Được đóng góp bởi Antoine Pitrou trong bpo-32388.)

  • Các hàm PyNode_AddChild()PyParser_AddToken() hiện chấp nhận hai đối số int bổ sung là end_linenoend_col_offset.

  • Tệp libpython38.a để cho phép các công cụ MinGW liên kết trực tiếp với python38.dll khô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ụ gendefdlltool, 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ới pythonXY.lib, thường là thư mục libs trong 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, continuereturn.

    Đã xóa các mã opcode BREAK_LOOP, CONTINUE_LOOP, SETUP_LOOPSETUP_EXCEPT. Đã thêm các mã hoạt động mới ROT_FOUR, BEGIN_FINALLY, CALL_FINALLYPOP_FINALLY. Đã thay đổi hành vi của END_FINALLYWITH_CLEANUP_START.

    (Được đóng góp bởi Mark Shannon, Antoine Pitrou và Serhiy Storchaka trong bpo-17611.)

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

Những thay đổi đáng chú ý trong Python 3.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ả ARM64Intel 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 intstr ở các cơ số không phải 2 (nhị phân), 4, 8 (bát phân), 16 (thập lục phân) hoặc 32, chẳng hạn như cơ sở 10 (thập phân) hiện sẽ tăng ValueError nếu số chữ số ở dạng chuỗi vượt quá giới hạn để tránh các cuộc tấn công từ chối dịch vụ tiềm ẩn do độ phức tạp của thuật toán. Đây là biện pháp giảm nhẹ cho CVE 2020-10735. Giới hạn này có thể được định cấu hình hoặc vô hiệu hóa bằng biến môi trường, cờ dòng lệnh hoặc API sys. Xem tài liệu integer string conversion length limitation. Giới hạn mặc định là 4300 chữ số ở dạng chuỗi.

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

hồ dầu

  • Các phương thức trích xuất trong tarfileshutil.unpack_archive() có một đối số filter mới cho phép hạn chế các tính năng tar có thể gây ngạc nhiên hoặc nguy hiểm, chẳng hạn như tạo tệp bên ngoài thư mục đích. Xem Bộ lọc trích xuất để biết chi tiết. Trong Python 3.12, sử dụng không có đối số filter sẽ hiển thị DeprecationWarning. Trong Python 3.14, mặc định sẽ chuyển sang 'data'. (Được đóng góp bởi Petr Viktorin trong PEP 706.)