C++ có toán tử hải mã không?

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. Trăn 3. 8 được phát hành vào ngày 14 tháng 10 năm 2019. Để biết chi tiết đầy đủ, xem

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

Các tính năng mới

Assignment expressions

There is new syntax

def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)
6 that assigns values to variables as part of a larger expression. It is affectionately known as “the walrus operator” due to its resemblance to

In this example, the assignment expression helps avoid calling twice

if (n := len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")

A similar benefit arises during regular expression matching where match objects are needed twice, once to test whether a match occurred and another to extract a subgroup

discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0

The operator is also useful with while-loops that compute a value to test loop termination and then need that same value again in the body of the loop

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)

Another motivating use case arises in list comprehensions where a value computed in a filtering condition is also needed in the expression body

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]

Try to limit use of the walrus operator to clean cases that reduce complexity and improve readability

See PEP 572 for a full description

(Contributed by Emily Morehouse in bpo-35224. )

Positional-only parameters

There is a new function parameter syntax

def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)
8 to indicate that some function parameters must be specified positionally and cannot be used as keyword arguments. This is the same notation shown by
def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)
9 for C functions annotated with Larry Hastings’ tool

In the following example, parameters a and b are positional-only, while c or d can be positional or keyword, and e or f are required to be keywords

def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)

The following is a valid call

f(10, 20, 30, d=40, e=50, f=60)

However, these are invalid calls

f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument

One use case for this notation is that it allows pure Python functions to fully emulate behaviors of existing C coded functions. For example, the built-in function does not accept keyword arguments

def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)

Another use case is to preclude keyword arguments when the parameter name is not helpful. For example, the builtin function has the signature

f(10, 20, 30, d=40, e=50, f=60)
2. This precludes awkward calls such as

len(obj='hello')  # The "obj" keyword argument impairs readability

A further benefit of marking a parameter as positional-only is that it allows the parameter name to be changed in the future without risk of breaking client code. For example, in the module, the parameter name dist may be changed in the future. This was made possible with the following function specification

def quantiles(dist, /, *, n=4, method='exclusive')
    ...

Since the parameters to the left of

def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)
8 are not exposed as possible keywords, the parameters names remain available for use in
f(10, 20, 30, d=40, e=50, f=60)
5

discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0
0

This greatly simplifies the implementation of functions and methods that need to accept arbitrary keyword arguments. For example, here is an excerpt from code in the module

discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0
1

See PEP 570 for a full description

(Contributed by Pablo Galindo in bpo-36540. )

Parallel filesystem cache for compiled bytecode files

The new setting (also available as

f(10, 20, 30, d=40, e=50, f=60)
9) configures the implicit bytecode cache to use a separate parallel filesystem tree, rather than the default
f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
0 subdirectories within each source directory

The location of the cache is reported in ( indicates the default location in

f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
0 subdirectories)

(Contributed by Carl Meyer in bpo-33499. )

Debug build uses the same ABI as release build

Python now uses the same ABI whether it’s built in release or debug mode. On Unix, when Python is built in debug mode, it is now possible to load C extensions built in release mode and C extensions built using the stable ABI

Phát hành các bản dựng và hiện đã tương thích với ABI. defining the

f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
4 macro no longer implies the
f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
5 macro, which introduces the only ABI incompatibility. The
f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
5 macro, which adds the
f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
7 function and the environment variable, can be set using the new build option. (Contributed by Victor Stinner in bpo-36465. )

On Unix, C extensions are no longer linked to libpython except on Android and Cygwin. It is now possible for a statically linked Python to load a C extension built using a shared library Python. (Contributed by Victor Stinner in bpo-21536. )

On Unix, when Python is built in debug mode, import now also looks for C extensions compiled in release mode and for C extensions compiled with the stable ABI. (Contributed by Victor Stinner in bpo-36722. )

To embed Python into an application, a new

def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)
0 option must be passed to
def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)
1 to get
def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)
2 (link the application to libpython). To support both 3. 8 and older, try
def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)
1 first and fallback to
def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)
4 (without
def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)
0) if the previous command fails

Add a pkg-config

def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)
6 module to embed Python into an application.
def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)
7 includes
def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)
2. To support both 3. 8 and older, try
def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)
9 first and fallback to
len(obj='hello')  # The "obj" keyword argument impairs readability
0 (without
def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)
0) if the previous command fails (replace
len(obj='hello')  # The "obj" keyword argument impairs readability
2 with the Python version)

On the other hand,

len(obj='hello')  # The "obj" keyword argument impairs readability
3 no longer contains
def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)
2. C extensions must not be linked to libpython (except on Android and Cygwin, whose cases are handled by the script); this change is backward incompatible on purpose. (Contributed by Victor Stinner in bpo-36721. )

f-strings support len(obj='hello') # The "obj" keyword argument impairs readability 5 for self-documenting expressions and debugging

Added an

len(obj='hello')  # The "obj" keyword argument impairs readability
5 specifier to s. An f-string such as
len(obj='hello')  # The "obj" keyword argument impairs readability
7 will expand to the text of the expression, an equal sign, then the representation of the evaluated expression. For example

discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0
2

The usual allow more control over how the result of the expression is displayed

discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0
3

The

len(obj='hello')  # The "obj" keyword argument impairs readability
5 specifier will display the whole expression so that calculations can be shown

discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0
4

(Contributed by Eric V. Smith and Larry Hastings in bpo-36817. )

PEP 578. Python Runtime Audit Hooks

The PEP adds an Audit Hook and Verified Open Hook. Both are available from Python and native code, allowing applications and frameworks written in pure Python code to take advantage of extra notifications, while also allowing embedders or system administrators to deploy builds of Python where auditing is always enabled

See PEP 578 for full details

PEP 587. Python Initialization Configuration

The PEP 587 adds a new C API to configure the Python Initialization providing finer control on the whole configuration and better error reporting

New structures

New functions

  • def quantiles(dist, /, *, n=4, method='exclusive')
        ...
    
    3

  • def quantiles(dist, /, *, n=4, method='exclusive')
        ...
    
    4

  • def quantiles(dist, /, *, n=4, method='exclusive')
        ...
    
    5

  • def quantiles(dist, /, *, n=4, method='exclusive')
        ...
    
    6

  • def quantiles(dist, /, *, n=4, method='exclusive')
        ...
    
    7

  • def quantiles(dist, /, *, n=4, method='exclusive')
        ...
    
    8

  • def quantiles(dist, /, *, n=4, method='exclusive')
        ...
    
    9

  • discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    00

  • discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    01

  • discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    02

  • discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    03

  • discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    04

  • discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    05

  • discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    06

  • discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    07

  • discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    08

  • discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    09

  • discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    10

  • discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    11

  • discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    13

PEP này cũng thêm các trường

discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0
19 ( loại) và
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0
21 ( loại) vào các cấu trúc bên trong này.
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0
21 trở thành cấu hình tham chiếu mới, thay thế các biến cấu hình toàn cầu và các biến riêng tư khác

Xem tài liệu

Xem PEP 587 để biết mô tả đầy đủ

(Đóng góp bởi Victor Stinner trong bpo-36763. )

PEP 590. cuộc gọi véc tơ. một giao thức gọi nhanh cho CPython

được thêm vào API Python/C. Nó nhằm 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. Mọi triển khai có thể gọi được đều có thể sử dụng giao thức này

Đây là 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 đủ

(Đóng góp bởi Jeroen Demeyer, Mark Shannon và Petr Viktorin trong bpo-36974. )

Pickle giao thức 5 với bộ đệm dữ liệu ngoài băng tần

Khi đượ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 lợi thế của quá trình 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 các 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 vào dữ liệu

Giao thức 5 giới thiệu hỗ trợ cho các bộ đệm ngoài băng trong đó dữ liệu tương thích với PEP 3118 có thể được truyền riêng biệt với luồng pickle chính, theo quyết định của lớp giao tiếp

See PEP 574 for a full description

(Contributed by Antoine Pitrou in bpo-36785. )

