Що нового в Python 3.10

редактор:

Pablo Galindo Salgado

У цій статті пояснюється нові функції в Python 3.10 порівняно з 3.9. Python 3.10 було випущено 4 жовтня 2021 року. Щоб отримати повну інформацію, перегляньте журнал змін.

Підсумок – основні моменти випуску

Нові функції синтаксису:

  • PEP 634, Зіставлення структурних шаблонів: Специфікація

  • PEP 635, Зіставлення структурних шаблонів: мотивація та обґрунтування

  • PEP 636, Зіставлення структурних шаблонів: підручник

  • bpo-12782, Менеджери контексту в дужках тепер офіційно дозволені.

Нові можливості стандартної бібліотеки:

  • PEP 618, Додайте опціональну перевірку довжини до zip.

Покращення перекладача:

  • PEP 626, точні номери рядків для налагодження та інших інструментів.

Нові функції набору тексту:

  • PEP 604, Дозволити запис типів об’єднань як X | Ю

  • PEP 612, Змінні специфікації параметрів

  • PEP 613, Явні псевдоніми типу

  • PEP 647, User-Defined Type Guards

Важливі застарілі, видалення або обмеження:

  • PEP 644, Потрібен OpenSSL 1.1.1 або новіший

  • PEP 632, Вилучити модуль distutils.

  • PEP 623, Застаріло та підготуйтеся до видалення члена wstr у PyUnicodeObject.

  • PEP 624, Видалити API кодувальника Py_UNICODE

  • PEP 597, Додайте необов’язкове попередження про кодування

Нові можливості

Менеджери контексту в дужках

Тепер підтримується використання круглих дужок для продовження в кількох рядках у контекстних менеджерах. Це дозволяє форматувати довгу колекцію контекстних менеджерів у кількох рядках подібним чином, як це було раніше можливо за допомогою операторів імпорту. Наприклад, тепер дійсні всі ці приклади:

with (CtxManager() as example):
    ...

with (
    CtxManager1(),
    CtxManager2()
):
    ...

with (CtxManager1() as example,
      CtxManager2()):
    ...

with (CtxManager1(),
      CtxManager2() as example):
    ...

with (
    CtxManager1() as example1,
    CtxManager2() as example2
):
    ...

також можна використовувати кінцеву кому в кінці закритої групи:

with (
    CtxManager1() as example1,
    CtxManager2() as example2,
    CtxManager3() as example3,
):
    ...

Цей новий синтаксис використовує можливості нового парсера, відмінні від LL(1). Щоб дізнатися більше, перевірте PEP 617.

(Надано Гвідо ван Россумом, Пабло Галіндо та Лісандросом Ніколау в bpo-12782 і bpo-40334.)

Кращі повідомлення про помилки

SyntaxErrors

Під час синтаксичного аналізу коду, який містить незакриті дужки або дужки, інтерпретатор тепер включає розташування незакритих дужок замість відображення SyntaxError: unexpected EOF while parsing або вказівки на деяке неправильне розташування. Наприклад, розглянемо такий код (зверніть увагу на незакритий „{„):

expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
            38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6,
some_other_code = foo()

Попередні версії інтерпретатора повідомляли про незрозумілі місця як розташування синтаксичної помилки:

File "example.py", line 3
    some_other_code = foo()
                    ^
SyntaxError: invalid syntax

але в Python 3.10 видається більш інформативна помилка:

File "example.py", line 1
    expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
               ^
SyntaxError: '{' was never closed

Подібним чином помилки, пов’язані з незакритими рядковими літералами (в одинарних і потрійних лапках), тепер вказують на початок рядка, а не повідомляють EOF/EOL.

Ці вдосконалення натхненні попередньою роботою над інтерпретатором PyPy.

(Надано Пабло Галіндо в bpo-42864 і Батухан Таская в bpo-40176.)

Винятки SyntaxError, викликані інтерпретатором, тепер висвітлюватимуть повний діапазон помилок виразу, який становить саму синтаксичну помилку, а не лише місце виявлення проблеми. Таким чином, замість відображення (до Python 3.10):

>>> foo(x, z for z in range(10), t, w)
  File "<stdin>", line 1
    foo(x, z for z in range(10), t, w)
           ^
SyntaxError: Generator expression must be parenthesized

тепер Python 3.10 відображатиме виняток як:

>>> foo(x, z for z in range(10), t, w)
  File "<stdin>", line 1
    foo(x, z for z in range(10), t, w)
           ^^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized

Це вдосконалення вніс Пабло Галіндо в bpo-43914.

Було включено значну кількість нових спеціалізованих повідомлень для винятків SyntaxError. Ось деякі з найпомітніших:

  • Відсутній : перед блоками:

    >>> if rocket.position > event_horizon
      File "<stdin>", line 1
        if rocket.position > event_horizon
                                          ^
    SyntaxError: expected ':'
    

    (Contributed by Pablo Galindo in bpo-42997.)

  • Кортежі без дужок у цілях розуміння:

    >>> {x,y for x,y in zip('abcd', '1234')}
      File "<stdin>", line 1
        {x,y for x,y in zip('abcd', '1234')}
         ^
    SyntaxError: did you forget parentheses around the comprehension target?
    

    (Contributed by Pablo Galindo in bpo-43017.)

  • Відсутні коми в літералах колекції та між виразами:

    >>> items = {
    ... x: 1,
    ... y: 2
    ... z: 3,
      File "<stdin>", line 3
        y: 2
           ^
    SyntaxError: invalid syntax. Perhaps you forgot a comma?
    

    (Contributed by Pablo Galindo in bpo-43822.)

  • Кілька типів винятків без дужок:

    >>> try:
    ...     build_dyson_sphere()
    ... except NotEnoughScienceError, NotEnoughResourcesError:
      File "<stdin>", line 3
        except NotEnoughScienceError, NotEnoughResourcesError:
               ^
    SyntaxError: multiple exception types must be parenthesized
    

    (Contributed by Pablo Galindo in bpo-43149.)

  • Відсутні : і значення в літералах словника:

    >>> values = {
    ... x: 1,
    ... y: 2,
    ... z:
    ... }
      File "<stdin>", line 4
        z:
         ^
    SyntaxError: expression expected after dictionary key and ':'
    
    >>> values = {x:1, y:2, z w:3}
      File "<stdin>", line 1
        values = {x:1, y:2, z w:3}
                            ^
    SyntaxError: ':' expected after dictionary key
    

    (Contributed by Pablo Galindo in bpo-43823.)

  • блоки try без блоків except або finally:

    >>> try:
    ...     x = 2
    ... something = 3
      File "<stdin>", line 3
        something  = 3
        ^^^^^^^^^
    SyntaxError: expected 'except' or 'finally' block
    

    (Contributed by Pablo Galindo in bpo-44305.)

  • Використання = замість == у порівняннях:

    >>> if rocket.position = event_horizon:
      File "<stdin>", line 1
        if rocket.position = event_horizon:
                           ^
    SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?
    

    (Contributed by Pablo Galindo in bpo-43797.)

  • Використання * у f-рядках:

    >>> f"Black holes {*all_black_holes} and revelations"
      File "<stdin>", line 1
        (*all_black_holes)
         ^
    SyntaxError: f-string: cannot use starred expression here
    

    (Contributed by Pablo Galindo in bpo-41064.)

IndentationErrors

Багато винятків IndentationError тепер мають більше контексту щодо того, який тип блоку очікував відступу, включаючи розташування оператора:

>>> def foo():
...    if lel:
...    x = 2
  File "<stdin>", line 3
    x = 2
    ^
IndentationError: expected an indented block after 'if' statement in line 2

AttributeErrors

Під час друку AttributeError, PyErr_Display() запропонує подібні назви атрибутів в об’єкті, з якого було викликано виключення:

>>> collections.namedtoplo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?

(Надав Пабло Галіндо в bpo-38530.)

Попередження

Зауважте, що це не працюватиме, якщо PyErr_Display() не викликається для відображення помилки, що може статися, якщо використовується якась інша функція відображення помилок. Це поширений сценарій у деяких REPL, таких як IPython.

NameErrors

Під час друку NameError, викликаного інтерпретатором, PyErr_Display() запропонує пропозиції подібних імен змінних у функції, з якої було викликано виняток:

>>> schwarzschild_black_hole = None
>>> schwarschild_black_hole
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'schwarschild_black_hole' is not defined. Did you mean: schwarzschild_black_hole?

(Надав Пабло Галіндо в bpo-38530.)

Попередження

Зауважте, що це не спрацює, якщо PyErr_Display() не викликається для відображення помилки, що може статися, якщо використовується інша функція відображення помилок. Це поширений сценарій у деяких REPL, таких як IPython.

PEP 626: точні номери рядків для налагодження та інших інструментів

PEP 626 надає більш точні та надійні номери рядків для інструментів налагодження, профілювання та покриття. Події трасування з правильним номером рядка генеруються для всіх виконаних рядків коду та лише для рядків коду, які виконуються.

The f_lineno attribute of frame objects will always contain the expected line number.

The co_lnotab attribute of code objects is deprecated and will be removed in 3.12. Code that needs to convert from offset to line number should use the new co_lines() method instead.

PEP 634: Зіставлення структурних шаблонів

Зіставлення структурних шаблонів було додано у формі операторів відповідності та операторів case шаблонів із пов’язаними діями. Патерни складаються з послідовностей, відображень, примітивних типів даних, а також екземплярів класу. Зіставлення шаблонів дозволяє програмам отримувати інформацію зі складних типів даних, розгалужувати структуру даних і застосовувати певні дії на основі різних форм даних.

Синтаксис та операції

Загальний синтаксис зіставлення шаблонів:

match subject:
    case <pattern_1>:
        <action_1>
    case <pattern_2>:
        <action_2>
    case <pattern_3>:
        <action_3>
    case _:
        <action_wildcard>

Інструкція збігу приймає вираз і порівнює його значення з послідовними шаблонами, поданими як один або більше блоків регістру. Зокрема, зіставлення шаблонів працює за допомогою:

  1. використання даних із типом і формою (тема)

  2. оцінка підмета в match заяві

  3. порівняння суб’єкта з кожним шаблоном у операторі case зверху вниз, доки відповідність не буде підтверджено.

  4. виконання дії, пов’язаної з шаблоном підтвердженого збігу

  5. Якщо точний збіг не підтверджено, останній регістр, символ підстановки _, якщо він наданий, буде використано як відповідний регістр. Якщо точний збіг не підтверджено, а регістр символів підстановки не існує, весь блок збігів є безопераційним.

Декларативний підхід

Читачі можуть знати про зіставлення шаблонів на простому прикладі зіставлення суб’єкта (об’єкта даних) з літералом (шаблоном) за допомогою оператора switch, знайденого в C, Java чи JavaScript (і багатьох інших мовах). Часто оператор switch використовується для порівняння об’єкта/виразу з операторами case, що містять літерали.

Більш потужні приклади зіставлення шаблонів можна знайти в таких мовах, як Scala та Elixir. При зіставленні структурних шаблонів підхід є «декларативним» і явно визначає умови (шаблони) для збігу даних.

Хоча «імперативна» серія інструкцій із використанням вкладених операторів «if» може бути використана для виконання чогось подібного до зіставлення структурного шаблону, вона менш зрозуміла, ніж «декларативний» підхід. Натомість «декларативний» підхід визначає умови, які необхідно виконати для збігу, і його легше читати через його явні шаблони. У той час як зіставлення структурних шаблонів можна використовувати в його найпростішій формі, порівнюючи змінну з літералом у операторі case, його справжня цінність для Python полягає в його обробці типу та форми суб’єкта.

Простий шаблон: відповідність літералу

Давайте розглянемо цей приклад як зіставлення шаблону в його найпростішій формі: значення, суб’єкт, який зіставляється з кількома літералами, шаблонами. У наведеному нижче прикладі status є предметом оператора відповідності. Шаблони є кожним із операторів case, де літерали представляють коди статусу запиту. Пов’язана дія з інцидентом виконується після збігу:

def http_error(status):
    match status:
        case 400:
            return "Bad request"
        case 404:
            return "Not found"
        case 418:
            return "I'm a teapot"
        case _:
            return "Something's wrong with the internet"

Якщо наведеній вище функції передається статус 418, повертається «Я чайник». Якщо наведеній вище функції передано статус 500, оператор case з _ відповідатиме як символ підстановки, і буде повернено «Щось не так з Інтернетом». Зверніть увагу на останній блок: назва змінної, _, діє як знак підстановки і гарантує, що тема завжди збігатиметься. Використання _ необов’язкове.

Ви можете поєднати кілька літералів в одному шаблоні за допомогою | («або»):

case 401 | 403 | 404:
    return "Not allowed"
Поведінка без символу підстановки

Якщо ми змінимо наведений вище приклад, видаливши останній блок case, приклад стане:

def http_error(status):
    match status:
        case 400:
            return "Bad request"
        case 404:
            return "Not found"
        case 418:
            return "I'm a teapot"

Без використання _ в операторі case збіг може не існувати. Якщо відповідності немає, поведінка є безопераційною. Наприклад, якщо передано статус 500, виникає помилка.

Патерни з літералом і змінною

Патерни можуть виглядати як завдання розпакування, і шаблон може використовуватися для зв’язування змінних. У цьому прикладі точку даних можна розпакувати до її координати x і y:

# point is an (x, y) tuple
match point:
    case (0, 0):
        print("Origin")
    case (0, y):
        print(f"Y={y}")
    case (x, 0):
        print(f"X={x}")
    case (x, y):
        print(f"X={x}, Y={y}")
    case _:
        raise ValueError("Not a point")

Перший шаблон містить два літерали, (0, 0), і його можна вважати розширенням літерального шаблону, показаного вище. Наступні два шаблони поєднують літерал і змінну, а змінна зв’язує значення з теми (точка). Четвертий шаблон фіксує два значення, що робить його концептуально подібним до призначення розпакування (x, y) = point.

Шаблони та класи

Якщо ви використовуєте класи для структурування своїх даних, ви можете використовувати як шаблон назву класу, за якою слідує список аргументів, схожий на конструктор. Цей шаблон має можливість захоплювати атрибути класу в змінні:

class Point:
    x: int
    y: int

def location(point):
    match point:
        case Point(x=0, y=0):
            print("Origin is the point's location.")
        case Point(x=0, y=y):
            print(f"Y={y} and the point is on the y-axis.")
        case Point(x=x, y=0):
            print(f"X={x} and the point is on the x-axis.")
        case Point():
            print("The point is located somewhere else on the plane.")
        case _:
            print("Not a point")
Патерни з позиційними параметрами

Ви можете використовувати позиційні параметри з деякими вбудованими класами, які забезпечують порядок для своїх атрибутів (наприклад, класи даних). Ви також можете визначити конкретну позицію для атрибутів у шаблонах, встановивши спеціальний атрибут __match_args__ у своїх класах. Якщо для нього встановлено значення («x», «y»), усі наступні шаблони еквівалентні (і всі прив’язують атрибут y до змінної var):

Point(1, var)
Point(1, y=var)
Point(x=1, y=var)
Point(y=var, x=1)

Вкладені візерунки

Візерунки можуть бути довільно вкладеними. Наприклад, якщо наші дані є коротким списком точок, їх можна зіставити так:

match points:
    case []:
        print("No points in the list.")
    case [Point(0, 0)]:
        print("The origin is the only point in the list.")
    case [Point(x, y)]:
        print(f"A single point {x}, {y} is in the list.")
    case [Point(0, y1), Point(0, y2)]:
        print(f"Two points on the Y axis at {y1}, {y2} are in the list.")
    case _:
        print("Something else is found in the list.")

Складні візерунки та символ підстановки

До цього моменту приклади використовували лише _ в останньому операторі case. Символ узагальнення можна використовувати в більш складних шаблонах, наприклад ('помилка', код, _). Наприклад:

match test_variable:
    case ('warning', code, 40):
        print("A warning has been received.")
    case ('error', code, _):
        print(f"An error {code} occurred.")

У наведеному вище випадку test_variable відповідатиме („error“, code, 100) і („error“, code, 800).

Охоронець

Ми можемо додати умову if до шаблону, відомого як «guard». Якщо guard false, match переходить до наступного блоку case. Зауважте, що захоплення значення відбувається до оцінки захисника:

match point:
    case Point(x, y) if x == y:
        print(f"The point is located on the diagonal Y=X at {x}.")
    case Point(x, y):
        print(f"Point is not on the diagonal.")

Інші ключові функції

Кілька інших ключових функцій:

  • Подібно до завдань розпакування, шаблони кортежу та списку мають однакове значення та фактично відповідають довільним послідовностям. Технічно предмет має бути послідовністю. Таким чином, важливим винятком є те, що шаблони не відповідають ітераторам. Також, щоб запобігти типовій помилці, шаблони послідовності не збігаються з рядками.

  • Шаблони послідовності підтримують символи підстановки: [x, y, *rest] і (x, y, *rest) працюють подібно до символів підстановки під час розпакування призначень. Ім’я після * також може бути _, тому (x, y, *_) відповідає послідовності принаймні двох елементів без зв’язування решти елементів.

  • Шаблони зіставлення: {"bandwidth": b, "latency": l} фіксує значення "bandwidth" і "latency" з dict. На відміну від шаблонів послідовності, додаткові ключі ігноруються. Також підтримується символ підстановки **rest. (Але **_ буде зайвим, тому не дозволено.)

  • Підшаблони можуть бути захоплені за допомогою ключового слова as:

    case (Point(x1, y1), Point(x2, y2) as p2): ...
    

    Це прив’язує x1, y1, x2, y2, як ви очікуєте без пропозиції as, і p2 до всього другого елемента теми.

  • Більшість літералів порівнюються за рівністю. Однак синглетони True, False і None порівнюються за тотожністю.

  • У шаблонах можна використовувати іменовані константи. Ці іменовані константи повинні бути розділені крапками, щоб запобігти інтерпретації константи як змінної захоплення:

    from enum import Enum
    class Color(Enum):
        RED = 0
        GREEN = 1
        BLUE = 2
    
    match color:
        case Color.RED:
            print("I see red!")
        case Color.GREEN:
            print("Grass is green")
        case Color.BLUE:
            print("I'm feeling the blues :(")
    

Повну специфікацію див. PEP 634. Мотивація та обґрунтування знаходяться в PEP 635, а довший підручник у PEP 636.

Додатковий параметр EncodingWarning і encoding="locale"

Стандартне кодування TextIOWrapper і open() залежить від платформи та локалі. Оскільки UTF-8 використовується на більшості платформ Unix, пропуск параметра encoding під час відкриття файлів UTF-8 (наприклад, JSON, YAML, TOML, Markdown) є дуже поширеною помилкою. Наприклад:

# BUG: "rb" mode or encoding="utf-8" should be used.
with open("data.json") as f:
    data = json.load(f)

Щоб знайти цей тип помилки, додається необов’язкове EncodingWarning. Він видається, коли sys.flags.warn_default_encoding має значення true і використовується кодування за замовчуванням, що залежить від локалі.

Опція -X warn_default_encoding і PYTHONWARNDEFAULTENCODING додано, щоб увімкнути попередження.

Перегляньте Кодування тексту для отримання додаткової інформації.

Інші зміни мови

  • Тип int має новий метод int.bit_count(), який повертає кількість одиниць у двійковому розширенні даного цілого числа, також відоме як кількість населення. (Надав Ніклас Фієкас у bpo-29882.)

  • Представлення, що повертаються dict.keys(), dict.values() і dict.items(), тепер усі мають атрибут mapping, який дає types.MappingProxyType об’єкт, що обгортає оригінальний словник. (Надав Денніс Суїні в bpo-40890.)

  • PEP 618: функція zip() тепер має додатковий прапорець strict, який використовується для вимоги, щоб усі ітеровані елементи мали однакову довжину.

  • Вбудовані функції та функції розширення, які приймають цілі аргументи, більше не приймають Decimals, Fractions та інші об’єкти, які можна перетворити на цілі числа лише з втратою (наприклад, що мають метод __int__(), але не мають методу __index__()). (Надав Сергій Сторчака в bpo-37999.)

  • If object.__ipow__() returns NotImplemented, the operator will correctly fall back to object.__pow__() and object.__rpow__() as expected. (Contributed by Alex Shkop in bpo-38302.)

  • Вирази присвоєння тепер можна використовувати без дужок у літералах набору та розуміння набору, а також в індексах послідовності (але не в зрізах).

  • Функції мають новий атрибут __builtins__, який використовується для пошуку вбудованих символів під час виконання функції замість перегляду __globals__['__builtins__']. Атрибут ініціалізується з __globals__["__builtins__"], якщо він існує, інакше з поточних вбудованих елементів. (Надав Марк Шеннон у bpo-42990.)

  • Дві нові вбудовані функції – aiter() і anext() були додані, щоб забезпечити асинхронні відповідники iter() і next() відповідно. (Надано Джошуа Бронсоном, Деніелом Поупом і Джастіном Вангом у bpo-31861.)

  • Статичні методи (@staticmethod) і методи класу (@classmethod) тепер успадковують атрибути методу (__module__, __name__, __qualname__, __doc__, __annotations__) і мають новий атрибут __wrapped__. Крім того, статичні методи тепер можна викликати як звичайні функції. (Надав Віктор Стіннер у bpo-43682.)

  • Анотації для складних цілей (усі, окрім цілей простих імен, визначених PEP 526) більше не викликають жодних ефектів під час виконання з from __future__ import anotations. (Надано Batuhan Taskaya в bpo-42737.)

  • Об’єкти класів і модулів тепер відкладено створюють порожні анотації dicts на вимогу. Анотації dicts зберігаються в об’єкті __dict__ для зворотної сумісності. Це покращує найкращі методи роботи з __annotations__; для отримання додаткової інформації див. Рекомендації щодо анотацій. (Надано Ларрі Гастінгсом у bpo-43901.)

  • Анотації, що складаються з yield, yield from, await або іменовані вирази тепер заборонені в from __future__ import анотаціях через їхні побічні ефекти. (Надано Batuhan Taskaya в bpo-42725.)

  • Використання незв’язаних змінних, super() та інших виразів, які можуть змінити обробку таблиці символів як анотацій, тепер стає неефективним у from __future__ import anotations. (Надано Batuhan Taskaya в bpo-42725.)

  • Хеші значень NaN як типу float, так і типу decimal.Decimal тепер залежать від ідентичності об’єкта. Раніше вони завжди хешувалися до 0, навіть якщо значення NaN не дорівнюють одне одному. Це спричинило потенційно квадратичну поведінку під час виконання через надмірні хеш-колізії під час створення словників і наборів, що містять кілька NaN. (Надав Реймонд Геттінгер у bpo-43475.)

  • A SyntaxError (instead of a NameError) will be raised when deleting the __debug__ constant. (Contributed by Donghee Na in bpo-45000.)

  • Винятки SyntaxError тепер мають атрибути end_lineno і end_offset. Вони будуть None, якщо не визначено. (Надав Пабло Галіндо в bpo-43914.)

Нові модулі

  • None.

Покращені модулі

asyncio

Додайте відсутній метод connect_accepted_socket(). (Надав Алекс Грьонхольм у bpo-41332.)

argparse

Оманливу фразу «необов’язкові аргументи» було замінено на «параметри» в довідці argparse. Деякі тести можуть вимагати адаптації, якщо вони покладаються на точну вихідну відповідність. (Надав Реймонд Геттінгер у bpo-9694.)

масив

Метод index() array.array тепер має додаткові параметри start і stop. (Надано Андерсом Лоренценом і Закері Шпітцем у bpo-31956.)

asynchat, asyncore, smtpd

Починаючи з Python 3.6, ці модулі позначені як застарілі в документації модулів. До всіх цих трьох модулів тепер додано DeprecationWarning під час імпорту.

база64

Додайте base64.b32hexencode() і base64.b32hexdecode() для підтримки кодування Base32 із розширеним шістнадцятковим алфавітом.

bdb

Додайте clearBreakpoints(), щоб скинути всі встановлені точки зупину. (Надано Іріт Катріель у bpo-24160.)

ділимо навпіл

Додано можливість надання функції key для API в модулі bisect. (Надав Реймонд Геттінгер у bpo-4356.)

кодеки

Додайте функцію codecs.unregister(), щоб скасувати реєстрацію функції пошуку кодеків. (Надав Хай Ши в bpo-41842.)

колекції.abc

__args__ параметризованого загального для collections.abc.Callable тепер узгоджується з typing.Callable. collections.abc.Callable generic тепер зводить параметри типу, подібно до того, що зараз робить typing.Callable. Це означає, що collections.abc.Callable[[int, str], str] матиме __args__ (int, str, str); раніше це було ([int, str], str). Щоб дозволити цю зміну, types.GenericAlias тепер можна створювати підкласи, і підклас повертатиметься під час підписки типу collections.abc.Callable. Зауважте, що помилка TypeError може виникнути через неприпустимі форми параметризації collections.abc.Callable, які могли пройти мовчки в Python 3.9. (Надав Кен Джин у bpo-42195.)

contextlib

Додайте менеджер контексту contextlib.aclosing(), щоб безпечно закривати асинхронні генератори та об’єкти, що представляють асинхронно звільнені ресурси. (Надано Джунгі Кімом і Джоном Бельмонте в bpo-41229.)

Додайте підтримку диспетчера асинхронного контексту до contextlib.nullcontext(). (Надав Том Грінгауз у bpo-41543.)

Додайте AsyncContextDecorator для підтримки використання менеджерів асинхронного контексту як декораторів.

прокльони

Розширені функції кольору, додані в ncurses 6.1, прозоро використовуватимуться curses.color_content(), curses.init_color(), curses.init_pair() і curses.pair_content(). Нова функція, curses.has_extended_color_support(), вказує, чи надається розширена підтримка кольорів базовою бібліотекою ncurses. (Надано Джеффрі Кінтчером і Гансом Петтером Янссоном у bpo-36982.)

Константи BUTTON5_* тепер доступні в модулі curses, якщо вони надаються основною бібліотекою curses. (Надав Закері Шпітц у bpo-39273.)

класи даних

__slots__

Додано параметр slots в декоратор dataclasses.dataclass(). (Надав Юрій Карабас у bpo-42269)

Поля лише для ключових слів

dataclasses тепер підтримує поля, які є лише ключовими словами у створеному методі __init__. Існує кілька способів визначення полів лише для ключових слів.

Можна сказати, що кожне поле є лише ключовим словом:

from dataclasses import dataclass

@dataclass(kw_only=True)
class Birthday:
    name: str
    birthday: datetime.date

І name, і birthday є параметрами лише для ключових слів для згенерованого методу __init__.

Ви можете вказати лише ключове слово для кожного поля:

from dataclasses import dataclass, field

@dataclass
class Birthday:
    name: str
    birthday: datetime.date = field(kw_only=True)

Тут лише день народження є лише ключовим словом. Якщо ви встановлюєте kw_only для окремих полів, майте на увазі, що існують правила щодо зміни порядку полів, оскільки поля, які містять лише ключові слова, мають слідувати полям, які не містять лише ключових слів. Дивіться повну документацію класів даних для деталей.

Ви також можете вказати, що всі поля після маркера KW_ONLY є лише ключовими словами. Ймовірно, це буде найпоширенішим використанням:

from dataclasses import dataclass, KW_ONLY

@dataclass
class Point:
    x: float
    y: float
    _: KW_ONLY
    z: float = 0.0
    t: float = 0.0

Here, z and t are keyword-only parameters, while x and y are not. (Contributed by Eric V. Smith in bpo-43532.)

distutils

Весь пакет distutils застарів, його буде видалено в Python 3.12. Його функціональні можливості для вказівки збірок пакунків уже повністю замінено пакетами сторонніх розробників setuptools і packaging, а більшість інших поширених API доступні в інших місцях стандартної бібліотеки (наприклад, platform , shutil, subprocess або sysconfig). Немає планів переміщення будь-якої іншої функціональності з distutils, і програми, які використовують інші функції, повинні планувати створення приватних копій коду. Зверніться до PEP 632 для обговорення.

Команду bdist_wininst, яка застаріла в Python 3.8, видалено. Команда bdist_wheel тепер рекомендована для розповсюдження двійкових пакетів у Windows. (Надав Віктор Стіннер у bpo-42802.)

doctest

Якщо модуль не визначає __loader__, поверніться до __spec__.loader. (Надано Бреттом Кенноном у bpo-42133.)

кодування

encodings.normalize_encoding() тепер ігнорує символи, відмінні від ASCII. (Надав Хай Ши в bpo-39337.)

enum

Enum __repr__() now returns enum_name.member_name and __str__() now returns member_name. Stdlib enums available as module constants have a repr() of module_name.member_name. (Contributed by Ethan Furman in bpo-40066.)

Add enum.StrEnum for enums where all members are strings. (Contributed by Ethan Furman in bpo-41816.)

введення файлу

Додайте параметри encoding і errors у fileinput.input() і fileinput.FileInput. (Надано Інадою Наокі в bpo-43712.)

fileinput.hook_compressed() тепер повертає об’єкт TextIOWrapper, коли mode має значення «r» і файл стиснутий, як і нестиснені файли. (Надано Інадою Наокі в bpo-5758.)

обробник помилок

Модуль faulthandler тепер виявляє, якщо під час збирання сміття виникає фатальна помилка. (Надав Віктор Стіннер у bpo-44466.)

gc

Додайте перехоплювачі аудиту для gc.get_objects(), gc.get_referrers() і gc.get_referents(). (Надав Пабло Галіндо в bpo-43439.)

глоб

Додайте параметри root_dir і dir_fd у glob() і iglob(), які дозволяють вказати кореневий каталог для пошуку. (Надав Сергій Сторчака в bpo-38144.)

хешліб

Модуль hashlib вимагає OpenSSL 1.1.1 або новішої версії. (Надав Крістіан Хаймес у PEP 644 і bpo-43669.)

Модуль hashlib має попередню підтримку OpenSSL 3.0.0. (Надано Крістіаном Хеймсом у bpo-38820 та інших випусках.)

Резервна версія чистого Python pbkdf2_hmac() застаріла. У майбутньому PBKDF2-HMAC буде доступний лише тоді, коли Python буде створено з підтримкою OpenSSL. (Надав Крістіан Хеймс у bpo-43880.)

hmac

Модуль hmac тепер використовує внутрішню реалізацію HMAC OpenSSL. (Надав Крістіан Хеймс у bpo-40645.)

IDLE і idlelib

Зробити IDLE викликом sys.excepthook() (якщо запускається без „-n“). Хуки користувача раніше ігнорувалися. (Надав Кен Хілтон у bpo-43008.)

Перевпорядкування діалогового вікна налаштувань. Розділіть вкладку Загальні на вкладки Windows і Shell/Ed. Перемістіть джерела довідки, які розширюють меню «Довідка», на вкладку «Розширення». Звільніть місце для нових параметрів і скоротіть діалогове вікно. Останнє робить діалог краще адаптованим до маленьких екранів. (Надано Террі Джен Ріді в bpo-40468.) Перемістіть налаштування відступу з вкладки «Шрифт» на нову вкладку Windows. (Надано Марком Розманом і Террі Джен Ріді в bpo-33962.)

Зазначені вище зміни було перенесено до версії 3.9 для обслуговування.

Додайте бічну панель Shell. Перемістіть основну підказку („>>>“) на бічну панель. Додайте додаткові підказки (“…“) на бічну панель. Клацання лівою кнопкою миші та необов’язкове перетягування виділяє один або кілька рядків тексту, як і на бічній панелі номерів рядків редактора. Клацання правою кнопкою миші після вибору текстових рядків відображає контекстне меню з «копіювати з підказками». Це об’єднує підказки з бічної панелі з рядками з виділеного тексту. Цей параметр також відображається в контекстному меню для тексту. (Надав Тал Ейнат у bpo-37903.)

Використовуйте пробіли замість табуляції, щоб зробити відступ інтерактивного коду. Завдяки цьому інтерактивні записи коду виглядають правильно. Зробити це можливим було основною мотивацією для додавання бічної панелі оболонки. (Надав Террі Ян Ріді в bpo-37892.)

Виділіть нові м’які ключові слова match, case і _ в операторах зіставлення шаблонів. Однак це підсвічування не є ідеальним і буде неправильним у деяких рідкісних випадках, включаючи деякі _-s у шаблонах case. (Надав Тал Ейнат у bpo-44010.)

Нове у випусках обслуговування 3.10.

Apply syntax highlighting to .pyi files. (Contributed by Alex Waygood and Terry Jan Reedy in bpo-45447.)

Include prompts when saving Shell with inputs and outputs. (Contributed by Terry Jan Reedy in gh-95191.)

importlib.metadata

Парність функцій із importlib_metadata 4.6 (історія).

точки входу importlib.metadata тепер забезпечують кращий досвід для вибору точок входу за групою та назвою за допомогою нового класу importlib.metadata.EntryPoints. Див. Примітку щодо сумісності в документах, щоб дізнатися більше про застаріле та використання.

Додано importlib.metadata.packages_distributions() для вирішення модулів і пакетів Python верхнього рівня в їх importlib.metadata.Distribution.

оглядати

Якщо модуль не визначає __loader__, поверніться до __spec__.loader. (Надано Бреттом Кенноном у bpo-42133.)

Додайте inspect.get_annotations(), який безпечно обчислює анотації, визначені для об’єкта. Він усуває особливості доступу до анотацій для різних типів об’єктів і робить дуже мало припущень щодо об’єкта, який він досліджує. inspect.get_annotations() також може правильно видаляти рядкові анотації. inspect.get_annotations() тепер вважається найкращою практикою для доступу до dict анотацій, визначених у будь-якому об’єкті Python; для отримання додаткової інформації про найкращі методи роботи з анотаціями, будь ласка, перегляньте Рекомендації щодо анотацій. Відповідно, inspect.signature(), inspect.Signature.from_callable() і inspect.Signature.from_function() тепер викликають inspect.get_annotations() для отримання анотацій. Це означає, що inspect.signature() і inspect.Signature.from_callable() тепер також можуть скасовувати рядкові анотації. (Надано Ларрі Гастінгсом у bpo-43817.)

itertools

Додайте itertools.pairwise(). (Надав Реймонд Геттінгер у bpo-38200.)

лінійний кеш

Якщо модуль не визначає __loader__, поверніться до __spec__.loader. (Надано Бреттом Кенноном у bpo-42133.)

ос

Додайте підтримку os.cpu_count() для VxWorks RTOS. (Надано Peixing Xin у bpo-41440.)

Додайте нову функцію os.eventfd() і відповідні помічники, щоб завершити системний виклик eventfd2 у Linux. (Надав Крістіан Хеймс у bpo-41001.)

Додайте os.splice(), який дозволяє переміщувати дані між двома файловими дескрипторами без копіювання між адресним простором ядра та адресним простором користувача, де один із файлових дескрипторів має посилатися на канал. (Надав Пабло Галіндо в bpo-41625.)

Add O_EVTONLY, O_FSYNC, O_SYMLINK and O_NOFOLLOW_ANY for macOS. (Contributed by Donghee Na in bpo-43106.)

os.path

os.path.realpath() тепер приймає суворий аргумент лише для ключового слова. Якщо встановлено значення True, OSError викликається, якщо шлях не існує або виникає цикл символічного посилання. (Надано Барні Гейлом у bpo-43757.)

pathlib

Add slice support to PurePath.parents. (Contributed by Joshua Cannon in bpo-35498.)

Add negative indexing support to PurePath.parents. (Contributed by Yaroslav Pankovych in bpo-21041.)

Додайте метод Path.hardlink_to, який замінює link_to(). Новий метод має той самий порядок аргументів, що й symlink_to(). (Надано Барні Гейлом у bpo-39950.)

pathlib.Path.stat() і chmod() тепер приймають follow_symlinks лише ключовий аргумент для узгодженості з відповідними функціями в модулі os. (Надано Барні Гейлом у bpo-39906.)

платформа

Add platform.freedesktop_os_release() to retrieve operation system identification from freedesktop.org os-release standard file. (Contributed by Christian Heimes in bpo-28468.)

pprint

pprint.pprint() тепер приймає новий аргумент ключового слова underscore_numbers. (Надав sblondon у bpo-42914.)

pprint тепер може красиво друкувати екземпляри dataclasses.dataclass. (Надано Льюїсом Голом у bpo-43080.)

py_compile

Додайте параметр --quiet до інтерфейсу командного рядка py_compile. (Надав Григорій Шевченко в bpo-38731.)

pyclbr

Add an end_lineno attribute to the Function and Class objects in the tree returned by pyclbr.readmodule() and pyclbr.readmodule_ex(). It matches the existing (start) lineno. (Contributed by Aviral Srivastava in bpo-38307.)

полиця

The shelve module now uses pickle.DEFAULT_PROTOCOL by default instead of pickle protocol 3 when creating shelves. (Contributed by Zackery Spytz in bpo-34204.)

статистика

Додайте covariance(), correlation() Пірсона та прості функції linear_regression(). (Надав Тимотеуш Володзько в bpo-38490.)

сайт

Якщо модуль не визначає __loader__, поверніться до __spec__.loader. (Надано Бреттом Кенноном у bpo-42133.)

гніздо

Виняток socket.timeout тепер є псевдонімом TimeoutError. (Надав Крістіан Хеймс у bpo-42413.)

Додайте параметр для створення сокетів MPTCP за допомогою IPPROTO_MPTCP (надано Rui Cunha в bpo-43571.)

Додайте параметр IP_RECVTOS, щоб отримати тип послуги (ToS) або поля DSCP/ECN (Надано Георгом Саутхоффом у bpo-44077.)

ssl

Модуль ssl вимагає OpenSSL 1.1.1 або новішої версії. (Надав Крістіан Хаймес у PEP 644 і bpo-43669.)

The ssl module has preliminary support for OpenSSL 3.0.0 and new option OP_IGNORE_UNEXPECTED_EOF. (Contributed by Christian Heimes in bpo-38820, bpo-43794, bpo-43788, bpo-43791, bpo-43799, bpo-43920, bpo-43789, and bpo-43811.)

Застаріла функція та використання застарілих констант тепер призводять до DeprecationWarning. ssl.SSSLContext.options має OP_NO_SSLv2 і OP_NO_SSLv3 встановлені за замовчуванням і тому не може попередити про повторне встановлення прапора. У розділі deprecation міститься список застарілих функцій. (Надав Крістіан Хеймс у bpo-43880.)

Модуль ssl тепер має більш безпечні налаштування за замовчуванням. Шифри без прямої секретності або SHA-1 MAC вимкнено за замовчуванням. Рівень безпеки 2 забороняє слабкі ключі RSA, DH і ECC з менш ніж 112 бітами безпеки. SSLContext за умовчанням має мінімальну версію протоколу TLS 1.2. Налаштування засновані на дослідженнях Hynek Schlawack. (Надав Крістіан Хеймс у bpo-43998.)

Застарілі протоколи SSL 3.0, TLS 1.0 і TLS 1.1 більше не підтримуються офіційно. Python не блокує їх активно. Однак параметри збірки OpenSSL, конфігурації дистрибутива, патчі постачальника та набори шифрів можуть перешкодити успішному рукостисканню.

Додайте параметр timeout до функції ssl.get_server_certificate(). (Надав Закері Шпітц у bpo-31870.)

Модуль ssl використовує типи купи та багатофазову ініціалізацію. (Надав Крістіан Хеймс у bpo-42333.)

A new verify flag VERIFY_X509_PARTIAL_CHAIN has been added. (Contributed by l0x in bpo-40849.)

sqlite3

Додайте події аудиту для connect/handle(), enable_load_extension() і load_extension(). (Надав Erlend E. Aasland у bpo-43762.)

система

Додайте атрибут sys.orig_argv: список початкових аргументів командного рядка, переданих у виконуваний файл Python. (Надав Віктор Стіннер у bpo-23427.)

Додайте sys.stdlib_module_names, що містить список імен модулів стандартної бібліотеки. (Надав Віктор Стіннер у bpo-42955.)

_thread

_thread.interrupt_main() now takes an optional signal number to simulate (the default is still signal.SIGINT). (Contributed by Antoine Pitrou in bpo-43356.)

різьблення

Додайте threading.gettrace() і threading.getprofile(), щоб отримати функції, встановлені threading.settrace() і threading.setprofile() відповідно. (Надав Маріо Корчеро в bpo-42251.)

Додайте threading.__excepthook__, щоб дозволити отримати початкове значення threading.excepthook() у випадку, якщо для нього встановлено пошкоджене або інше значення. (Надав Маріо Корчеро в bpo-42308.)

простежити

Функції format_exception(), format_exception_only() і print_exception() тепер можуть приймати об’єкт винятку лише як позиційний аргумент. (Надано Zackery Spytz і Matthias Bussonnier у bpo-26389.)

види

Знову представити класи types.EllipsisType, types.NoneType і types.NotImplementedType, надаючи новий набір типів, які легко інтерпретуються засобами перевірки типів. (Надав Бас ван Бік у bpo-41810.)

введення тексту

Для основних змін див. Нові функції, пов’язані з підказками типу.

Поведінку typing.Literal було змінено, щоб вона відповідала PEP 586 і відповідала поведінці засобів перевірки статичних типів, указаних у PEP.

  1. Літерал тепер усуває дублікати параметрів.

  2. Порівняння рівності між об’єктами Literal тепер не залежить від порядку.

  3. Літеральні порівняння тепер поважають типи. Наприклад, Literal[0] == Literal[False], попередньо оцінене як True. Тепер це False. Для підтримки цієї зміни внутрішній кеш типів тепер підтримує розрізняючі типи.

  4. Об’єкти Literal тепер створюватимуть виняток TypeError під час порівняння рівності, якщо будь-який з їхніх параметрів не hashable. Зауважте, що оголошення Literal з нехешованими параметрами не викличе помилку:

    >>> from typing import Literal
    >>> Literal[{0}]
    >>> Literal[{0}] == Literal[{False}]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'set'
    

(Надав Юрій Карабас у bpo-42345.)

Add new function typing.is_typeddict() to introspect if an annotation is a typing.TypedDict. (Contributed by Patrick Reader in bpo-41792.)

Subclasses of typing.Protocol which only have data variables declared will now raise a TypeError when checked with isinstance unless they are decorated with runtime_checkable(). Previously, these checks passed silently. Users should decorate their subclasses with the runtime_checkable() decorator if they want runtime protocols. (Contributed by Yurii Karabas in bpo-38908.)

Importing from the typing.io and typing.re submodules will now emit DeprecationWarning. These submodules have been deprecated since Python 3.8 and will be removed in a future version of Python. Anything belonging to those submodules should be imported directly from typing instead. (Contributed by Sebastian Rittau in bpo-38291.)

unittest

Додайте новий метод assertNoLogs(), щоб доповнити існуючий assertLogs(). (Надав Кіт Ян Чой у bpo-39385.)

urllib.parse

Версії Python, раніші за Python 3.10, дозволяли використовувати як ;, так і & як роздільники параметрів запиту в urllib.parse.parse_qs() і urllib.parse.parse_qsl(). З міркувань безпеки та для відповідності новим рекомендаціям W3C це було змінено, щоб дозволити лише один роздільний ключ із & за замовчуванням. Ця зміна також впливає на cgi.parse() і cgi.parse_multipart(), оскільки вони використовують уражені функції внутрішньо. Щоб дізнатися більше, перегляньте відповідну документацію. (Надано Адамом Ґолдшмідтом, Сентилом Кумараном і Кеном Джином у bpo-42967.)

The presence of newline or tab characters in parts of a URL allows for some forms of attacks. Following the WHATWG specification that updates RFC 3986, ASCII newline \n, \r and tab \t characters are stripped from the URL by the parser in urllib.parse preventing such attacks. The removal characters are controlled by a new module level variable urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE. (See gh-88048)

xml

Додайте клас LexicalHandler до модуля xml.sax.handler. (Надано Джонатаном Госседжем і Закері Шпітцем у bpo-35018.)

zipimport

Додайте методи, пов’язані з PEP 451: find_spec(), zipimport.zipimporter.create_module() і zipimport.zipimporter.exec_module(). (Надано Бреттом Кенноном у bpo-42131.)

Додайте метод invalidate_caches(). (Надав Десмонд Чеонг у bpo-14678.)

Оптимізації

  • Конструктори str(), bytes() і bytearray() тепер швидші (близько 30–40% для малих об’єктів). (Надав Сергій Сторчака в bpo-41334.)

  • Модуль runpy тепер імпортує менше модулів. Час запуску команди python3 -m назва модуля в середньому в 1,4 рази швидший. У Linux python3 -I -m назва-модуля імпортує 69 модулів у Python 3.9, тоді як у Python 3.10 він імпортує лише 51 модуль (-18). (Надав Віктор Стіннер у bpo-41006 і bpo-41718.)

  • Інструкція LOAD_ATTR тепер використовує новий механізм «кешу коду операції». Це приблизно на 36% швидше для звичайних атрибутів і на 44% швидше для слотів. (Надано Пабло Галіндо та Юрієм Селівановим у bpo-42093 та Гвідо ван Россумом у bpo-42927, на основі ідей, спочатку реалізованих у PyPy та MicroPython.)

  • Під час створення Python за допомогою --enable-optimizations тепер -fno-semantic-interposition додається до рядка компіляції та посилання. Це прискорює збірки інтерпретатора Python, створеного за допомогою --enable-shared з gcc, до 30%. Перегляньте цю статтю для отримання додаткової інформації. (Надано Віктором Стіннером і Пабло Галіндо в bpo-38980.)

  • Використовуйте новий код керування вихідним буфером для модулів bz2 / lzma / zlib і додайте функцію .readall() до класу _compression.DecompressReader . Декомпресія bz2 тепер швидша в 1,09x ~ 1,17x, декомпресія lzma — у 1,20x ~ 1,32x, GzipFile.read(-1) — у 1,11x ~ 1,18x швидше. (Надав Ма Лін, рецензував Грегорі П. Сміт, у bpo-41486)

  • When using stringized annotations, annotations dicts for functions are no longer created when the function is created. Instead, they are stored as a tuple of strings, and the function object lazily converts this into the annotations dict on demand. This optimization cuts the CPU time needed to define an annotated function by half. (Contributed by Yurii Karabas and Inada Naoki in bpo-42202.)

  • Функції пошуку підрядків, такі як str1 in str2 і str2.find(str1), тепер іноді використовують «двосторонній» алгоритм пошуку рядків Crochemore & Perrin, щоб уникнути квадратичної поведінки довгих рядків. (Надав Денніс Суїні в bpo-41972)

  • Add micro-optimizations to _PyType_Lookup() to improve type attribute cache lookup performance in the common case of cache hits. This makes the interpreter 1.04 times faster on average. (Contributed by Dino Viehland in bpo-43452.)

  • The following built-in functions now support the faster PEP 590 vectorcall calling convention: map(), filter(), reversed(), bool() and float(). (Contributed by Donghee Na and Jeroen Demeyer in bpo-43575, bpo-43287, bpo-41922, bpo-41873 and bpo-41870.)

  • BZ2File performance is improved by removing internal RLock. This makes BZ2File thread unsafe in the face of multiple simultaneous readers or writers, just like its equivalent classes in gzip and lzma have always been. (Contributed by Inada Naoki in bpo-43785.)

Застаріле

Видалено

  • Видалено спеціальні методи __int__, __float__, __floordiv__, __mod__, __divmod__, __rfloordiv__, __rmod__ та __rdivmod__ класу complex. Вони завжди викликали TypeError. (Надав Сергій Сторчака в bpo-41974.)

  • Метод ParserBase.error() із приватного та недокументованого модуля _markupbase видалено. html.parser.HTMLParser є єдиним підкласом ParserBase, і його реалізацію error() уже було видалено в Python 3.5. (Надано Berker Peksag у bpo-31844.)

  • Видалено атрибут unicodedata.ucnhash_CAPI, який був внутрішнім об’єктом PyCapsule. Відповідну приватну структуру _PyUnicode_Name_CAPI було переміщено до внутрішнього C API. (Надав Віктор Стіннер у bpo-42157.)

  • Видалено модуль парсер, який був застарілим у версії 3.9 через перехід на новий синтаксичний аналізатор PEG, а також усі вихідні файли C і файли заголовків, які використовувалися лише старим парсером, включаючи node.h ``, ``parser.h, graminit.h і grammar.h.

  • Видалено публічні функції API C PyParser_SimpleParseStringFlags, PyParser_SimpleParseStringFlagsFilename, Parser_SimpleParseFileFlags і PyNode_Compile, які були застарілими в 3.9 через перехід на новий аналізатор PEG.

  • Removed the formatter module, which was deprecated in Python 3.4. It is somewhat obsolete, little used, and not tested. It was originally scheduled to be removed in Python 3.6, but such removals were delayed until after Python 2.7 EOL. Existing users should copy whatever classes they use into their code. (Contributed by Donghee Na and Terry J. Reedy in bpo-42299.)

  • Removed the PyModule_GetWarningsModule() function that was useless now due to the _warnings module was converted to a builtin module in 2.6. (Contributed by Hai Shi in bpo-42599.)

  • Видаліть застарілі псевдоніми для Collections Abstract Base Classes з модуля collections. (Надав Віктор Стіннер у bpo-37324.)

  • Параметр loop було видалено з більшості asyncioвисокорівневого API після застарілої версії Python 3.8. Мотивація цієї зміни багатогранна:

    1. Це спрощує API високого рівня.

    2. Починаючи з Python 3.7, функції високорівневого API неявно отримують поточний цикл подій поточного потоку. У більшості звичайних випадків використання циклу подій до API не потрібно передавати.

    3. Передача циклу подій схильна до помилок, особливо коли йдеться про цикли, що виконуються в різних потоках.

    Зауважте, що API низького рівня все одно прийматиме цикл. Перегляньте Зміни в API Python приклади того, як замінити існуючий код.

    (Надано Юрієм Карабасом, Ендрю Свєтловим, Юрієм Селівановим і Кайлом Стенлі в bpo-42392.)

Перенесення на Python 3.10

У цьому розділі наведено описані раніше зміни та інші виправлення помилок, які можуть потребувати змін у вашому коді.

Зміни в синтаксисі Python

  • Deprecation warning is now emitted when compiling previously valid syntax if the numeric literal is immediately followed by a keyword (like in 0in x). In future releases it will be changed to syntax warning, and finally to a syntax error. To get rid of the warning and make the code compatible with future releases just add a space between the numeric literal and the following keyword. (Contributed by Serhiy Storchaka in bpo-43833.)

Зміни в API Python

  • Параметри etype функцій format_exception(), format_exception_only() і print_exception() у модулі traceback перейменовано до exc. (Надано Zackery Spytz і Matthias Bussonnier у bpo-26389.)

  • atexit: під час виходу з Python, якщо зворотний виклик, зареєстрований за допомогою atexit.register(), не вдається, його виняткова ситуація тепер реєструється. Раніше реєструвалися лише деякі винятки, а останній виняток завжди мовчки ігнорувався. (Надав Віктор Стіннер у bpo-42639.)

  • collections.abc.Callable generic тепер зводить параметри типу, подібно до того, що зараз робить typing.Callable. Це означає, що collections.abc.Callable[[int, str], str] матиме __args__ (int, str, str); раніше це було ([int, str], str). Код, який отримує доступ до аргументів через typing.get_args() або __args__, повинен враховувати цю зміну. Крім того, помилка TypeError може виникнути через неприпустимі форми параметризації collections.abc.Callable, які могли пройти мовчки в Python 3.9. (Надав Кен Джин у bpo-42195.)

  • socket.htons() і socket.ntohs() тепер викликають OverflowError замість DeprecationWarning, якщо заданий параметр не вміщується в 16-бітне ціле число без знаку. (Надав Erlend E. Aasland у bpo-42393.)

  • Параметр loop було видалено з більшості asyncioвисокорівневого API після застарілої версії Python 3.8.

    Співпрограма, яка зараз виглядає так:

    async def foo(loop):
        await asyncio.sleep(1, loop=loop)
    

    Слід замінити на це:

    async def foo():
        await asyncio.sleep(1)
    

    Якщо foo() був спеціально розроблений не для виконання в поточному циклі подій поточного потоку (наприклад, у циклі подій іншого потоку), подумайте про використання замість нього asyncio.run_coroutine_threadsafe().

    (Надано Юрієм Карабасом, Ендрю Свєтловим, Юрієм Селівановим і Кайлом Стенлі в bpo-42392.)

  • Конструктор types.FunctionType тепер успадковує поточні вбудовані елементи, якщо словник globals не має ключа "__builtins__", а не використовує {"None": None} як вбудовані елементи: те саме як функції eval() і exec(). Визначення функції за допомогою def function(...): ... у Python не впливає, глобальні значення не можна перевизначити за допомогою цього синтаксису: він також успадковує поточні вбудовані компоненти. (Надав Віктор Стіннер у bpo-42990.)

Зміни в C API

  • Функції C API Parser_SimpleParseStringFlags, PyParser_SimpleParseStringFlagsFilename, Parser_SimpleParseFileFlags, PyNode_Compile і тип, який використовується цими функціями, struct _node, були видалені через перехід до новий аналізатор PEG.

    Початковий код тепер має бути скомпільований безпосередньо в об’єкт коду за допомогою, наприклад, Py_CompileString(). Потім отриманий об’єкт коду можна оцінити за допомогою, наприклад, PyEval_EvalCode().

    зокрема:

    • Виклик Parser_SimpleParseStringFlags з наступним PyNode_Compile можна замінити викликом Py_CompileString().

    • Немає прямої заміни для PyParser_SimpleParseFileFlags. Щоб скомпілювати код із аргументу FILE *, вам потрібно буде прочитати файл на C і передати отриманий буфер до Py_CompileString().

    • Щоб скомпілювати файл із назвою char *, явно відкрийте файл, прочитайте його та скомпілюйте результат. Одним із способів зробити це є використання модуля io з PyImport_ImportModule(), PyObject_CallMethod(), PyBytes_AsString() і Py_CompileString(), як показано нижче. (Оголошення та обробка помилок опущено.)

      io_module = Import_ImportModule("io");
      fileobject = PyObject_CallMethod(io_module, "open", "ss", filename, "rb");
      source_bytes_object = PyObject_CallMethod(fileobject, "read", "");
      result = PyObject_CallMethod(fileobject, "close", "");
      source_buf = PyBytes_AsString(source_bytes_object);
      code = Py_CompileString(source_buf, filename, Py_file_input);
      
    • For FrameObject objects, the f_lasti member now represents a wordcode offset instead of a simple offset into the bytecode string. This means that this number needs to be multiplied by 2 to be used with APIs that expect a byte offset instead (like PyCode_Addr2Line() for example). Notice as well that the f_lasti member of FrameObject objects is not considered stable: please use PyFrame_GetLineNumber() instead.

Зміни байт-коду CPython

  • The MAKE_FUNCTION instruction now accepts either a dict or a tuple of strings as the function’s annotations. (Contributed by Yurii Karabas and Inada Naoki in bpo-42202.)

Зміни збірки

  • PEP 644: Python тепер вимагає OpenSSL 1.1.1 або новішої версії. OpenSSL 1.0.2 більше не підтримується. (Надав Крістіан Хеймс у bpo-43669.)

  • Функції C99 snprintf() і vsnprintf() тепер потрібні для створення Python. (Надав Віктор Стіннер у bpo-36020.)

  • sqlite3 вимагає SQLite 3.7.15 або новішої версії. (Надано Сергієм Федосєєвим та Ерлендом Е. Асландом у bpo-40744 та bpo-40810.)

  • Модуль atexit тепер завжди має створюватися як вбудований модуль. (Надав Віктор Стіннер у bpo-42639.)

  • Додайте параметр --disable-test-modules до сценарію configure: не створюйте та не встановлюйте тестові модулі. (Надано Ксав’є де Гає, Томасом Петаццоні та Пейсін Сінь у bpo-27640.)

  • Додайте параметр --with-wheel-pkg-dir=PATH до сценарію ./configure. Якщо вказано, модуль ensurepip шукає пакети коліс setuptools і pip у цьому каталозі: якщо обидва присутні, ці пакунки колеса використовуються замість пакетів колес гарантійpip.

    Деякі політики упаковки дистрибутивів Linux рекомендують не об’єднувати залежності. Наприклад, Fedora встановлює пакети коліс у каталог /usr/share/python-wheels/ і не встановлює пакет ensurepip._bundled.

    (Надав Віктор Стіннер у bpo-42856.)

  • Додайте нову опцію configure --without-static-libpython, щоб не створювати статичну бібліотеку libpythonMAJOR.MINOR.a і не встановлювати об’єктний файл python.o.

    (Надав Віктор Стіннер у bpo-43103.)

  • The configure script now uses the pkg-config utility, if available, to detect the location of Tcl/Tk headers and libraries. As before, those locations can be explicitly specified with the --with-tcltk-includes and --with-tcltk-libs configuration options. (Contributed by Manolis Stamatogiannakis in bpo-42603.)

  • Додайте параметр --with-openssl-rpath до сценарію configure. Цей параметр спрощує створення Python за допомогою індивідуальної інсталяції OpenSSL, наприклад. ./configure --with-openssl=/path/to/openssl --with-openssl-rpath=auto. (Надав Крістіан Хеймс у bpo-43466.)

Зміни C API

PEP 652: Підтримка стабільного ABI

Стабільний ABI (двійковий інтерфейс програми) для модулів розширення або вбудовування Python тепер визначено явно. Стабільність C API описує гарантії стабільності C API та ABI разом із найкращими методами використання стабільного ABI.

(Надав Петр Вікторін у PEP 652 і bpo-43795.)

Нові можливості

  • Результат PyNumber_Index() тепер завжди має точний тип int. Раніше результат міг бути екземпляром підкласу int. (Надав Сергій Сторчака в bpo-40792.)

  • Додайте новий член orig_argv до структури PyConfig: список оригінальних аргументів командного рядка, переданих у виконуваний файл Python. (Надав Віктор Стіннер у bpo-23427.)

  • Додано макроси PyDateTime_DATE_GET_TZINFO() і PyDateTime_TIME_GET_TZINFO() для доступу до атрибутів tzinfo об’єктів datetime.datetime і datetime.time . (Надав Закері Шпітц у bpo-30155.)

  • Додайте функцію PyCodec_Unregister(), щоб скасувати реєстрацію функції пошуку кодеків. (Надав Хай Ши в bpo-41842.)

  • Функцію PyIter_Send() було додано, щоб дозволити надсилати значення в ітератор без виклику винятку StopIteration. (Надав Володимир Матвєєв у bpo-41756.)

  • Додайте PyUnicode_AsUTF8AndSize() до обмеженого C API. (Надав Алекс Гейнор у bpo-41784.)

  • Додайте функцію PyModule_AddObjectRef(): схожу на PyModule_AddObject(), але не викрадайте посилання на значення в разі успіху. (Надав Віктор Стіннер у bpo-1635741.)

  • Додайте функції Py_NewRef() і Py_XNewRef(), щоб збільшити кількість посилань на об’єкт і повернути об’єкт. (Надав Віктор Стіннер у bpo-42262.)

  • Функції PyType_FromSpecWithBases() і PyType_FromModuleAndSpec() тепер приймають один клас як аргумент bases. (Надав Сергій Сторчака в bpo-42423.)

  • Функція PyType_FromModuleAndSpec() тепер приймає NULL слот tp_doc. (Надав Хай Ши в bpo-41832.)

  • Функція PyType_GetSlot() може приймати статичні типи. (Надано Хай Ши та Петром Вікторіним у bpo-41073.)

  • Додайте нову функцію PySet_CheckExact() до C-API, щоб перевірити, чи є об’єкт екземпляром set, але не екземпляром підтипу. (Надав Пабло Галіндо в bpo-43277.)

  • Додайте PyErr_SetInterruptEx(), який дозволяє передавати номер сигналу для моделювання. (Надав Антуан Пітру в bpo-43356.)

  • Обмежений C API тепер підтримується, якщо Python зібрано в режимі налагодження (якщо визначено макрос Py_DEBUG). В обмеженому API C функції Py_INCREF() і Py_DECREF() тепер реалізовано як непрозорі виклики функцій, а не звертаються безпосередньо до члена PyObject.ob_refcnt, якщо Python створено в режимі налагодження, а макрос Py_LIMITED_API націлений на Python 3.10 або новішу версію. Стало можливим підтримувати обмежений C API у режимі налагодження, оскільки структура PyObject є однаковою в режимі випуску та налагодження, починаючи з Python 3.8 (див. bpo-36465).

    Обмежений C API досі не підтримується у спеціальній збірці --with-trace-refs (макрос Py_TRACE_REFS). (Надав Віктор Стіннер у bpo-43688.)

  • Додайте функцію Py_Is(x, y), щоб перевірити, чи є об’єкт x об’єктом y, так само, як x is y у Python. Додайте також функції Py_IsNone(), Py_IsTrue(), Py_IsFalse(), щоб перевірити, чи є об’єкт відповідно синглетом None, True singleton або False singleton. (Надав Віктор Стіннер у bpo-43753.)

  • Додайте нові функції для керування збирачем сміття з коду C: PyGC_Enable(), PyGC_Disable(), PyGC_IsEnabled(). Ці функції дозволяють активувати, деактивувати та запитувати стан збирача сміття з коду C без необхідності імпортувати модуль gc.

  • Add a new Py_TPFLAGS_DISALLOW_INSTANTIATION type flag to disallow creating type instances. (Contributed by Victor Stinner in bpo-43916.)

  • Add a new Py_TPFLAGS_IMMUTABLETYPE type flag for creating immutable type objects: type attributes cannot be set nor deleted. (Contributed by Victor Stinner and Erlend E. Aasland in bpo-43908.)

Перенесення на Python 3.10

  • The PY_SSIZE_T_CLEAN macro must now be defined to use PyArg_ParseTuple() and Py_BuildValue() formats which use #: es#, et#, s#, u#, y#, z#, U# and Z#. See Розбір аргументів і створення значень and PEP 353. (Contributed by Victor Stinner in bpo-40943.)

  • Оскільки Py_REFCNT() змінено на вбудовану статичну функцію, Py_REFCNT(obj) = new_refcnt потрібно замінити на Py_SET_REFCNT(obj, new_refcnt): див. Py_SET_REFCNT() (доступний з Python 3.9). Для зворотної сумісності можна використовувати цей макрос:

    #if PY_VERSION_HEX < 0x030900A4
    #  define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0)
    #endif
    

    (Надав Віктор Стіннер у bpo-39573.)

  • Виклик PyDict_GetItem() без утримання GIL був дозволений з історичних причин. Це більше не дозволено. (Надав Віктор Стіннер у bpo-40839.)

  • PyUnicode_FromUnicode(NULL, розмір) і PyUnicode_FromStringAndSize(NULL, розмір) викликають DeprecationWarning зараз. Використовуйте PyUnicode_New(), щоб виділити об’єкт Unicode без початкових даних. (Надано Інадою Наокі в bpo-36346.)

  • Приватну структуру _PyUnicode_Name_CAPI API PyCapsule unicodedata.ucnhash_CAPI було переміщено до внутрішнього API C. (Надав Віктор Стіннер у bpo-42157.)

  • Py_GetPath(), Py_GetPrefix(), Py_GetExecPrefix(), Py_GetProgramFullPath(), Py_GetPythonHome() and Py_GetProgramName() functions now return NULL if called before Py_Initialize() (before Python is initialized). Use the new Конфігурація ініціалізації Python API to get the Конфігурація шляху Python. (Contributed by Victor Stinner in bpo-42260.)

  • Макроси PyList_SET_ITEM(), PyTuple_SET_ITEM() і PyCell_SET() більше не можна використовувати як l-значення або r-значення. Наприклад, x = PyList_SET_ITEM(a, b, c) і PyList_SET_ITEM(a, b, c) = x тепер не вдаються з помилкою компілятора. Це запобігає помилкам, таким як if (PyList_SET_ITEM (a, b, c) < 0) ... тест. (Надано Zackery Spytz і Victor Stinner у bpo-30459.)

  • The non-limited API files odictobject.h, parser_interface.h, picklebufobject.h, pyarena.h, pyctype.h, pydebug.h, pyfpe.h, and pytime.h have been moved to the Include/cpython directory. These files must not be included directly, as they are already included in Python.h; see Включати файли. If they have been included directly, consider including Python.h instead. (Contributed by Nicholas Sim in bpo-35134.)

  • Use the Py_TPFLAGS_IMMUTABLETYPE type flag to create immutable type objects. Do not rely on Py_TPFLAGS_HEAPTYPE to decide if a type object is mutable or not; check if Py_TPFLAGS_IMMUTABLETYPE is set instead. (Contributed by Victor Stinner and Erlend E. Aasland in bpo-43908.)

  • The undocumented function Py_FrozenMain has been removed from the limited API. The function is mainly useful for custom builds of Python. (Contributed by Petr Viktorin in bpo-26241.)

Застаріле

  • Функція PyUnicode_InternImmortal() тепер застаріла та буде видалена в Python 3.12: замість неї використовуйте PyUnicode_InternInPlace(). (Надав Віктор Стіннер у bpo-41692.)

Видалено

  • Видалено функції Py_UNICODE_str*, які маніпулюють рядками Py_UNICODE*. (Надано Інадою Наокі в bpo-41123.)

  • Видалено PyUnicode_GetMax(). Будь ласка, перейдіть на нові (PEP 393) API. (Надано Інадою Наокі в bpo-41103.)

  • Видалено PyLong_FromUnicode(). Будь ласка, перейдіть до PyLong_FromUnicodeObject(). (Надано Інадою Наокі в bpo-41103.)

  • Видалено PyUnicode_AsUnicodeCopy(). Будь ласка, використовуйте PyUnicode_AsUCS4Copy() або PyUnicode_AsWideCharString() (Надано Інадою Наокі в bpo-41103.)

  • Видалено змінну _Py_CheckRecursionLimit: її було замінено ceval.recursion_limit структури PyInterpreterState. (Надав Віктор Стіннер у bpo-41834.)

  • Видалено недокументовані макроси Py_ALLOW_RECURSION і Py_END_ALLOW_RECURSION, а також поле recursion_critical структури PyInterpreterState. (Надав Сергій Сторчака в bpo-41936.)

  • Видалено недокументовану функцію PyOS_InitInterrupts(). Ініціалізація Python вже неявно встановлює обробники сигналів: див. PyConfig.install_signal_handlers. (Надав Віктор Стіннер у bpo-41713.)

  • Видаліть функцію PyAST_Validate(). Більше неможливо створити об’єкт AST (тип mod_ty) за допомогою загальнодоступного C API. Функцію вже було виключено з обмеженого C API (PEP 384). (Надав Віктор Стіннер у bpo-43244.)

  • Видаліть файл заголовка symtable.h і недокументовані функції:

    • PyST_GetScope()

    • PySymtable_Build()

    • PySymtable_BuildObject()

    • PySymtable_Free()

    • Py_SymtableString()

    • Py_SymtableStringObject()

    Функція Py_SymtableString() була частиною стабільного ABI помилково, але її не можна було використовувати, оскільки файл заголовка symtable.h було виключено з обмеженого C API.

    Натомість використовуйте модуль Python symtable. (Надав Віктор Стіннер у bpo-43244.)

  • Видаліть PyOS_ReadlineFunctionPointer() з обмежених заголовків C API і з python3.dll, бібліотеки, яка забезпечує стабільний ABI у Windows. Оскільки функція приймає аргумент FILE*, її стабільність ABI не може бути гарантована. (Надав Петро Вікторін у bpo-43868.)

  • Видаліть файли заголовків ast.h, asdl.h і Python-ast.h. Ці функції були недокументовані та виключені з обмеженого C API. Більшість імен, визначених цими файлами заголовків, не мали префікса Py і тому могли спричиняти конфлікти імен. Наприклад, Python-ast.h визначив макрос Yield, який конфліктував з назвою Yield, що використовується заголовком Windows <winbase.h>. Натомість використовуйте модуль Python ast. (Надав Віктор Стіннер у bpo-43244.)

  • Видаліть функції компілятора та аналізатора за допомогою типу struct _mod, оскільки загальнодоступний API AST C було видалено:

    • PyAST_Compile()

    • PyAST_CompileEx()

    • PyAST_CompileObject()

    • PyFuture_FromAST()

    • PyFuture_FromASTObject()

    • PyParser_ASTFromFile()

    • PyParser_ASTFromFileObject()

    • PyParser_ASTFromFilename()

    • PyParser_ASTFromString()

    • PyParser_ASTFromStringObject()

    Ці функції були недокументовані та виключені з обмеженого C API. (Надав Віктор Стіннер у bpo-43244.)

  • Видаліть заголовний файл pyarena.h із функціями:

    • PyArena_New()

    • PyArena_Free()

    • PyArena_Malloc()

    • PyArena_AddPyObject()

    Ці функції були незадокументовані, виключені з обмеженого API C і використовувалися лише внутрішньо компілятором. (Надав Віктор Стіннер у bpo-43244.)

  • Для оптимізації Python було видалено член PyThreadState.use_tracing. (Надав Марк Шеннон у bpo-43760.)

Notable security feature in 3.10.7

Converting between int and str in bases other than 2 (binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal) now raises a ValueError if the number of digits in string form is above a limit to avoid potential denial of service attacks due to the algorithmic complexity. This is a mitigation for CVE-2020-10735. This limit can be configured or disabled by environment variable, command line flag, or sys APIs. See the integer string conversion length limitation documentation. The default limit is 4300 digits in string form.

Notable security feature in 3.10.8

The deprecated mailcap module now refuses to inject unsafe text (filenames, MIME types, parameters) into shell commands. Instead of using such text, it will warn and act as if a match was not found (or for test commands, as if the test failed). (Contributed by Petr Viktorin in gh-98966.)

Notable changes in 3.10.12

tarfile

  • The extraction methods in tarfile, and shutil.unpack_archive(), have a new a filter argument that allows limiting tar features than may be surprising or dangerous, such as creating files outside the destination directory. See Extraction filters for details. In Python 3.12, use without the filter argument will show a DeprecationWarning. In Python 3.14, the default will switch to 'data'. (Contributed by Petr Viktorin in PEP 706.)