Other Language Changes

  • A statement was illegal in the clause due to a problem with the implementation. In Python 3. 8 this restriction was lifted. (Contributed by Serhiy Storchaka in bpo-32489. )

  • The , , and types now have an method like that found in and . This minor API extension makes it possible to write

    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    34 and have it work across multiple numeric types. (Contributed by Lisa Roach in bpo-33073 and Raymond Hettinger in bpo-37819. )

  • Constructors of , and will now use the special method, if available and the corresponding method , or is not available. (Contributed by Serhiy Storchaka in bpo-20092. )

  • Added support of

    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    42 escapes in

    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    5

    (Contributed by Jonathan Eunice and Serhiy Storchaka in bpo-30688. )

  • Dict and dictviews are now iterable in reversed insertion order using . (Contributed by Rémi Lapeyre in bpo-33462. )

  • The syntax allowed for keyword names in function calls was further restricted. In particular,

    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    45 is no longer allowed. It was never intended to permit more than a bare name on the left-hand side of a keyword argument assignment term. (Contributed by Benjamin Peterson in bpo-34641. )

  • Generalized iterable unpacking in and statements no longer requires enclosing parentheses. This brings the yield and return syntax into better agreement with normal assignment syntax

    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    6

    (Contributed by David Cuthbert and Jordan Chapman in bpo-32117. )

  • When a comma is missed in code such as

    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    48, the compiler displays a with a helpful suggestion. This improves on just having a indicating that the first tuple was not callable. (Contributed by Serhiy Storchaka in bpo-15248. )

  • Arithmetic operations between subclasses of or and objects now return an instance of the subclass, rather than the base class. This also affects the return type of operations whose implementation (directly or indirectly) uses arithmetic, such as . (Contributed by Paul Ganssle in bpo-32417. )

  • When the Python interpreter is interrupted by Ctrl-C (SIGINT) and the resulting exception is not caught, the Python process now exits via a SIGINT signal or with the correct exit code such that the calling process can detect that it died due to a Ctrl-C. Shells on POSIX and Windows use this to properly terminate scripts in interactive sessions. (Contributed by Google via Gregory P. Smith in 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 cho một chức năng hiện có. Since code objects are immutable, a new code object needs to be created, one that is modeled on the existing code object. With 19 parameters, this was somewhat tedious. Now, the new

    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    58 method makes it possible to create a clone with a few altered parameters

    Here’s an example that alters the function to prevent the data parameter from being used as a keyword argument

    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    7

    (Contributed by Victor Stinner in bpo-37032. )

  • For integers, the three-argument form of the function now permits the exponent to be negative in the case where the base is relatively prime to the modulus. It then computes a modular inverse to the base when the exponent is

    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    61, and a suitable power of that inverse for other negative exponents. For example, to compute the modular multiplicative inverse of 38 modulo 137, write

    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    8

    Modular inverses arise in the solution of linear Diophantine equations. For example, to find integer solutions for

    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    62, first rewrite as
    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    63 then solve

    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    9

    (Contributed by Mark Dickinson in bpo-36027. )

  • Dict comprehensions have been synced-up with dict literals so that the key is computed first and the value second

    # Loop over fixed length blocks
    while (block := f.read(256)) != '':
        process(block)
    
    0

    The guaranteed execution order is helpful with assignment expressions because variables assigned in the key expression will be available in the value expression

    # Loop over fixed length blocks
    while (block := f.read(256)) != '':
        process(block)
    
    1

    (Contributed by Jörn Heissler in bpo-35224. )

  • The method can now return a tuple from two to six elements long. Formerly, five was the limit. The new, optional sixth element is a callable with a

    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    65 signature. This allows the direct control over the state-updating behavior of a specific object. If not None, this callable will have priority over the object’s
    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    66 method. (Contributed by Pierre Glaser and Olivier Grisel in bpo-35900. )

New Modules

  • Mô-đun 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.

    # Loop over fixed length blocks
    while (block := f.read(256)) != '':
        process(block)
    
    2

    (Đó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

discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0
68 và
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0
69, cung cấp vị trí chính xác của phần cuối của nút. (Điều này chỉ áp dụng cho các nút có thuộc tính
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0
70 và
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0
71. )

Chức năng mới trả về mã nguồn cho một nút AST cụ thể

(Đóng góp bởi Ivan Levkivskyi trong bpo-33416. )

Chức năng có một số cờ mới

  • discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    74 khiế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;

  • discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    75 có thể được sử dụng để phân tích cú pháp PEP 484 “nhận xét kiểu chữ ký” (được trả về cho các nút AST định nghĩa chức năng);

  • discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    76 cho phép chỉ định phiên bản Python 3 cũ hơn. Ví dụ:
    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    77 sẽ coi and là những từ không dành riêng

(Đóng góp bởi Guido van Rossum trong bpo-35766. )

không đồng bộ

đã chuyển từ API tạm thời sang API ổn định. Hàm này có thể được sử dụng để thực thi a và trả về kết quả trong khi tự động quản lý vòng lặp sự kiện. Ví dụ

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
3

Điều này gần tương đương với

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
4

Việc triển khai thực tế phức tạp hơn nhiều. Do đó, nên là cách ưa thích để chạy các chương trình asyncio

(Đóng góp bởi Yury Selivanov trong bpo-32314. )

Đang chạy

discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0
82 khởi chạy REPL không đồng bộ nguyên bản. Điều này cho phép thử nghiệm nhanh chóng với mã có mức cao nhất. Không còn cần phải gọi trực tiếp
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0
80, điều này sẽ tạo ra một vòng lặp sự kiện mới trên mỗi lần gọi

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
5

(Đóng góp bởi Yury Selivanov trong bpo-37028. )

Ngoại lệ bây giờ kế thừa từ thay vì và không còn kế thừa từ. (Đóng góp bởi Yury Selivanov trong bpo-32528. )

Trên Windows, vòng lặp sự kiện mặc định hiện là. (Đóng góp bởi Victor Stinner trong bpo-34687. )

bây giờ cũng hỗ trợ UDP. (Đóng góp bởi Adam Meily và Andrew Svetlov trong bpo-29883. )

bây giờ có thể bị gián đoạn bởi (“CTRL+C”). (Đóng góp bởi Vladimir Matveev trong bpo-23057. )

Đã thêm để nhận coroutine được bao bọc trong một. (Đóng góp bởi Alex Grönholm trong bpo-36999. )

Các tác vụ Asyncio hiện có thể được đặt tên, bằng cách chuyển đối số từ khóa

discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0
95 hoặc phương thức vòng lặp sự kiện hoặc bằng cách gọi phương thức trên đối tượng tác vụ. Tên tác vụ hiển thị trong đầu ra
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0
99 của và cũng có thể được truy xuất bằng phương thức. (Đóng góp bởi Alex Grönholm trong bpo-34270. )

Đã thêm hỗ trợ cho Happy Eyeballs vào. Để chỉ định hành vi, hai tham số mới đã được thêm vào. happy_eyeballs_delay và xen kẽ. 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. (Contributed by twisteroid ambassador in bpo-33530. )

nội trang

Tích hợp sẵn đã được cải thiện để chấp nhận cờ

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
04. Với cờ mới này được thông qua, sẽ cho phép các cấu trúc cấp cao nhất
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0
79,
# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
07 và
# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
08 thường được coi là cú pháp không hợp lệ. Sau đó, đối tượng mã không đồng bộ được đánh dấu bằng cờ
# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
09 có thể được trả về. (Đóng góp bởi Matthias Bussonnier trong bpo-34616)

bộ sưu tập

Phương thức bây giờ trả về a thay vì a. Điều này hoạt động vì các ký tự thông thường đã đảm bảo đặt hàng kể từ Python 3. 7. Nếu các tính năng bổ sung của

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
14 được yêu cầu, thì biện pháp khắc phục được đề xuất là chuyển kết quả sang loại mong muốn.
# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
15. (Đóng góp bởi Raymond Hettinger trong bpo-35864. )

hồ sơ c

Bây giờ lớp có thể được sử dụng như một trình quản lý ngữ cảnh. Cấu hình một khối mã bằng cách chạy

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
6

(Đóng góp bởi Scott Sanderson trong bpo-29235. )

csv

Bây giờ trả về các trường hợp thay vì một. Công cụ 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. (Đóng góp bởi Michael Selik trong bpo-34003. )

nguyền 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 bên dưới. . (Contributed by Serhiy Storchaka in bpo-31680. )

ctypes

On Windows, and subclasses now accept a winmode parameter to specify flags for the underlying

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
22 call. The default flags are set to only load DLL dependencies from trusted locations, including the path where the DLL is stored (if a full or partial path is used to load the initial DLL) and paths added by . (Contributed by Steve Dower in bpo-36085. )

datetime

Added new alternate constructors and , which construct

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
26 and objects respectively from ISO year, week number, and weekday; these are the inverse of each class’s
# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
28 method. (Contributed by Paul Ganssle in bpo-36004. )

functools

can now be used as a straight decorator rather than as a function returning a decorator. So both of these are now supported

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
7

(Contributed by Raymond Hettinger in bpo-36772. )

Added a new decorator, for computed properties cached for the life of the instance

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
8

(Contributed by Carl Meyer in bpo-21145)

Added a new decorator that converts methods into using

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
9

(Contributed by Ethan Smith in bpo-32380)

gc

can now receive an optional generation parameter indicating a generation to get objects from. (Contributed by Pablo Galindo in bpo-36016. )

gettext

Added and its variants. (Contributed by Franz Glasner, Éric Araujo, and Cheryl Sabella in bpo-2504. )

gzip

Added the mtime parameter to for reproducible output. (Contributed by Guo Ci Teo in bpo-34898. )

A exception is now raised instead of for certain types of invalid or corrupt gzip files. (Contributed by Filip Gruszczyński, Michele Orrù, and Zackery Spytz in bpo-6584. )

IDLE and idlelib

Output over N lines (50 by default) is squeezed down to a button. N can be changed in the PyShell section of the General page of the Settings dialog. Fewer, but possibly extra long, lines can be squeezed by right clicking on the output. Squeezed output can be expanded in place by double-clicking the button or into the clipboard or a separate window by right-clicking the button. (Contributed by Tal Einat in bpo-1529353. )

Add “Run Customized” to the Run menu to run a module with customized settings. Any command line arguments entered are added to sys. argv. They also re-appear in the box for the next customized run. One can also suppress the normal Shell main module restart. (Contributed by Cheryl Sabella, Terry Jan Reedy, and others in bpo-5680 and bpo-37627. )

Added optional line numbers for IDLE editor windows. 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 một cửa sổ hiện có được hiển thị và ẩn trong menu Tùy chọn. (Đó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 các chuỗi Python và các đố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ừ khay nhớ 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 tám 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 3. 8. 1

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

Escape key now closes IDLE completion windows. (Đóng góp bởi Johnny Najera trong bpo-38944. )

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

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

quan sát

Giờ đây, hàm có thể tìm thấy các chuỗi tài liệu cho

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
38 nếu thuộc tính đó là a 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 , và

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
0

(Đóng góp bởi Raymond Hettinger trong bpo-36326. )

io

Trong chế độ phát triển (

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
44) và trong , trình hoàn thiện hiện ghi lại ngoại lệ nếu phương thức
# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
46 không thành công. Ngoại lệ được bỏ qua âm thầm theo mặc định trong bản dựng phát hành. (Đóng góp bởi Victor Stinner trong bpo-18748. )

itertools

Hàm đã thêm một đối số từ khóa ban đầu tùy chọn để chỉ định giá trị ban đầu

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
1

(Đóng góp bởi Lisa Roach trong bpo-34659. )

json. dụng cụ

Thêm tùy chọn

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
48 để phân tích mọi dòng đầu vào thành một đối tượng JSON riêng biệt. (Đóng góp bởi Weipeng Hong trong bpo-31553. )

khai thác gỗ

Đã thêm một đối số từ khóa bắt buộc vào Khi được đặt thành đúng, mọi trình xử lý hiện có được đính kèm với bộ ghi 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 trình ghi nhật ký hoặc basicConfig() đã được gọi, các lệnh gọi tiếp theo tới basicConfig() sẽ bị bỏ qua một cách â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, được thực hiện bởi Dong-hee Na và được Vinay Sajip xem xét trong bpo-33897. )

môn Toán

Đã thêm chức năng mới để tính toán khoảng cách Euclide giữa hai điểm. (Đóng góp bởi Raymond Hettinger trong bpo-33089. )

Đã mở rộng chức năng để xử lý nhiều chiều. Trước đây, nó chỉ hỗ trợ trường hợp 2-D. (Đóng góp bởi Raymond Hettinger trong bpo-33089. )

Đã thêm hàm mới, , dưới dạng hàm tương tự để trả về tích của giá trị 'bắt đầu' (mặc định. 1) lần lặp lại các số

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
2

(Đóng góp bởi Pablo Galindo trong bpo-35606. )

Đã thêm hai hàm tổ hợp mới và

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
3

(Đượ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 một chức năng mới để tính 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ợ các số nguyên lớn tùy ý. Nó nhanh hơn

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
57 nhưng chậm hơn

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
4

(Đóng góp bởi Mark Dickinson trong bpo-36887. )

Hàm không còn chấp nhận các đối số không giống như int. (Đóng góp bởi Pablo Galindo trong bpo-33083. )

mmap

Bây giờ lớp có một phương thức để truy cập lệnh gọi hệ thống

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
61. (Đóng góp bởi Zackery Spytz trong bpo-32941. )

đa xử lý

Đã thêm mô-đun mới. (Đóng góp bởi Davin Potts trong bpo-35813. )

Trên macOS, phương thức bắt đầu sinh sản hiện được sử dụng theo mặc định. (Đóng góp bởi Victor Stinner trong bpo-33725. )

hệ điều hành

Đã thêm chức năng mới trên Windows để cung cấp các đường dẫn tìm kiếm bổ sung cho các phụ thuộc riêng khi nhập các mô-đun mở rộng hoặc tải DLL bằng cách sử dụng. (Đóng góp bởi Steve Dower trong bpo-36085. )

Một chức năng mới đã được thêm vào để bọc tòa nhà chọc trời

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
67. (Đó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 đường nối thư mục) đã được ủy quyền cho hệ điều hành. Cụ thể, bây giờ sẽ duyệt qua mọi thứ được hệ điều hành hỗ trợ, trong khi 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. Trong mọi trường hợp,

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
71 sẽ chỉ có ____3_______72 được đặt cho các liên kết tượng trưng chứ không phải các loại điểm lặp lại khác. Để xác định các loại điểm phân tích khác, hãy kiểm tra thuộc tính
# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
73 mới

Trên Windows, giờ đây có thể đọc các mối nối thư mục. Lưu ý rằng sẽ trả về

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
76 cho các liên kết thư mục và vì vậy mã kiểm tra
# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
77 trước tiên sẽ tiếp tục coi các liên kết là thư mục, trong khi mã xử lý lỗi từ bây giờ có thể coi các liên kết là liên kết

(Đóng góp bởi Steve Dower trong bpo-37834. )

hệ điều hành. đường dẫn

các hàm trả về kết quả boolean như , , , , và giờ đây trả về

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
76 thay vì nâng cao hoặc các lớp con của nó và cho các đường dẫn chứa các ký tự hoặc byte không thể biểu diễn ở cấp hệ điều hành. (Đóng góp bởi Serhiy Storchaka trong bpo-33721. )

trên Windows hiện ưu tiên biến môi trường

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
91 và không sử dụng
# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
92, biến này thường không được đặt cho tài khoản người dùng thông thường. (Contributed by Anthony Sottile in bpo-36264. )

trên Windows không còn trả về

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
94 cho một liên kết đến một thư mục không tồn tại

trên Windows hiện giải quyết các điểm phân tích lại, bao gồm các liên kết tượng trưng và các đường nối thư mục

(Đóng góp bởi Steve Dower trong bpo-37834. )

đường dẫn

các phương thức trả về kết quả boolean như , , , , , , , , giờ đây trả về

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
76 thay vì nâng cao hoặc lớp con của nó cho các đường dẫn chứa các ký tự không thể biểu diễn ở cấp hệ điều hành. (Đóng góp bởi Serhiy Storchaka trong bpo-33721. )

Đã thêm để tạo một liên kết cứng trỏ đến một đường dẫn. (Đóng góp bởi Joannah Nanjekye trong bpo-26978)

dưa chua

các phần mở rộng phân lớp con được tối ưu hóa cho C giờ đây có thể ghi đè logic chọn lọc của các hàm và lớp bằng cách xác định phương thức đặc biệt. (Đóng góp bởi Pierre Glaser và Olivier Grisel trong bpo-35900. )

plistlib

Đã thêm hỗ trợ mới và được kích hoạt để đọc và viết các bảng nhị phân được mã hóa NSKeyedArchiver. (Đóng góp bởi Jon Janzen trong bpo-26707. )

bản in

Mô-đun đã thêm tham số sort_dicts vào một số chức năng. Theo mặc định, các chức năng đó 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. Điều này có thể hữu ích để so sánh với các đầu vào JSON trong quá trình gỡ lỗi

Ngoài ra, có một chức năng mới tiện lợi, giống như nhưng với sort_dicts mặc định là

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)
76

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
5

(Đóng góp bởi Rémi Lapeyre trong bpo-30670. )

py_compile

hiện hỗ trợ chế độ im lặng. (Đóng góp bởi Joannah Nanjekye trong bpo-22640. )

bánh mì

Hàm mới hoạt động như nghịch đảo của. (Đóng góp bởi Bo Bayles trong bpo-32102. )

đóng cửa

hiện chấp nhận một đối số từ khóa

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
22 mới. (Đóng góp bởi Josh Bronson trong bpo-20849. )

hiện mặc định là pax hiện đại (POSIX. 1-2001) cho các kho lưu trữ mới để cải thiện tính di động và tuân thủ tiêu chuẩn, kế thừa từ thay đổi tương ứng đối với mô-đun. (Đóng góp bởi C. A. M. Gerlach trong bpo-30661. )

trên Windows hiện loại bỏ các liên kết thư mục mà không cần xóa đệ quy nội dung của chúng trước. (Đóng góp bởi Steve Dower trong bpo-37834. )

ổ cắm

Đã thêm và các chức năng tiện lợi để 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 chấp nhận cả kết nối IPv4 và IPv6 trên cùng một ổ cắm. (Đóng góp bởi Giampaolo Rodolà trong bpo-17561. )

Các hàm , , và đã được triển khai trên Windows. (Đóng góp bởi Zackery Spytz trong bpo-37007. )

ssl

Đã thêm để bật và khởi tạo TLS 1. 3 xác thực sau bắt tay. (Đóng góp bởi Christian Heimes trong bpo-34670. )

số liệu thống kê

Đã thêm dưới dạng biến thể dấu phẩy động nhanh hơn của. (Đóng góp bởi Raymond Hettinger và Steven D'Aprano trong bpo-35904. )

Đã thêm (Đóng góp bởi Raymond Hettinger trong bpo-27181. )

Đã thêm trả về danh sách các giá trị phổ biến nhất. (Đóng góp bởi Raymond Hettinger trong bpo-35892. )

Đã thêm phân chia dữ liệu hoặc phân phối thành các khoảng có thể trang bị được (e. g. phần tư, deciles hoặc phần trăm). (Đóng góp bởi Raymond Hettinger trong bpo-36546. )

Đã thêm, một công cụ để tạo và thao tác phân phối bình thường của một biến ngẫu nhiên. (Đóng góp bởi Raymond Hettinger trong bpo-36018. )

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
6

hệ thống

Thêm chức năng mới có thể được ghi đè để kiểm soát cách xử lý "ngoại lệ không thể chấp nhận được". Nó được gọi khi một ngoại lệ xảy ra nhưng không có cách nào để Python xử lý nó. Ví dụ: khi hàm hủy phát sinh ngoại lệ hoặc trong quá trình thu gom rác (). (Đóng góp bởi Victor Stinner trong bpo-36829. )

tarfile

Mô-đun hiện mặc định là pax hiện đại (POSIX. 1-2001) 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 tính di động đa nền tảng với mã hóa nhất quán (UTF-8) ở định dạng chuẩn hóa và có thể mở rộng, đồng thời mang lại một số lợi ích khác. (Đóng góp bởi C. A. M. Gerlach trong bpo-36268. )

xâu chuỗi

Thêm một chức năng mới xử lý ngoại lệ 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ệ chưa được phát hiện. (Đóng góp bởi Victor Stinner trong bpo-1230540. )

Thêm một chức năng mới và một thuộc tính cho lớp. These return the native integral Thread ID of the current thread assigned by the kernel. Tính năng này chỉ khả dụng trên một số nền tảng nhất định, hãy xem để biết thêm thông tin. (Đóng góp bởi Jake Tesler trong bpo-36084. )

token hóa

Mô-đun hiện ngầm phát ra mã thông báo

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
50 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ộ. (Đóng góp bởi Ammar Askar trong bpo-33899. )

tkinter

Đã thêm các phương thức

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
51,
[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
52,
[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
53 và
[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
54 trong lớp
[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
55. (Đóng góp bởi Juliette Monsel trong bpo-34829. )

Đã thêm phương thức

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
56 vào lớp
[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
57. (Đóng góp bởi Juliette Monsel trong bpo-23831. )

Lớp

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
58 hiện có các phương thức
[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
59 và
[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
60. (Đóng góp bởi Zackery Spytz trong bpo-25451. )

thời gian

Đã thêm đồng hồ mới cho macOS 10. 12. (Đóng góp bởi Joannah Nanjekye trong bpo-35702. )

đánh máy

Mô-đun kết hợp một số tính năng mới

  • Loại từ điển với các loại theo khóa. Xem PEP 589 và. TypedDict chỉ sử dụng các phím chuỗi. Theo mặc định, mọi khóa được yêu cầu phải có mặt. Chỉ định “total=False” để cho phép các phím là tùy chọn

    [clean_name.title() for name in names
     if (clean_name := normalize('NFC', name)) in allowed_names]
    
    7

  • các loại chữ. Xem PEP 586 và. Các loại chữ chỉ ra rằng một tham số hoặc giá trị trả về bị ràng buộc với một hoặc nhiều giá trị chữ cụ thể

    [clean_name.title() for name in names
     if (clean_name := normalize('NFC', name)) in allowed_names]
    
    8

  • Các biến, hàm, phương thức và lớp “cuối cùng”. Xem PEP 591, và. Vòng loại cuối cùng hướng dẫn trình kiểm tra kiểu tĩnh hạn chế phân lớp con, ghi đè hoặc gán lại

    [clean_name.title() for name in names
     if (clean_name := normalize('NFC', name)) in allowed_names]
    
    9

  • định nghĩa giao thức. Xem PEP 544, và. Các ABC đơn giản như bây giờ là

    [clean_name.title() for name in names
     if (clean_name := normalize('NFC', name)) in allowed_names]
    
    70 phân lớp

  • Lớp giao thức mới

  • chức năng mới và

unicodedata

Mô-đun đã được nâng cấp để sử dụng Unicode 12. 1. 0 phát hành

Chức năng mới có thể được sử dụng để xác minh một chuỗi ở dạng bình thường cụ thể, thường nhanh hơn nhiều so với việc thực sự 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)

đơn vị nhất

Đã thêm để hỗ trợ phiên bản không đồng bộ của. 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. (Đóng góp bởi Lisa Roach trong bpo-26467)

Đã thêm và vào unittest để hỗ trợ dọn dẹp cho

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
80 và. (Đóng góp bởi Lisa Roach trong bpo-24412. )

Một số chức năng xác nhận giả hiện cũng in danh sách các cuộc gọi thực tế khi thất bại. (Đóng góp bởi Petter Strandmark trong bpo-35047. )

mô-đun đã nhận được hỗ trợ cho coroutines được sử dụng làm trường hợp thử nghiệm với. (Đóng góp bởi Andrew Svetlov trong bpo-32972. )

Thí dụ

def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)
0

venv

hiện bao gồm tập lệnh

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
85 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. (Đóng góp bởi Brett Cannon trong bpo-32718. )

yếu kém

Các đối tượng proxy được trả về hiện hỗ trợ các toán tử nhân ma trận

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
87 và
[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
88 ngoài các toán tử số khác. (Đóng góp bởi Mark Dickinson trong bpo-36669. )

xml

Để giảm thiểu DTD và truy xuất thực thể bên ngoài, các mô-đun và không còn xử lý các thực thể bên ngoài theo mặc định. (Đóng góp bởi Christian Heimes trong bpo-17239. )

Các phương thức

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
91 trong mô-đun hỗ trợ các tìm kiếm ký tự đại diện như
[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
93 bỏ qua không gian tên và
[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
94 trả về tất cả các thẻ trong không gian tên đã cho. (Đóng góp bởi Stefan Behnel trong bpo-28238. )

Mô-đun cung cấp chức năng mới

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
96 thực hiện C14N 2. 0. (Đóng góp bởi Stefan Behnel trong bpo-13611. )

Đối tượng đích của có thể nhận các sự kiện khai báo không gian tên thông qua các phương thức gọi lại mới

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
98 và
[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
99. Ngoài ra, mục tiêu có thể được định 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. (Đóng góp bởi Stefan Behnel trong bpo-36676 và bpo-36673. )

xmlrpc

now supports an optional headers keyword argument for a sequence of HTTP headers to be sent with each request. Trong số những thứ khác, điều này cho phép 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. (Đóng góp bởi Cédric Krier trong bpo-35153. )

tối ưu hóa

  • Mô-đun hiện có thể sử dụng chức năng này 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 (dùng glibc 2. 24 hoặc mới hơn) nếu tất cả các điều kiện này được đáp ứng

    • close_fds là sai;

    • tham số preexec_fn, pass_fds, cwd và start_new_session không được thiết lập;

    • đường dẫn thực thi chứa một thư mục

    (Đóng góp bởi Joannah Nanjekye và Victor Stinner trong bpo-35537. )

  • , , và sử dụng lệnh gọi 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 nhân, tránh việc sử dụng bộ đệm không gian người dùng trong Python như trong “_______0_______09”. Trên Windows sử dụng kích thước bộ đệm mặc định lớn hơn (1 MiB thay vì 16 KiB) và biến thể dựa trên - của được sử dụng. 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, tiêu thụ ít chu kỳ CPU hơn nhiều. xem phần. (Đóng góp bởi Giampaolo Rodolà trong bpo-33671. )

  • sử dụng chức năng 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ị được lưu trong bộ nhớ cache. Tốc độ sao chép một thư mục có 8000 tệp là khoảng +9% trên Linux, +20% trên Windows và +30% trên chia sẻ Windows SMB. Ngoài ra, số lượng cuộc gọi tòa nhà cũng giảm 38%, đặc biệt nhanh hơn trên các hệ thống tệp mạng. (Đóng góp bởi Giampaolo Rodolà trong bpo-33695. )

  • Giao thức mặc định trong mô-đun 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 khỏi

    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    20. Tất cả các đối tượng được theo dõi bởi GC (e. g. kích thước tuple, list, dict) giảm 4 hoặc 8 byte. (Đóng góp bởi Inada Naoki trong bpo-33597. )

  • hiện sử dụng

    # Loop over fixed length blocks
    while (block := f.read(256)) != '':
        process(block)
    
    38 để giảm dung lượng bộ nhớ của nó. (Đóng góp bởi Wouter Bolsterlee và Tal Einat trong bpo-30977)

  • Cải thiện hiệu suất 33%. Xử lý đối số được tối ưu hóa và thêm một đường dẫn nhanh cho trường hợp phổ biến của một chỉ mục số nguyên không âm duy nhất vào một bộ (là trường hợp sử dụng điển hình trong thư viện chuẩn). (Đóng góp bởi Raymond Hettinger trong bpo-35664. )

  • Tra cứu trường tăng tốc trong. Bây giờ chúng nhanh hơn gấp hai lần, khiến chúng trở thành dạng tra cứu biến thể hiện 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 không phân bổ tổng thể bộ đệm mục bên trong nếu đầu vào có thể lặp lại có độ dài đã biết (đầu vào thực hiện

    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    26). Điều này làm cho danh sách được tạo trung bình nhỏ hơn 12%. (Đóng góp bởi Raymond Hettinger và Pablo Galindo trong bpo-33234. )

  • Nhân đôi tốc độ ghi biến lớp. Khi một thuộc tính non-dunder được cập nhật, sẽ có một cuộc gọi không cần thiết để cập nhật các vị trí. (Được đóng góp bởi Stefan Behnel, Pablo Galindo Salgado, Raymond Hettinger, Neil Schemenauer và Serhiy Storchaka trong bpo-36012. )

  • Giảm chi phí chuyển đổi đố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%. (Đóng góp bởi Serhiy Storchaka trong bpo-23867, bpo-35582 và bpo-36127. )

  • Hướng dẫn

    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    27 hiện sử dụng cơ chế “bộ nhớ cache trên mỗi opcode” mới. Bây giờ nhanh hơn khoảng 40%. (Đóng góp bởi Yury Selivanov và Inada Naoki trong bpo-26219. )

Thay đổi API xây dựng và C

  • Mặc định trở thành một chuỗi rỗng. cờ

    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    29 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. (Đóng góp bởi Victor Stinner trong bpo-36707. )

    Ví dụ về những thay đổi

    • Chỉ có chương trình

      def f(a, b, /, c, d, *, e, f):
          print(a, b, c, d, e, f)
      
      30 được cài đặt, chương trình
      def f(a, b, /, c, d, *, e, f):
          print(a, b, c, d, e, f)
      
      31 đã biến mất

    • Chỉ có tập lệnh

      def f(a, b, /, c, d, *, e, f):
          print(a, b, c, d, e, f)
      
      32 được cài đặt, tập lệnh
      def f(a, b, /, c, d, *, e, f):
          print(a, b, c, d, e, f)
      
      33 đã biến mất

    • Cờ

      def f(a, b, /, c, d, *, e, f):
          print(a, b, c, d, e, f)
      
      29 đã 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 của bên thứ ba, chẳng hạn như các mô-đun được tải xuống từ PyPI. Ví dụ, trên Linux, Python 3. 7 hậu tố
      def f(a, b, /, c, d, *, e, f):
          print(a, b, c, d, e, f)
      
      35 trở thành
      def f(a, b, /, c, d, *, e, f):
          print(a, b, c, d, e, f)
      
      36 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

    • def f(a, b, /, c, d, *, e, f):
          print(a, b, c, d, e, f)
      
      37 phải là API C ổn định công cộng di động

    • def f(a, b, /, c, d, *, e, f):
          print(a, b, c, d, e, f)
      
      38 phải là API C không ổn định dành riêng cho CPython;

    • def f(a, b, /, c, d, *, e, f):
          print(a, b, c, d, e, f)
      
      41 là API C nội bộ riêng rất dành riêng cho CPython. API này không đi kèm với bảo hành 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 các phần bên trong CPython mà không cần gọi các chức năng. API này hiện được cài đặt bởi
      def f(a, b, /, c, d, *, e, f):
          print(a, b, c, d, e, f)
      
      42

    (Đó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à loại 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ụ

    • ,

    • ,

    • def f(a, b, /, c, d, *, e, f):
          print(a, b, c, d, e, f)
      
      47,
      def f(a, b, /, c, d, *, e, f):
          print(a, b, c, d, e, f)
      
      48

    • chức năng riêng tư.

      def f(a, b, /, c, d, *, e, f):
          print(a, b, c, d, e, f)
      
      49,
      def f(a, b, /, c, d, *, e, f):
          print(a, b, c, d, e, f)
      
      50,
      def f(a, b, /, c, d, *, e, f):
          print(a, b, c, d, e, f)
      
      51

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

  • Hàm

    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    52 và
    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    53 đã bị xóa. Họ không làm gì kể từ Python 2. 7. 4 và Trăn 3. 2. 0, đã bị loại trừ khỏi API hạn chế (ABI ổn định) và không được ghi lại. (Đóng góp bởi Victor Stinner trong bpo-35713. )

  • Kết quả của

    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    54 bây giờ thuộc loại
    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    55 thay vì
    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    56. (Đóng góp bởi Serhiy Storchaka trong bpo-33818. )

  • Tính đối ngẫu của

    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    57 và
    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    58 đã 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
    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    57 (bên trong cây nguồn) sang
    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    58 (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 thường xuyên 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ừ

    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    58 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 git fork của CPython hoặc dưới dạng các tệp vá, như họ sẽ làm đối với bất kỳ thay đổi nào khác đối với cây nguồn

    (Đó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 và các hàm phân tích cú pháp đối số như với các đơn vị định dạng chuyển đổi số nguyên như

    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    64 giờ đây sẽ sử dụng phương thức đặc biệt thay vì , nếu có. Cảnh báo không dùng nữa sẽ được phát ra đối với các đối tượng có phương thức
    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    39 nhưng không có phương thức
    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    38 (như và ). bây giờ sẽ trả lại
    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    72 cho các đối tượng thực hiện
    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    38. , và bây giờ cũng sử dụng phương pháp
    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    38 nếu 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ổ theo đống giờ đây sẽ tăng số lượng tham chiếu của chúng trong (và macro song song của nó

    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    79) thay vì trong. Các loại sửa đổi phân bổ cá thể hoặc phân bổ có thể cần phải được điều chỉnh. (Đóng góp bởi Eddie Elizondo trong bpo-35810. )

  • Hàm mới cho phép tạo các đối tượng mã như , nhưng có thêm tham số posonlyargcount để chỉ ra số lượng đối số chỉ vị trí. (Đóng góp bởi Pablo Galindo trong bpo-37221. )

  • bây giờ đặt thành đường dẫn đầy đủ của chương trình () thay vì tên chương trình (). (Đóng góp bởi Victor Stinner trong bpo-38234. )

không dùng nữa

  • Lệnh distutils

    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    87 hiện không được dùng nữa, thay vào đó hãy sử dụng
    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    88 (gói bánh xe). (Đóng góp bởi Victor Stinner trong bpo-37481. )

  • Các phương pháp không dùng nữa

    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    89 và
    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    90 trong mô-đun hiện phát ra thay vì. Chúng sẽ bị xóa trong Python 3. 9. (Đóng góp bởi Serhiy Storchaka trong bpo-29209. )

  • Truyền một đối tượng không phải là phiên bản to không được dùng nữa và sẽ bị cấm trong Python 3. 9. (Đóng góp bởi Elvis Pranskevichus trong bpo-34075. )

  • Các phương pháp

    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    96 của , và đã không được dùng nữa

    Việc triển khai các phương thức này đã bỏ qua tham số chỉ mục của chúng và thay vào đó trả về mục tiếp theo. (Đóng góp bởi Berker Peksag trong bpo-9372. )

  • Lớp không dùng thuộc tính

    f(10, 20, 30, d=40, e=50, f=60)
    
    01 để thay thế thuộc tính
    f(10, 20, 30, d=40, e=50, f=60)
    
    02 có cùng thông tin. (Đóng góp bởi Raymond Hettinger trong bpo-36320. )

  • các lớp

    f(10, 20, 30, d=40, e=50, f=60)
    
    04,
    f(10, 20, 30, d=40, e=50, f=60)
    
    05,
    f(10, 20, 30, d=40, e=50, f=60)
    
    06,
    f(10, 20, 30, d=40, e=50, f=60)
    
    07 và
    f(10, 20, 30, d=40, e=50, f=60)
    
    08 đượ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. nên được sử dụng thay thế. (Đóng góp bởi Serhiy Storchaka trong bpo-32892. )

  • các phương thức

    f(10, 20, 30, d=40, e=50, f=60)
    
    11,
    f(10, 20, 30, d=40, e=50, f=60)
    
    12,
    f(10, 20, 30, d=40, e=50, f=60)
    
    13,
    f(10, 20, 30, d=40, e=50, f=60)
    
    14 và
    f(10, 20, 30, d=40, e=50, f=60)
    
    15 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ức
    f(10, 20, 30, d=40, e=50, f=60)
    
    16 để xử lý tất cả các nút không đổi. (Đóng góp bởi Serhiy Storchaka trong bpo-36917. )

  • f(10, 20, 30, d=40, e=50, f=60)
    
    17 không được dùng nữa và sẽ bị xóa trong phiên bản 3. 10. Thay vì
    f(10, 20, 30, d=40, e=50, f=60)
    
    18, hãy sử dụng thay thế. (Đóng góp bởi Andrew Svetlov trong bpo-36921. )

  • Trong , việc truyền rõ ràng đối số vòng lặp không được dùng nữa và sẽ bị xóa trong phiên bản 3. 10 cho những điều sau đây. , , , , , , , , , , , , , , và

  • Việc chuyển rõ ràng các đối tượng coroutine sang không được dùng nữa và sẽ bị xóa trong phiên bản 3. 11. (Đó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 trong mô-đun.

    f(10, 20, 30, d=40, e=50, f=60)
    
    38,
    f(10, 20, 30, d=40, e=50, f=60)
    
    39,
    f(10, 20, 30, d=40, e=50, f=60)
    
    40 và
    f(10, 20, 30, d=40, e=50, f=60)
    
    41. Chúng trả về các byte được mã hóa và có thể bạn sẽ nhận được các ngoại lệ không mong muốn liên quan đến Unicode nếu có sự cố mã hóa với các chuỗi đã 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 chức năng này đã bị hỏng trong một thời gian dài

    Hàm

    f(10, 20, 30, d=40, e=50, f=60)
    
    42, các phương thức
    f(10, 20, 30, d=40, e=50, f=60)
    
    43 và
    f(10, 20, 30, d=40, e=50, f=60)
    
    44, tham số bộ mã của các hàm và cũng không được dùng nữa vì chúng chỉ được sử dụng cho các hàm
    f(10, 20, 30, d=40, e=50, f=60)
    
    47. (Đóng góp bởi Serhiy Storchaka trong bpo-33710. )

  • Phương pháp

    f(10, 20, 30, d=40, e=50, f=60)
    
    48 đã không còn được dùng nữa. (Đóng góp bởi Dong-hee Na trong bpo-35283. )

  • Nhiều hàm dựng sẵn và hàm mở rộng nhận các đối số số nguyên giờ đây sẽ phát ra cảnh báo không dùng nữa cho s, s và bất kỳ đối tượng nào khác có thể được chuyển đổi thành số nguyên chỉ khi bị mất (e. g. có phương pháp nhưng không có phương pháp). Trong phiên bản tương lai, chúng sẽ bị lỗi. (Đóng góp bởi Serhiy Storchaka trong bpo-36048. )

  • Không dùng nữa việc chuyển các đối số sau dưới dạng đối số từ khóa

    • func trong , , ,

      f(10, 20, 30, d=40, e=50, f=60)
      
      57, và

    • chức năng trong

    • fn trong phương pháp của và

    • callback in ,

      f(10, 20, 30, d=40, e=50, f=60)
      
      66 and

    • c và gõ theo phương pháp

      f(10, 20, 30, d=40, e=50, f=60)
      
      68 của
      f(10, 20, 30, d=40, e=50, f=60)
      
      69 và
      f(10, 20, 30, d=40, e=50, f=60)
      
      70

    • obj trong

    Trong các bản phát hành Python trong tương lai, chúng sẽ. (Đóng góp bởi Serhiy Storchaka trong bpo-36492. )

Loại bỏ API và 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ừ không được dùng nữa và việc nhập phải được thực hiện từ. Có thể nhập từ các bộ sưu tập đã được đánh dấu để xóa trong 3. 8, nhưng đã bị trì hoãn đến 3. 9. (Xem bpo-36952. )

  • Mô-đun

    f(10, 20, 30, d=40, e=50, f=60)
    
    74, không được dùng trong Python 3. 7, đã bị xóa. (Đóng góp bởi Victor Stinner trong bpo-35471. )

  • Hàm

    f(10, 20, 30, d=40, e=50, f=60)
    
    75 đã bị xóa, sau khi không còn được dùng nữa kể từ Python 3. 3. sử dụng thay thế. (Đóng góp bởi Victor Stinner trong bpo-35345. )

  • Hàm

    f(10, 20, 30, d=40, e=50, f=60)
    
    77 đã bị xóa, sau khi không còn được dùng nữa kể từ Python 3. 3. sử dụng hoặc thay vào đó, tùy thuộc vào yêu cầu của bạn, để có hành vi được xác định rõ. (Đóng góp bởi Matthias Bussonnier trong bpo-36895. )

  • Tập lệnh

    f(10, 20, 30, d=40, e=50, f=60)
    
    80 đã bị xóa để thay thế cho
    f(10, 20, 30, d=40, e=50, f=60)
    
    81 để giúp loại bỏ sự nhầm lẫn về trình thông dịch Python mà tập lệnh
    f(10, 20, 30, d=40, e=50, f=60)
    
    80 được liên kết với. (Đóng góp bởi Brett Cannon trong bpo-25427. )

  • f(10, 20, 30, d=40, e=50, f=60)
    
    83,
    f(10, 20, 30, d=40, e=50, f=60)
    
    84 và
    f(10, 20, 30, d=40, e=50, f=60)
    
    85 bị xóa khỏi mô-đun. Chúng không được dùng nữa trong Python 3. 2 tuổi trở lên. Thay vào đó, chúng nên được nhập từ các mô-đun
    f(10, 20, 30, d=40, e=50, f=60)
    
    87 và
    f(10, 20, 30, d=40, e=50, f=60)
    
    88

  • Chức năng

    f(10, 20, 30, d=40, e=50, f=60)
    
    89 bị xóa khỏi mô-đun. Nó không được ghi lại và không dùng nữa kể từ Python 3. 3

  • Hàm tạo không còn chấp nhận đối số html. Nó không bao giờ có tác dụng 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ờ. (Đóng góp bởi Serhiy Storchaka trong bpo-29209. )

  • Đã loại bỏ phương pháp

    f(10, 20, 30, d=40, e=50, f=60)
    
    92 của. (Đóng góp bởi Serhiy Storchaka trong bpo-29209. )

  • bộ giải mã "unicode_internal" đã bị xóa. (Đóng góp bởi Inada Naoki trong bpo-36297. )

  • Các đối tượng

    f(10, 20, 30, d=40, e=50, f=60)
    
    94 và
    f(10, 20, 30, d=40, e=50, f=60)
    
    95 của mô-đun không được hiển thị cho người dùng. (Đóng góp bởi Aviv Palivoda trong bpo-30262. )

  • Đối số từ khóa

    f(10, 20, 30, d=40, e=50, f=60)
    
    97 của and which đã bị bỏ qua và không dùng nữa kể từ Python 3. 6 đã được gỡ bỏ. bpo-36952 (Đóng góp bởi Matthias Bussonnier. )

  • Các hàm

    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    00 và
    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    01 không dùng nữa trong Python 3. 7 đã được gỡ bỏ; . )

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

Thay đổi trong hành vi Python

  • Biểu thức năng suất (cả hai mệnh đề

    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    46 và
    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    03) 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 lặp trong mệnh đề
    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    04 ngoài cùng bên trái). (Đóng góp bởi Serhiy Storchaka trong bpo-10544. )

  • Trình biên dịch hiện tạo ra một kiểm tra danh tính khi (

    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    06 và
    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    07) được sử dụng với một số loại chữ nhất định (e. g. chuỗi, số). Chúng 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 bình đẳng (
    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    08 và
    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    09) để thay thế. (Đóng góp bởi Serhiy Storchaka trong bpo-34850. )

  • Trình thông dịch CPython có thể nuốt ngoại lệ trong một số trường hợp. Trong Python 3. 8 điều này xảy ra trong í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. (Đóng góp bởi Serhiy Storchaka trong bpo-35459. )

  • Đã xóa các triển khai

    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    10 khỏi các loại dựng sẵn , , và một số lớp khỏi thư viện chuẩn. Bây giờ họ thừa kế
    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    15 từ. Kết quả là, việc định nghĩa phương thức
    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    17 trong lớp con của các lớp này sẽ ảnh hưởng đến biểu diễn chuỗi của chúng. (Đóng góp bởi Serhiy Storchaka trong bpo-36793. )

  • Trên AIX, không chứa phiên bản chính nữa. Nó luôn là

    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    19, thay vì
    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    20.
    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    21. Vì các phiên bản Python cũ hơn bao gồm số phiên bản, vì vậy bạn nên luôn sử dụng
    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    22. (Đóng góp bởi M. Cảm thấy trong bpo-36588. )

  • và bây giờ kết thúc luồng hiện tại nếu được gọi trong khi trình thông dịch đang hoàn thiện, làm cho chúng nhất quán với , và. Nếu hành vi này không được mong muốn, hãy bảo vệ cuộc gọi bằng cách kiểm tra

    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    28 hoặc
    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    29. (Đóng góp bởi Joannah Nanjekye trong bpo-36475. )

Các thay đổi trong API Python

  • The function now uses the UTF-8 encoding on Windows, rather than the ANSI code page. 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. (Đóng góp bởi Victor Stinner trong bpo-37412. )

  • bây giờ có thể sử dụng 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

    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    33 sử dụng không còn đưa ra ngoại lệ đối với các lỗi như “chương trình bị thiếu”. Thay vào đó, tiến trình con không thành công với giá trị khác 0
    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    35. (Đóng góp bởi Joannah Nanjekye và Victor Stinner trong bpo-35537. )

  • Đối số preexec_fn của * không còn tương thích với trình thông dịch con. Việc sử dụng tham số trong trình thông dịch con hiện làm tăng. (Đóng góp bởi Eric Snow trong bpo-34651, được Christian Heimes sửa đổi trong bpo-37951. )

  • Phương thức

    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    38 không còn âm thầm bỏ qua các ngoại lệ tùy ý. (Đóng góp bởi Victor Stinner trong bpo-36348. )

  • Hàm

    f(10, 20, 30, d=40, e=50, f=60)
    
    75 đã bị xóa, sau khi không còn được dùng nữa kể từ Python 3. 3. sử dụng thay thế. (Đóng góp bởi Victor Stinner trong bpo-35345. )

  • Hàm 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. (Đóng góp bởi Raymond Hettinger trong bpo-35892. )

  • Phương thức của lớp không còn nhận đối số. Sử dụng nó với các đối số để thay đổi lựa chọn không được dùng trong Python 3. 6. Sử dụng các phương pháp chuyên dụng như để thay đổi lựa chọn. (Đóng góp bởi Serhiy Storchaka trong bpo-31508. )

  • Các phương thức

    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    45,
    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    46 và
    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    47 của và phương thức
    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    49 của
    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    50, hiện giữ nguyên thứ tự thuộc tính do người dùng chỉ định. (Đóng góp bởi Diego Rojas và Raymond Hettinger trong bpo-34160. )

  • Cơ sở dữ liệu được mở bằng cờ

    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    52 hiện ở chế độ chỉ đọc. với các cờ
    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    52 và
    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    55 không còn tạo cơ sở dữ liệu nếu nó không tồn tại. (Đóng góp bởi Serhiy Storchaka trong bpo-32749. )

  • Phương thức

    f(10, 20, 30, d=40, e=50, f=60)
    
    92 được định nghĩa trong lớp con của will không còn được gọi nữa và sẽ phát ra a thay vì a. Xác định phương thức trên mục tiêu để xử lý khai báo loại tài liệu XML. (Đóng góp bởi Serhiy Storchaka trong bpo-29209. )

  • A hiện được nâng lên khi siêu dữ liệu tùy chỉnh không cung cấp mục nhập

    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    62 trong không gian tên được chuyển đến
    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    63. A đã được phát ra trong Python 3. 6–3. 7. (Đóng góp bởi Serhiy Storchaka trong bpo-23722. )

  • Lớp

    # Loop over fixed length blocks
    while (block := f.read(256)) != '':
        process(block)
    
    16 hiện có thể được sử dụng làm trình quản lý ngữ cảnh. (Đóng góp bởi Scott Sanderson trong bpo-29235. )

  • , , và sử dụng các tòa nhà chọc trời “sao chép nhanh” dành riêng cho nền tảng (xem phần)

  • kích thước bộ đệm mặc định trên Windows đã được thay đổi từ 16 KiB thành 1 MiB

  • Cấu trúc

    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    20 đã 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 đã đượ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

    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    73 không rõ ràng 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 cấu trúc là công khai, vì vậy chúng tôi hy vọng không 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ó lựa chọn nào khác thì vui lòng mở vấn đề BPO. Chúng tôi sẽ làm việc để giúp bạn điều chỉnh (có thể bao gồm thêm các chức năng của trình truy cập vào API công khai). (Xem bpo-35886. )

  • Phương pháp hiện trả về

    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    2 khi thành công và đưa ra một ngoại lệ về lỗi trong 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. một giá trị khác không được trả về khi thành công; . Giá trị 0 được trả về khi thành công; . (Đóng góp bởi Berker Peksag trong bpo-2122. )

  • và các mô-đun không còn xử lý các thực thể bên ngoài theo mặc định. (Đóng góp bởi Christian Heimes trong bpo-17239. )

  • Việc xóa khóa khỏi cơ sở dữ liệu chỉ đọc (, hoặc ) làm tăng

    f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
    f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
    
    83 (, hoặc ) thay vì. (Đóng góp bởi Xiang Zhang trong bpo-33106. )

  • AST đơ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 thể hiện. Khởi tạo các lớp cũ

    f(10, 20, 30, d=40, e=50, f=60)
    
    04,
    f(10, 20, 30, d=40, e=50, f=60)
    
    05,
    f(10, 20, 30, d=40, e=50, f=60)
    
    06,
    f(10, 20, 30, d=40, e=50, f=60)
    
    07 và
    f(10, 20, 30, d=40, e=50, f=60)
    
    08 sẽ trả về một thể hiện của
    f(10, 20, 30, d=40, e=50, f=60)
    
    09. (Đóng góp bởi Serhiy Storchaka trong bpo-32892. )

  • trên Windows hiện ưu tiên biến môi trường

    # Loop over fixed length blocks
    while (block := f.read(256)) != '':
        process(block)
    
    91 và không sử dụng
    # Loop over fixed length blocks
    while (block := f.read(256)) != '':
        process(block)
    
    92, biến này thường không được đặt cho tài khoản người dùng thông thường. (Contributed by Anthony Sottile in bpo-36264. )

  • Ngoại lệ bây giờ kế thừa từ thay vì và không còn kế thừa từ. (Đóng góp bởi Yury Selivanov trong bpo-32528. )

  • Chức năng hiện đang chờ hủy bỏ một cách chính xác khi sử dụng một phiên bản của. Trước đây, khi hết thời gian chờ, nó đã bị hủy và ngay lập tức được trả lại. (Đóng góp bởi Elvis Pranskevichus trong bpo-32751. )

  • Hàm hiện trả về một đối tượng ổ cắm an toàn để sử dụng khi 'ổ cắm' được chuyển đến tham số tên. (Đóng góp bởi Yury Selivanov trong bpo-37027. )

  • đã chuyển sang API ổn định

  • Phụ thuộc DLL cho các mô-đun mở rộng và DLL được tải 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 vào mới được tìm kiếm phụ thuộc thời gian tải. Cụ thể,

    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    08 và thư mục làm việc hiện tại không còn được sử dụng nữa và việc sửa đổi những thư mục này sẽ không còn ảnh hưởng đến độ phân giải DLL thông thường. 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 và nếu nó tồn tại, hãy sử dụng nó để thêm thư mục DLL của bạn 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). (Đóng góp bởi Steve Dower trong bpo-36085. )

  • Các tệp tiêu đề và chức năng liên quan đến pgen đã bị xóa sau khi thay thế nó bằng triển khai Python thuần túy. (Contributed by Pablo Galindo in bpo-36623. )

  • 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ỉ 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ỉ vị trí). Phương pháp

    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    58 mới của có thể được sử dụng để làm cho mã có tính khả thi trong tương lai

  • Tham số

    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    13 không còn sử dụng thông báo MD5 theo mặc định

Những thay đổi trong API C

  • Cấu trúc có trường cf_feature_version mới. Nó nên được khởi tạo thành

    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    16. Trường được bỏ qua theo mặc định và được sử dụng khi và chỉ khi cờ
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    17 được đặt trong cf_flags. (Đóng góp bởi Guido van Rossum trong bpo-35766. )

  • Hàm

    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    18 đã bị xóa khỏi API C. Nó không nên được gọi một cách rõ ràng. sử dụng thay thế. (Đóng góp bởi Victor Stinner trong bpo-36728. )

  • Trên Unix, các tiện ích mở rộng của 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, không được tải

    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    20 bằng
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    21 mà thay vào đó là
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    22. Trước đây, khi sử dụng
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    21, không thể tải các tiện ích mở rộng C không được liên kết với
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    20, 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
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    25 của ________0____58. (Đóng góp bởi Victor Stinner trong bpo-21536. )

  • Sử dụng

    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    27 biến thể của định dạng trong phân tích cú pháp hoặc xây dựng giá trị (e. g. , , , vân vân. ) không có
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    31 mức tăng được xác định
    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    92 ngay bây giờ. It will be removed in 3. 10 hoặc 4. 0. Read for detail. (Đóng góp bởi Inada Naoki trong bpo-36381. )

  • Các thể hiện của các loại được cấp phát trong heap (chẳng hạn như các loại được tạo bằng ) 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ừ các hàm cấp thấp hơn và

    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    47. Điều này làm cho các loại được tạo thông qua hoạt động giống như các lớp khác trong mã được quản lý

    không bị ảnh hưởng

    For the vast majority of cases, there should be no side effect. However, types that manually increase the reference count after allocating an instance (perhaps to work around the bug) may now become immortal. To avoid this, these classes need to call Py_DECREF on the type object during instance deallocation

    To correctly port these types into 3. 8, please apply the following changes

    • Remove on the type object after allocating an instance - if any. This may happen after calling , , , , or any other custom allocator that uses or

      def f(a, b, /, c, d, *, e, f):
          print(a, b, c, d, e, f)
      
      47

      Thí dụ

      def f(a, b, /, c, d, *, e, f):
          print(a, b, c, d, e, f)
      
      1

    • Ensure that all custom

      def divmod(a, b, /):
          "Emulate the built in divmod() function"
          return (a // b, a % b)
      
      45 functions of heap-allocated types decrease the type’s reference count

      Thí dụ

      def f(a, b, /, c, d, *, e, f):
          print(a, b, c, d, e, f)
      
      2

    (Contributed by Eddie Elizondo in bpo-35810. )

  • The macro has been implemented for MSVC. The macro now must be placed before the symbol name

    Thí dụ

    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    3

    (Contributed by Zackery Spytz in bpo-33407. )

  • The interpreter does not pretend to support binary compatibility of extension types across feature releases, anymore. A exported by a third-party extension module is supposed to have all the slots expected in the current Python version, including ( is not checked anymore before reading )

    (Contributed by Antoine Pitrou in bpo-32388. )

  • The functions

    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    51 and
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    52 now accept two additional
    discount = 0.0
    if (mo := re.search(r'(\d+)% discount', advertisement)):
        discount = float(mo.group(1)) / 100.0
    
    29 arguments end_lineno and end_col_offset

  • The

    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    54 file to allow MinGW tools to link directly against
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    55 is no longer included in the regular Windows distribution. If you require this file, it may be generated with the
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    56 and
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    57 tools, which are part of the MinGW binutils package

    def f(a, b, /, c, d, *, e, f):
        print(a, b, c, d, e, f)
    
    4

    The location of an installed

    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    58 will depend on the installation options and the version and language of Windows. See for more information. The resulting library should be placed in the same directory as
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    59, which is generally the
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    60 directory under your Python installation

    (Contributed by Steve Dower in bpo-37351. )

CPython bytecode changes

  • The interpreter loop has been simplified by moving the logic of unrolling the stack of blocks into the compiler. The compiler emits now explicit instructions for adjusting the stack of values and calling the cleaning-up code for , and

    Removed opcodes

    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    64,
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    65,
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    66 and
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    67. Added new opcodes
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    68,
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    69,
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    70 and
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    71. Changed the behavior of
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    72 and
    def divmod(a, b, /):
        "Emulate the built in divmod() function"
        return (a // b, a % b)
    
    73

    (Contributed by Mark Shannon, Antoine Pitrou and Serhiy Storchaka in bpo-17611. )

  • Added new opcode for handling exceptions raised when awaiting a next item in an loop. (Contributed by Serhiy Storchaka in bpo-33041. )

  • The now expects the value as the first element in the stack and the key as the second element. This change was made so the key is always evaluated before the value in dictionary comprehensions, as proposed by PEP 572. (Contributed by Jörn Heissler in bpo-35224. )

Demos and Tools

Added a benchmark script for timing various ways to access variables.

def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)
77. (Contributed by Raymond Hettinger in bpo-35884. )

Here’s a summary of performance improvements since Python 3. 3

def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)
5

The benchmarks were measured on an Intel® Core™ i7-4960HQ processor running the macOS 64-bit builds found at python. org. The benchmark script displays timings in nanoseconds

Notable changes in Python 3. 8. 1

Due to significant security concerns, the reuse_address parameter of is no longer supported. This is because of the behavior of the socket option

def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)
79 in UDP. For more details, see the documentation for
def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)
80. (Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in bpo-37228. )

Notable changes in Python 3. 8. 8

Earlier Python versions allowed using both

def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)
81 and
def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)
82 as query parameter separators in and . Due to security concerns, and to conform with newer W3C recommendations, this has been changed to allow only a single separator key, with
def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)
82 as the default. This change also affects and as they use the affected functions internally. For more details, please see their respective documentation. (Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967. )

Notable changes in Python 3. 8. 12

Starting with Python 3. 8. 12 the module no longer accepts any leading zeros in IPv4 address strings. Leading zeros are ambiguous and interpreted as octal notation by some libraries. For example the legacy function treats leading zeros as octal notation. glibc implementation of modern does not accept any leading zeros

Toán tử hải mã là gì?

Toán tử hải mã tạo biểu thức gán . Toán tử cho phép chúng ta gán giá trị cho một biến bên trong biểu thức Python. Nó là một toán tử thuận tiện làm cho mã của chúng tôi gọn hơn. Chúng ta có thể gán và in một biến trong một lần.

cái gì. = toán tử trong Python?

Có cú pháp mới. = that assigns values to variables as part of a larger expression . It is affectionately known as “the walrus operator” due to its resemblance to the eyes and tusks of a walrus.

Toán tử hải mã được giới thiệu khi nào?

Introduced in python 3. 8 , the walrus operator, (. =), chính thức được gọi là toán tử biểu thức gán, cung cấp một cách để gán cho các biến trong một biểu thức, kể cả các biến chưa tồn tại.