> **Источник:** https://python-all.ru/3.13/whatsnew/3.10.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# Что нового в Python 3.10

**Редактор:**

Pablo Galindo Salgado

В этой статье описаны новые возможности Python 3.10 по сравнению с 3.9. Python 3.10 был выпущен 4 октября 2021 года. Полную информацию см. в [журнале изменений](https://python-all.ru/3.13/whatsnew/changelog.html#changelog).

## Итоги – основные изменения

Новые синтаксические возможности:

- [**PEP 634**](https://python-all.ru/3.13/whatsnew/3.10.html), Структурное сопоставление с образцом: спецификация
- [**PEP 635**](https://python-all.ru/3.13/whatsnew/3.10.html), Структурное сопоставление с образцом: мотивация и обоснование
- [**PEP 636**](https://python-all.ru/3.13/whatsnew/3.10.html), Структурное сопоставление с образцом: руководство
- [bpo-12782](https://python-all.ru/3.13/whatsnew/3.10.html), теперь официально разрешены контекстные менеджеры в скобках.

Новые возможности в стандартной библиотеке:

- [**PEP 618**](https://python-all.ru/3.13/whatsnew/3.10.html), добавление опциональной проверки длины в zip.

Улучшения интерпретатора:

- [**PEP 626**](https://python-all.ru/3.13/whatsnew/3.10.html), точные номера строк для отладки и других инструментов.

Новые возможности типизации:

- [**PEP 604**](https://python-all.ru/3.13/whatsnew/3.10.html), разрешение записи объединённых типов как X | Y
- [**PEP 612**](https://python-all.ru/3.13/whatsnew/3.10.html), переменные спецификации параметров
- [**PEP 613**](https://python-all.ru/3.13/whatsnew/3.10.html), явные псевдонимы типов
- [**PEP 647**](https://python-all.ru/3.13/whatsnew/3.10.html), пользовательские гарды типов

Важные устаревания, удаления и ограничения:

- [**PEP 644**](https://python-all.ru/3.13/whatsnew/3.10.html), требуется OpenSSL 1.1.1 или новее
- [**PEP 632**](https://python-all.ru/3.13/whatsnew/3.10.html), устаревание модуля distutils.
- [**PEP 623**](https://python-all.ru/3.13/whatsnew/3.10.html), устаревание и подготовка к удалению элемента wstr в PyUnicodeObject.
- [**PEP 624**](https://python-all.ru/3.13/whatsnew/3.10.html), удаление API кодировщиков Py\_UNICODE
- [**PEP 597**](https://python-all.ru/3.13/whatsnew/3.10.html), добавление опционального EncodingWarning

## Новые возможности

### Контекстные менеджеры в скобках

Теперь поддерживается использование круглых скобок для переноса на несколько строк в контекстных менеджерах. Это позволяет форматировать длинный набор контекстных менеджеров на нескольких строках аналогично тому, как это было возможно ранее с операторами import. Например, все эти примеры теперь являются допустимыми:

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

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

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

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

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

также можно использовать завершающую запятую в конце заключённой группы:

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

Этот новый синтаксис использует не LL(1) возможности нового парсера. Подробнее см. [**PEP 617**](https://python-all.ru/3.13/whatsnew/3.10.html).

(Авторы: Guido van Rossum, Pablo Galindo и Lysandros Nikolaou в [bpo-12782](https://python-all.ru/3.13/whatsnew/3.10.html) и [bpo-40334](https://python-all.ru/3.13/whatsnew/3.10.html).)

### Улучшенные сообщения об ошибках

#### SyntaxErrors

При разборе кода, содержащего незакрытые скобки или квадратные скобки, интерпретатор теперь указывает местоположение незакрытой скобки вместо отображения *SyntaxError: unexpected EOF while parsing* или указания на некорректное местоположение. Например, рассмотрим следующий код (обратите внимание на незакрытую ‘{‘):

```python
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()
```

Предыдущие версии интерпретатора сообщали о запутанных местах как о местоположении синтаксической ошибки:

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

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

```python
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.

(Авторы: Pablo Galindo в [bpo-42864](https://python-all.ru/3.13/whatsnew/3.10.html) и Batuhan Taskaya в [bpo-40176](https://python-all.ru/3.13/whatsnew/3.10.html).)

[`SyntaxError`](https://python-all.ru/3.13/library/exceptions.html#SyntaxError) исключения, вызываемые интерпретатором, теперь будут подсвечивать полный диапазон выражения, которое составляет саму синтаксическую ошибку, а не только место, где обнаружена проблема. Таким образом, вместо отображения (до Python 3.10):

```python
>>> 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 будет отображать исключение как:

```python
>>> 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](https://python-all.ru/3.13/whatsnew/3.10.html).

Добавлено значительное количество новых специализированных сообщений для исключений [`SyntaxError`](https://python-all.ru/3.13/library/exceptions.html#SyntaxError). Наиболее примечательные из них:

- Пропущен `:` перед блоками:

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

  (Предложено Пабло Галиндо в [bpo-42997](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Кортежи без скобок в целях (targets) генераторов:

  ```python
  >>> {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?
  ```

  (Предложено Пабло Галиндо в [bpo-43017](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Отсутствуют запятые в литералах коллекций и между выражениями:

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

  (Предложено Пабло Галиндо в [bpo-43822](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Несколько типов исключений без скобок:

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

  (Предложено Пабло Галиндо в [bpo-43149](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Отсутствуют `:` и значения в литералах словарей:

  ```python
  >>> 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
  ```

  (Предложено Пабло Галиндо в [bpo-43823](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Блоки `try` без блоков `except` или `finally`:

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

  (Предложено Пабло Галиндо в [bpo-44305](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Использование `=` вместо `==` в сравнениях:

  ```python
  >>> 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 '='?
  ```

  (Предложено Пабло Галиндо в [bpo-43797](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Использование `*` в f-строках:

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

  (Предложено Пабло Галиндо в [bpo-41064](https://python-all.ru/3.13/whatsnew/3.10.html).)

#### IndentationErrors

Многие исключения [`IndentationError`](https://python-all.ru/3.13/library/exceptions.html#IndentationError) теперь содержат больше контекста о том, какой блок ожидал отступа, включая местоположение инструкции:

```python
>>> 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`](https://python-all.ru/3.13/library/exceptions.html#AttributeError), `PyErr_Display()` будет предлагать имена похожих атрибутов в объекте, в котором возникло исключение:

```python
>>> 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](https://python-all.ru/3.13/whatsnew/3.10.html).)

> **Предупреждение**
>
> Обратите внимание: это не будет работать, если `PyErr_Display()` не вызывается для отображения ошибки что может произойти, если используется другая пользовательская функция отображения ошибок. Это обычная ситуация в некоторых интерактивных оболочках, например IPython.

#### NameErrors

При выводе [`NameError`](https://python-all.ru/3.13/library/exceptions.html#NameError), вызванного интерпретатором, `PyErr_Display()` будет предлагать имена похожих переменных в функции, в которой возникло исключение:

```python
>>> 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](https://python-all.ru/3.13/whatsnew/3.10.html).)

> **Предупреждение**
>
> Обратите внимание: это не будет работать, если `PyErr_Display()` не вызывается для отображения ошибки, что может произойти, если используется другая пользовательская функция отображения ошибок. Это обычная ситуация в некоторых интерактивных оболочках, например IPython.

### PEP 626: Точные номера строк для отладки и других инструментов

PEP 626 привносит более точные и надёжные номера строк для инструментов отладки, профилирования и покрытия кода. События трассировки с правильным номером строки генерируются для всех выполняемых строк кода и только для выполняемых строк кода.

Атрибут [`f_lineno`](https://python-all.ru/3.13/reference/datamodel.html#frame.f_lineno) объектов фреймов всегда будет содержать ожидаемый номер строки.

Атрибут [`co_lnotab`](https://python-all.ru/3.13/reference/datamodel.html#codeobject.co_lnotab) [объектов кода](https://python-all.ru/3.13/reference/datamodel.html#code-objects) устарел и будет удалён в версии 3.12. Коду, которому необходимо преобразовывать смещение в номер строки, следует использовать новый метод [`co_lines()`](https://python-all.ru/3.13/reference/datamodel.html#codeobject.co_lines).

### PEP 634: Структурное сопоставление с образцом

Структурное сопоставление с образцом было добавлено в виде *оператора match* и *операторов case* с шаблонами и связанными с ними действиями. Шаблоны состоят из последовательностей, отображений, примитивных типов данных, а также экземпляров классов. Сопоставление с образцом позволяет программам извлекать информацию из сложных типов данных, выполнять ветвление на основе структуры данных и применять конкретные действия в зависимости от формы данных.

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

Общий синтаксис сопоставления с образцом:

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

Оператор match принимает выражение и сравнивает его значение с последовательными шаблонами, заданными в виде одного или нескольких блоков case. В частности, сопоставление с образцом работает следующим образом:

1. используя данные с типом и формой (`subject`)
2. вычисляя `subject` в операторе `match`
3. сравнивая проверяемое значение с каждым шаблоном в операторе `case` сверху вниз до подтверждения совпадения.
4. выполняя действие, связанное с шаблоном подтверждённого совпадения
5. Если точное совпадение не подтверждено, последний оператор case, универсальный шаблон `_`, если он предусмотрен, будет использован как совпадающий. Если точное совпадение не подтверждено и универсальный шаблон отсутствует, весь блок match ничего не делает (no-op).

#### Декларативный подход

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

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

Хотя «императивный» набор инструкций с вложенными операторами «if» можно использовать для достижения чего-то похожего на структурное сопоставление с образцом, он менее понятен, чем «декларативный» подход. Вместо этого «декларативный» подход задаёт условия для совпадения и более читаем благодаря явным шаблонам. Хотя структурное сопоставление с образцом можно использовать в его простейшей форме – сравнение переменной с литералом в операторе case, его истинная ценность для Python заключается в обработке типа и формы проверяемого значения.

#### Простой шаблон: сопоставление с литералом

Рассмотрим этот пример как сопоставление с образцом в его простейшей форме: значение (проверяемое выражение) сопоставляется с несколькими литералами (шаблонами). В примере ниже `status` является проверяемым выражением оператора match. Шаблонами являются каждый из операторов case, где литералы представляют коды статуса запроса. Связанное с оператором case действие выполняется после совпадения:

```python
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"
```

Если в указанную выше функцию передано `status` со значением 418, возвращается «I’m a teapot». Если передано `status` со значением 500, оператор case с `_` совпадёт как универсальный шаблон, и будет возвращено «Something’s wrong with the internet». Обратите внимание на последний блок: имя переменной `_` действует как *универсальный шаблон* и гарантирует, что проверяемое значение всегда совпадёт. Использование `_` необязательно.

Можно объединить несколько литералов в одном шаблоне с помощью `|` («или»):

```python
case 401 | 403 | 404:
    return "Not allowed"
```

##### Поведение без универсального шаблона

Если изменить предыдущий пример, удалив последний блок case, пример станет таким:

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

Без использования `_` в операторе case совпадения может не быть. Если совпадения нет, поведение – пустая операция (no-op). Например, если передано `status` со значением 500, ничего не происходит.

#### Шаблоны с литералом и переменной

Шаблоны могут выглядеть как распаковка в присваивании, и шаблон может использоваться для связывания переменных. В этом примере точка данных может быть распакована на её x-координату и y-координату:

```python
# point – это кортеж (x, y)
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)`, и может рассматриваться как расширение шаблона-литерала, показанного выше. Следующие два шаблона объединяют литерал и переменную, и переменная *связывает* значение из проверяемого выражения (`point`). Четвёртый шаблон захватывает два значения, что делает его концептуально похожим на распаковывающее присваивание `(x, y) = point`.

#### Шаблоны и классы

Если вы используете классы для структурирования данных, вы можете использовать в качестве шаблона имя класса, за которым следует список аргументов, напоминающий конструктор. Этот шаблон позволяет захватывать атрибуты экземпляра в переменные:

```python
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

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")
```

##### Шаблоны с позиционными параметрами

Вы можете использовать позиционные параметры с некоторыми встроенными классами, которые предоставляют упорядочивание для своих атрибутов (например, dataclasses). Вы также можете определить конкретную позицию для атрибутов в шаблонах, задав специальный атрибут `__match_args__` в своих классах. Если он установлен в (“x”, “y”), следующие шаблоны все эквивалентны (и все связывают атрибут `y` с переменной `var`):

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

#### Вложенные шаблоны

Шаблоны могут быть произвольно вложенными. Например, если наши данные – короткий список точек, их можно сопоставить следующим образом:

```python
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. Универсальный шаблон можно использовать в более сложных шаблонах, например `('error', code, _)`. Например:

```python
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`, известное как «страж». Если страж ложен, `match` переходит к следующему блоку case. Обратите внимание, что захват значения происходит до вычисления стража:

```python
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"` из словаря. В отличие от шаблонов последовательностей, лишние ключи игнорируются. Также поддерживается подстановочный знак `**rest`. (Но `**_` был бы избыточным, поэтому не допускается.)
- Подшаблоны могут быть захвачены с помощью ключевого слова `as`:

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

  Это связывает x1, y1, x2, y2, как и ожидалось, без пункта `as`, а p2 – со всем вторым элементом субъекта.
- Большинство литералов сравниваются по равенству. Однако синглтоны `True`, `False` и `None` сравниваются по идентичности.
- Именованные константы можно использовать в шаблонах. Они должны быть точечными именами, чтобы константа не интерпретировалась как переменная захвата:

  ```python
  from enum import Enum
  class Color(Enum):
      RED = 0
      GREEN = 1
      BLUE = 2

  color = Color.GREEN
  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**](https://python-all.ru/3.13/whatsnew/3.10.html). Мотивация и обоснование находятся в [**PEP 635**](https://python-all.ru/3.13/whatsnew/3.10.html), а более подробное руководство – в [**PEP 636**](https://python-all.ru/3.13/whatsnew/3.10.html).

### Опциональные `EncodingWarning` и `encoding="locale"` параметры

Кодировка по умолчанию для [`TextIOWrapper`](https://python-all.ru/3.13/library/io.html#io.TextIOWrapper) и [`open()`](https://python-all.ru/3.13/library/functions.html#open) зависит от платформы и локали. Поскольку UTF-8 используется на большинстве платформ Unix, опускание параметра `encoding` при открытии файлов в UTF-8 (например, JSON, YAML, TOML, Markdown) является очень распространённой ошибкой. Например:

```python
# ОШИБКА: следует использовать режим "rb" или encoding="utf-8".
with open("data.json") as f:
    data = json.load(f)
```

Для обнаружения такой ошибки добавлен опциональный `EncodingWarning`. Он выдаётся, когда [`sys.flags.warn_default_encoding`](https://python-all.ru/3.13/library/sys.html#sys.flags) истинно и используется кодировка по умолчанию, зависящая от локали.

Параметр `-X warn_default_encoding` и [`PYTHONWARNDEFAULTENCODING`](https://python-all.ru/3.13/using/cmdline.html#envvar-PYTHONWARNDEFAULTENCODING) добавлены для включения предупреждения.

См. [Кодировка текста](https://python-all.ru/3.13/library/io.html#io-text-encoding) для получения дополнительной информации.

## Новые возможности, связанные с аннотациями типов

Этот раздел охватывает основные изменения, затрагивающие [**PEP 484**](https://python-all.ru/3.13/whatsnew/3.10.html) подсказки типов и модуль [`typing`](https://python-all.ru/3.13/library/typing.html#module-typing).

### PEP 604: Новый оператор объединения типов

Был введён новый оператор объединения типов, который позволяет использовать синтаксис `X | Y`. Это даёт более чистый способ выразить «тип X или тип Y» вместо использования [`typing.Union`](https://python-all.ru/3.13/library/typing.html#typing.Union), особенно в аннотациях типов.

В предыдущих версиях Python для аннотации типов функций, принимающих аргументы нескольких типов, использовался [`typing.Union`](https://python-all.ru/3.13/library/typing.html#typing.Union):

```python
def square(number: Union[int, float]) -> Union[int, float]:
    return number ** 2
```

Теперь аннотации типов можно писать более кратко:

```python
def square(number: int | float) -> int | float:
    return number ** 2
```

Этот новый синтаксис также принимается в качестве второго аргумента для [`isinstance()`](https://python-all.ru/3.13/library/functions.html#isinstance) и [`issubclass()`](https://python-all.ru/3.13/library/functions.html#issubclass):

```python
>>> isinstance(1, int | str)
True
```

См. [Union Type](https://python-all.ru/3.13/library/stdtypes.html#types-union) и [**PEP 604**](https://python-all.ru/3.13/whatsnew/3.10.html) для получения дополнительной информации.

(Авторы: Maggie Moss и Philippe Prados в [bpo-41428](https://python-all.ru/3.13/whatsnew/3.10.html), с дополнениями от Yurii Karabas и Serhiy Storchaka в [bpo-44490](https://python-all.ru/3.13/whatsnew/3.10.html).)

### PEP 612: Переменные спецификации параметров

В модуль [`typing`](https://python-all.ru/3.13/library/typing.html#module-typing) добавлены два новых параметра, улучшающих информацию, предоставляемую статическим анализаторам типов для [**PEP 484**](https://python-all.ru/3.13/whatsnew/3.10.html)'s `Callable`.

Первая – это переменная спецификации параметров. Она используется для передачи типов параметров одного вызываемого объекта другому – шаблон, часто встречающийся в функциях высшего порядка и декораторах. Примеры использования можно найти в [`typing.ParamSpec`](https://python-all.ru/3.13/library/typing.html#typing.ParamSpec). Ранее не было простого способа аннотировать зависимость типов параметров с такой точностью.

Второй вариант – новый оператор `Concatenate`. Он используется вместе с переменными спецификации параметров для аннотации типов вызываемого объекта высшего порядка, который добавляет или удаляет параметры другого вызываемого объекта. Примеры использования можно найти в [`typing.Concatenate`](https://python-all.ru/3.13/library/typing.html#typing.Concatenate).

См. [`typing.Callable`](https://python-all.ru/3.13/library/typing.html#typing.Callable), [`typing.ParamSpec`](https://python-all.ru/3.13/library/typing.html#typing.ParamSpec), [`typing.Concatenate`](https://python-all.ru/3.13/library/typing.html#typing.Concatenate), [`typing.ParamSpecArgs`](https://python-all.ru/3.13/library/typing.html#typing.ParamSpecArgs), [`typing.ParamSpecKwargs`](https://python-all.ru/3.13/library/typing.html#typing.ParamSpecKwargs) и [**PEP 612**](https://python-all.ru/3.13/whatsnew/3.10.html) для получения дополнительной информации.

(Автор: Ken Jin в [bpo-41559](https://python-all.ru/3.13/whatsnew/3.10.html), с небольшими улучшениями от Jelle Zijlstra в [bpo-43783](https://python-all.ru/3.13/whatsnew/3.10.html). PEP написан Mark Mendoza.)

### PEP 613: TypeAlias

[**PEP 484**](https://python-all.ru/3.13/whatsnew/3.10.html) ввёл понятие псевдонимов типов, требуя лишь, чтобы они были присваиваниями верхнего уровня без аннотаций. Эта простота иногда затрудняла для анализаторов типов различие между псевдонимами типов и обычными присваиваниями, особенно когда были задействованы опережающие ссылки или недопустимые типы. Сравните:

```python
StrCache = 'Cache[str]'  # псевдоним типа
LOG_PREFIX = 'LOG[DEBUG]'  # константа модуля
```

Теперь в модуле [`typing`](https://python-all.ru/3.13/library/typing.html#module-typing) есть специальное значение [`TypeAlias`](https://python-all.ru/3.13/library/typing.html#typing.TypeAlias), которое позволяет объявлять псевдонимы типов более явно:

```python
StrCache: TypeAlias = 'Cache[str]'  # псевдоним типа
LOG_PREFIX = 'LOG[DEBUG]'  # константа модуля
```

См. [**PEP 613**](https://python-all.ru/3.13/whatsnew/3.10.html) для получения дополнительных сведений.

(Автор: Mikhail Golubev в [bpo-41923](https://python-all.ru/3.13/whatsnew/3.10.html).)

### PEP 647: Определяемые пользователем стражники типов

[`TypeGuard`](https://python-all.ru/3.13/library/typing.html#typing.TypeGuard) добавлен в модуль [`typing`](https://python-all.ru/3.13/library/typing.html#module-typing) для аннотирования функций-стражников типов и улучшения информации, передаваемой статическим проверщикам типов при сужении типа. Для получения дополнительной информации см. документацию `TypeGuard` и [**PEP 647**](https://python-all.ru/3.13/whatsnew/3.10.html).

(Авторы: Ken Jin и Guido van Rossum в [bpo-43766](https://python-all.ru/3.13/whatsnew/3.10.html). Автор PEP: Eric Traut.)

## Прочие изменения языка

- Тип [`int`](https://python-all.ru/3.13/library/functions.html#int) получил новый метод [`int.bit_count()`](https://python-all.ru/3.13/library/stdtypes.html#int.bit_count), который возвращает количество единиц в двоичном представлении целого числа, также известное как число единиц (population count). (Автор: Niklas Fiekas в [bpo-29882](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Представления, возвращаемые [`dict.keys()`](https://python-all.ru/3.13/library/stdtypes.html#dict.keys), [`dict.values()`](https://python-all.ru/3.13/library/stdtypes.html#dict.values) и [`dict.items()`](https://python-all.ru/3.13/library/stdtypes.html#dict.items), теперь все имеют атрибут `mapping`, предоставляющий объект [`types.MappingProxyType`](https://python-all.ru/3.13/library/types.html#types.MappingProxyType), оборачивающий исходный словарь. (Автор: Dennis Sweeney в [bpo-40890](https://python-all.ru/3.13/whatsnew/3.10.html).)
- [**PEP 618**](https://python-all.ru/3.13/whatsnew/3.10.html): функция [`zip()`](https://python-all.ru/3.13/library/functions.html#zip) теперь имеет необязательный флаг `strict`, используемый для требования, чтобы все итерируемые объекты имели одинаковую длину.
- Встроенные функции и функции расширений, принимающие целочисленные аргументы, больше не принимают [`Decimal`](https://python-all.ru/3.13/library/decimal.html#decimal.Decimal), [`Fraction`](https://python-all.ru/3.13/library/fractions.html#fractions.Fraction) и другие объекты, которые могут быть преобразованы в целые числа только с потерей (например, имеющие метод [`__int__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__int__), но не имеющие метода [`__index__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__index__)). (Автор: Serhiy Storchaka в [bpo-37999](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Если [`object.__ipow__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__ipow__) возвращает [`NotImplemented`](https://python-all.ru/3.13/library/constants.html#NotImplemented), оператор будет корректно возвращаться к [`object.__pow__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__pow__) и [`object.__rpow__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__rpow__), как и ожидается. (Автор: Alex Shkop в [bpo-38302](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Присваивающие выражения теперь можно использовать без скобок внутри литералов множеств и включений множеств, а также в индексах последовательностей (но не в срезах).
- Функции получили новый атрибут `__builtins__`, который используется для поиска встроенных символов при выполнении функции, вместо поиска в `__globals__['__builtins__']`. Атрибут инициализируется из `__globals__["__builtins__"]`, если он существует, иначе из текущих встроенных объектов. (Автор: Mark Shannon в [bpo-42990](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Две новые встроенные функции – [`aiter()`](https://python-all.ru/3.13/library/functions.html#aiter) и [`anext()`](https://python-all.ru/3.13/library/functions.html#anext) были добавлены для предоставления асинхронных аналогов [`iter()`](https://python-all.ru/3.13/library/functions.html#iter) и [`next()`](https://python-all.ru/3.13/library/functions.html#next) соответственно. (Авторы: Joshua Bronson, Daniel Pope и Justin Wang в [bpo-31861](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Статические методы ([`@staticmethod`](https://python-all.ru/3.13/library/functions.html#staticmethod)) и методы классов ([`@classmethod`](https://python-all.ru/3.13/library/functions.html#classmethod)) теперь наследуют атрибуты методов (`__module__`, `__name__`, `__qualname__`, `__doc__`, `__annotations__`) и имеют новый атрибут `__wrapped__`. Более того, статические методы теперь можно вызывать как обычные функции. (Автор: Victor Stinner в [bpo-43682](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Аннотации для сложных целей (всё, кроме целей `simple name`, заданных [**PEP 526**](https://python-all.ru/3.13/whatsnew/3.10.html)) больше не вызывают никаких эффектов во время выполнения при `from __future__ import annotations`. (Автор: Batuhan Taskaya в [bpo-42737](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Объекты классов и модулей теперь лениво создают пустые словари аннотаций по требованию. Словари аннотаций хранятся в `__dict__` объекта для обратной совместимости. Это улучшает лучшие практики работы с `__annotations__`; для получения дополнительной информации см. [Annotations Best Practices](https://python-all.ru/3.13/howto/annotations.html#annotations-howto). (Автор: Larry Hastings в [bpo-43901](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Аннотации, состоящие из `yield`, `yield from`, `await` или именованных выражений, теперь запрещены при `from __future__ import annotations` из-за их побочных эффектов. (Автор: Batuhan Taskaya в [bpo-42725](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Использование несвязанных переменных, `super()` и других выражений, которые могут изменить обработку таблицы символов в качестве аннотаций, теперь не имеет эффекта при `from __future__ import annotations`. (Автор: Batuhan Taskaya в [bpo-42725](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Хеши значений NaN как типа [`float`](https://python-all.ru/3.13/library/functions.html#float), так и типа [`decimal.Decimal`](https://python-all.ru/3.13/library/decimal.html#decimal.Decimal) теперь зависят от идентичности объекта. Раньше они всегда хешировались в `0`, несмотря на то что значения NaN не равны друг другу. Это приводило к потенциально квадратичному поведению во время выполнения из-за чрезмерных коллизий хешей при создании словарей и множеств, содержащих несколько NaN. (Автор: Raymond Hettinger в [bpo-43475](https://python-all.ru/3.13/whatsnew/3.10.html).)
- При удалении константы [`__debug__`](https://python-all.ru/3.13/library/constants.html#debug__) будет возбуждено [`SyntaxError`](https://python-all.ru/3.13/library/exceptions.html#SyntaxError) (вместо [`NameError`](https://python-all.ru/3.13/library/exceptions.html#NameError)). (Автор: Donghee Na в [bpo-45000](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Исключения [`SyntaxError`](https://python-all.ru/3.13/library/exceptions.html#SyntaxError) теперь имеют атрибуты `end_lineno` и `end_offset`. Они будут равны `None`, если не определены. (Автор: Pablo Galindo в [bpo-43914](https://python-all.ru/3.13/whatsnew/3.10.html).)

## Новые модули

- Нет.

## Улучшенные модули

### asyncio

Добавлен отсутствующий метод [`connect_accepted_socket()`](https://python-all.ru/3.13/library/asyncio-eventloop.html#asyncio.loop.connect_accepted_socket). (Автор: Alex Grönholm в [bpo-41332](https://python-all.ru/3.13/whatsnew/3.10.html).)

### argparse

Вводящая в заблуждение фраза «optional arguments» была заменена на «options» в справке argparse. Некоторым тестам может потребоваться адаптация, если они полагаются на точное совпадение вывода. (Автор: Raymond Hettinger в [bpo-9694](https://python-all.ru/3.13/whatsnew/3.10.html).)

### array

Метод [`index()`](https://python-all.ru/3.13/library/array.html#array.array.index) у [`array.array`](https://python-all.ru/3.13/library/array.html#array.array) теперь имеет необязательные параметры *start* и *stop*. (Авторы: Anders Lorentsen и Zackery Spytz в [bpo-31956](https://python-all.ru/3.13/whatsnew/3.10.html).)

### asynchat, asyncore, smtpd

Эти модули были отмечены как устаревшие в своей документации, начиная с Python 3.6. Теперь во все три модуля добавлено [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning) во время импорта.

### base64

Добавлены [`base64.b32hexencode()`](https://python-all.ru/3.13/library/base64.html#base64.b32hexencode) и [`base64.b32hexdecode()`](https://python-all.ru/3.13/library/base64.html#base64.b32hexdecode) для поддержки кодирования Base32 с расширенным шестнадцатеричным алфавитом.

### bdb

Добавлена `clearBreakpoints()` для сброса всех установленных точек останова. (Предложено Ирит Катриэлем в [bpo-24160](https://python-all.ru/3.13/whatsnew/3.10.html).)

### bisect

Добавлена возможность указания функции *key* в API модуля [`bisect`](https://python-all.ru/3.13/library/bisect.html#module-bisect). (Предложено Рэймондом Хеттингером в [bpo-4356](https://python-all.ru/3.13/whatsnew/3.10.html).)

### codecs

Добавлена функция [`codecs.unregister()`](https://python-all.ru/3.13/library/codecs.html#codecs.unregister) для отмены регистрации функции поиска кодеков. (Предложено Хай Ши в [bpo-41842](https://python-all.ru/3.13/whatsnew/3.10.html).)

### collections.abc

`__args__` у [параметризованных обобщённых типов](https://python-all.ru/3.13/library/stdtypes.html#types-genericalias) для [`collections.abc.Callable`](https://python-all.ru/3.13/library/collections.abc.html#collections.abc.Callable) теперь согласованы с [`typing.Callable`](https://python-all.ru/3.13/library/typing.html#typing.Callable). `collections.abc.Callable` обобщённый тип теперь упрощает параметры типа, аналогично tому, что делает `typing.Callable`. Это означает, что `collections.abc.Callable[[int, str], str]` будет иметь `__args__` от `(int, str, str)`; ранее это было `([int, str], str)`. Чтобы обеспечить это изменение, [`types.GenericAlias`](https://python-all.ru/3.13/library/types.html#types.GenericAlias) теперь может быть подклассом, и при индексировании типа `collections.abc.Callable` будет возвращаться подкласс. Обратите внимание, что может возникать [`TypeError`](https://python-all.ru/3.13/library/exceptions.html#TypeError) для некорректных форм параметризации `collections.abc.Callable`, которые в Python 3.9 могли проходить молча. (Предложено Кеном Джином в [bpo-42195](https://python-all.ru/3.13/whatsnew/3.10.html).)

### contextlib

Добавлен менеджер контекста [`contextlib.aclosing()`](https://python-all.ru/3.13/library/contextlib.html#contextlib.aclosing) для безопасного закрытия асинхронных генераторов и объектов, представляющих асинхронно освобождаемые ресурсы. (Предложено Джунги Кимом и Джоном Бельмонте в [bpo-41229](https://python-all.ru/3.13/whatsnew/3.10.html).)

Добавлена поддержка асинхронного менеджера контекста для [`contextlib.nullcontext()`](https://python-all.ru/3.13/library/contextlib.html#contextlib.nullcontext). (Предложено Томом Грингаузом в [bpo-41543](https://python-all.ru/3.13/whatsnew/3.10.html).)

Добавлен [`AsyncContextDecorator`](https://python-all.ru/3.13/library/contextlib.html#contextlib.AsyncContextDecorator) для поддержки использования асинхронных менеджеров контекста в качестве декораторов.

### curses

Расширенные функции цвета, добавленные в ncurses 6.1, будут прозрачно использоваться [`curses.color_content()`](https://python-all.ru/3.13/library/curses.html#curses.color_content), [`curses.init_color()`](https://python-all.ru/3.13/library/curses.html#curses.init_color), [`curses.init_pair()`](https://python-all.ru/3.13/library/curses.html#curses.init_pair) и [`curses.pair_content()`](https://python-all.ru/3.13/library/curses.html#curses.pair_content). Новая функция [`curses.has_extended_color_support()`](https://python-all.ru/3.13/library/curses.html#curses.has_extended_color_support) указывает, поддерживаются ли расширенные цвета базовой библиотекой ncurses. (Предложено Джеффри Кинчером и Хансом Петтером Янссоном в [bpo-36982](https://python-all.ru/3.13/whatsnew/3.10.html).)

Константы `BUTTON5_*` теперь доступны в модуле [`curses`](https://python-all.ru/3.13/library/curses.html#module-curses), если они предоставляются базовой библиотекой curses. (Предложено Закери Спайтцем в [bpo-39273](https://python-all.ru/3.13/whatsnew/3.10.html).)

### dataclasses

#### \_\_slots\_\_

Добавлен параметр `slots` в декоратор [`dataclasses.dataclass()`](https://python-all.ru/3.13/library/dataclasses.html#dataclasses.dataclass). (Предложено Юрием Карабасом в [bpo-42269](https://python-all.ru/3.13/whatsnew/3.10.html))

#### Поля только по ключу

dataclasses теперь поддерживает поля, которые являются только по ключу в сгенерированном методе \_\_init\_\_. Существует несколько способов указания таких полей.

Можно указать, что все поля являются только по ключу:

```python
from dataclasses import dataclass

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

Оба параметра `name` и `birthday` являются только по ключу в сгенерированном методе \_\_init\_\_.

Можно указать «только по ключу» для каждого поля отдельно:

```python
from dataclasses import dataclass, field

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

Здесь только `birthday` является только по ключу. Если установить `kw_only` для отдельных полей, следует учитывать, что существуют правила переупорядочивания полей: поля только по ключу должны следовать после полей не только по ключу. Подробнее см. в полной документации dataclasses.

Также можно указать, что все поля, следующие за маркером KW\_ONLY, являются только по ключу. Вероятно, это будет наиболее распространённый способ использования:

```python
from dataclasses import dataclass, KW_ONLY

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

Здесь `z` и `t` являются параметрами только по ключу, а `x` и `y` – нет. (Предложено Эриком В. Смитом в [bpo-43532](https://python-all.ru/3.13/whatsnew/3.10.html).)

### distutils

Весь пакет `distutils` является устаревшим и будет удалён в Python 3.12. Его функциональность для указания сборки пакетов уже полностью заменена сторонними пакетами `setuptools` и `packaging`, а большинство других часто используемых API доступны в других местах стандартной библиотеки (например, [`platform`](https://python-all.ru/3.13/library/platform.html#module-platform), [`shutil`](https://python-all.ru/3.13/library/shutil.html#module-shutil), [`subprocess`](https://python-all.ru/3.13/library/subprocess.html#module-subprocess) или [`sysconfig`](https://python-all.ru/3.13/library/sysconfig.html#module-sysconfig)). Планов по переносу какой-либо другой функциональности из `distutils` нет, и приложения, использующие другие функции, должны рассмотреть создание частных копий кода. Обратитесь к [**PEP 632**](https://python-all.ru/3.13/whatsnew/3.10.html) для обсуждения.

Команда `bdist_wininst`, устаревшая в Python 3.8, была удалена. Теперь для распространения двоичных пакетов в Windows рекомендуется использовать команду `bdist_wheel`. (Предложено Виктором Стиннером в [bpo-42802](https://python-all.ru/3.13/whatsnew/3.10.html).)

### doctest

Если модуль не определяет `__loader__`, используется `__spec__.loader`. (Автор: Brett Cannon в [bpo-42133](https://python-all.ru/3.13/whatsnew/3.10.html).)

### encodings

[`encodings.normalize_encoding()`](https://python-all.ru/3.13/library/codecs.html#encodings.normalize_encoding) теперь игнорирует не-ASCII символы. (Добавлено Хай Ши в [bpo-39337](https://python-all.ru/3.13/whatsnew/3.10.html).)

### enum

[`Enum`](https://python-all.ru/3.13/library/enum.html#enum.Enum) [`__repr__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__repr__) теперь возвращает `enum_name.member_name`, а [`__str__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__str__) теперь возвращает `member_name`. Перечисления стандартной библиотеки, доступные как константы модуля, имеют [`repr()`](https://python-all.ru/3.13/library/functions.html#repr), равный `module_name.member_name`. (Добавлено Итаном Фурманом в [bpo-40066](https://python-all.ru/3.13/whatsnew/3.10.html).)

Добавлен [`enum.StrEnum`](https://python-all.ru/3.13/library/enum.html#enum.StrEnum) для перечислений, все члены которых являются строками. (Добавлено Итаном Фурманом в [bpo-41816](https://python-all.ru/3.13/whatsnew/3.10.html).)

### fileinput

Добавлены параметры *encoding* и *errors* в [`fileinput.input()`](https://python-all.ru/3.13/library/fileinput.html#fileinput.input) и [`fileinput.FileInput`](https://python-all.ru/3.13/library/fileinput.html#fileinput.FileInput). (Добавлено Инадой Наоки в [bpo-43712](https://python-all.ru/3.13/whatsnew/3.10.html).)

[`fileinput.hook_compressed()`](https://python-all.ru/3.13/library/fileinput.html#fileinput.hook_compressed) теперь возвращает объект [`TextIOWrapper`](https://python-all.ru/3.13/library/io.html#io.TextIOWrapper), когда *mode* равен «r», а файл сжат, как и несжатые файлы. (Добавлено Инадой Наоки в [bpo-5758](https://python-all.ru/3.13/whatsnew/3.10.html).)

### faulthandler

Модуль [`faulthandler`](https://python-all.ru/3.13/library/faulthandler.html#module-faulthandler) теперь обнаруживает, произошла ли фатальная ошибка во время сборки мусора. (Добавлено Виктором Стиннером в [bpo-44466](https://python-all.ru/3.13/whatsnew/3.10.html).)

### gc

Добавлены аудит-хуки для [`gc.get_objects()`](https://python-all.ru/3.13/library/gc.html#gc.get_objects), [`gc.get_referrers()`](https://python-all.ru/3.13/library/gc.html#gc.get_referrers) и [`gc.get_referents()`](https://python-all.ru/3.13/library/gc.html#gc.get_referents). (Добавлено Пабло Галиндо в [bpo-43439](https://python-all.ru/3.13/whatsnew/3.10.html).)

### glob

Добавлены параметры *root\_dir* и *dir\_fd* в [`glob()`](https://python-all.ru/3.13/library/glob.html#glob.glob) и [`iglob()`](https://python-all.ru/3.13/library/glob.html#glob.iglob), которые позволяют указать корневой каталог для поиска. (Добавлено Сергеем Сторчакой в [bpo-38144](https://python-all.ru/3.13/whatsnew/3.10.html).)

### hashlib

Модуль hashlib требует OpenSSL 1.1.1 или новее. (Добавлено Кристианом Хаймсом в [**PEP 644**](https://python-all.ru/3.13/whatsnew/3.10.html) и [bpo-43669](https://python-all.ru/3.13/whatsnew/3.10.html).)

Модуль hashlib имеет предварительную поддержку OpenSSL 3.0.0. (Добавлено Кристианом Хаймсом в [bpo-38820](https://python-all.ru/3.13/whatsnew/3.10.html) и других тикетах.)

Чистая реализация на Python [`pbkdf2_hmac()`](https://python-all.ru/3.13/library/hashlib.html#hashlib.pbkdf2_hmac) объявлена устаревшей. В будущем PBKDF2-HMAC будет доступен только при сборке Python с поддержкой OpenSSL. (Добавлено Кристианом Хаймсом в [bpo-43880](https://python-all.ru/3.13/whatsnew/3.10.html).)

### hmac

Модуль hmac теперь использует реализацию HMAC от OpenSSL внутри. (Добавлено Кристианом Хаймсом в [bpo-40645](https://python-all.ru/3.13/whatsnew/3.10.html).)

### IDLE и idlelib

IDLE теперь вызывает [`sys.excepthook()`](https://python-all.ru/3.13/library/sys.html#sys.excepthook) (при запуске без «-n»). Ранее пользовательские хуки игнорировались. (Добавлено Кеном Хилтоном в [bpo-43008](https://python-all.ru/3.13/whatsnew/3.10.html).)

Переработан диалог настроек. Вкладка General разделена на вкладки Windows и Shell/Ed. Источники справки, расширяющие меню Help, перемещены на вкладку Extensions. Освобождено место для новых опций и сокращён диалог. Последнее улучшает отображение диалога на маленьких экранах. (Добавлено Терри Джан Риди в [bpo-40468](https://python-all.ru/3.13/whatsnew/3.10.html).) Настройка отступа (indent space) перенесена с вкладки Font на новую вкладку Windows. (Добавлено Марком Роземаном и Терри Джан Риди в [bpo-33962](https://python-all.ru/3.13/whatsnew/3.10.html).)

Эти изменения были перенесены в поддерживаемый выпуск 3.9.

Добавлена боковая панель Shell. Основное приглашение («\>\>\>») перемещено на боковую панель. Вторичные приглашения («…») добавлены на боковую панель. Щелчок левой кнопкой мыши и перетаскивание (опционально) выделяют одну или несколько строк текста, как в боковой панели с номерами строк редактора. Щелчок правой кнопкой после выделения строк текста отображает контекстное меню с пунктом «copy with prompts». Это объединяет приглашения с боковой панели со строками выделенного текста. Этот пункт также появляется в контекстном меню текста. (Добавлено Талем Эйнатом в [bpo-37903](https://python-all.ru/3.13/whatsnew/3.10.html).)

Используются пробелы вместо табуляции для отступа интерактивного кода. Это делает ввод интерактивного кода «выглядящим правильно». Возможность этого была основной мотивацией для добавления боковой панели Shell. (Добавлено Терри Джан Риди в [bpo-37892](https://python-all.ru/3.13/whatsnew/3.10.html).)

Подсвечиваются новые [мягкие ключевые слова](https://python-all.ru/3.13/reference/lexical_analysis.html#soft-keywords) [`match`](https://python-all.ru/3.13/reference/compound_stmts.html#match), `case` и [`_`](https://python-all.ru/3.13/reference/compound_stmts.html#wildcard-patterns) в операторах сопоставления с образцом. Однако эта подсветка не идеальна и может быть некорректной в некоторых редких случаях, включая некоторые `_` в образцах `case`. (Добавлено Талем Эйнатом в [bpo-44010](https://python-all.ru/3.13/whatsnew/3.10.html).)

Новое в поддерживаемых выпусках 3.10.

Применять подсветку синтаксиса для файлов `.pyi`. (Авторы: Alex Waygood и Terry Jan Reedy, [bpo-45447](https://python-all.ru/3.13/whatsnew/3.10.html).)

Включение приглашений при сохранении содержимого Shell с вводом и выводом. (Автор: Terry Jan Reedy, [gh-95191](https://python-all.ru/3.13/whatsnew/3.10.html).)

### importlib.metadata

Функциональная совместимость с `importlib_metadata` 4.6 ([история](https://python-all.ru/3.13/whatsnew/3.10.html)).

[importlib.metadata entry points](https://python-all.ru/3.13/library/importlib.metadata.html#entry-points) теперь предоставляют более удобный интерфейс для выбора точек входа по группе и имени через новый класс [importlib.metadata.EntryPoints](https://python-all.ru/3.13/library/importlib.metadata.html#entry-points). См. примечание о совместимости в документации для получения дополнительной информации об устаревании и использовании.

Добавлена [importlib.metadata.packages\_distributions()](https://python-all.ru/3.13/library/importlib.metadata.html#package-distributions) для разрешения модулей и пакетов верхнего уровня Python в их [importlib.metadata.Distribution](https://python-all.ru/3.13/library/importlib.metadata.html#distributions).

### inspect

Если модуль не определяет `__loader__`, используется `__spec__.loader`. (Автор: Brett Cannon в [bpo-42133](https://python-all.ru/3.13/whatsnew/3.10.html).)

Добавлен [`inspect.get_annotations()`](https://python-all.ru/3.13/library/inspect.html#inspect.get_annotations), который безопасно вычисляет аннотации, определённые для объекта. Он обходит особенности доступа к аннотациям для различных типов объектов и делает очень мало предположений об объекте, который исследует. `inspect.get_annotations()` также может корректно преобразовывать строковые аннотации обратно в объекты. `inspect.get_annotations()` теперь считается лучшей практикой для доступа к словарю аннотаций, определённому для любого объекта Python; дополнительную информацию о лучших практиках работы с аннотациями см. в [Лучшие практики для аннотаций](https://python-all.ru/3.13/howto/annotations.html#annotations-howto). Кроме того, [`inspect.signature()`](https://python-all.ru/3.13/library/inspect.html#inspect.signature), [`inspect.Signature.from_callable()`](https://python-all.ru/3.13/library/inspect.html#inspect.Signature.from_callable) и `inspect.Signature.from_function()` теперь вызывают `inspect.get_annotations()` для получения аннотаций. Это означает, что `inspect.signature()` и `inspect.Signature.from_callable()` также теперь могут преобразовывать строковые аннотации обратно в объекты. (Автор: Larry Hastings в [bpo-43817](https://python-all.ru/3.13/whatsnew/3.10.html).)

### itertools

Добавлен [`itertools.pairwise()`](https://python-all.ru/3.13/library/itertools.html#itertools.pairwise). (Автор: Raymond Hettinger в [bpo-38200](https://python-all.ru/3.13/whatsnew/3.10.html).)

### linecache

Если модуль не определяет `__loader__`, используется `__spec__.loader`. (Автор: Brett Cannon в [bpo-42133](https://python-all.ru/3.13/whatsnew/3.10.html).)

### os

Добавлена поддержка [`os.cpu_count()`](https://python-all.ru/3.13/library/os.html#os.cpu_count) для VxWorks RTOS. (Автор: Peixing Xin в [bpo-41440](https://python-all.ru/3.13/whatsnew/3.10.html).)

Добавлена новая функция [`os.eventfd()`](https://python-all.ru/3.13/library/os.html#os.eventfd) и вспомогательные функции для обёртки системного вызова `eventfd2` в Linux. (Автор: Christian Heimes в [bpo-41001](https://python-all.ru/3.13/whatsnew/3.10.html).)

Добавлен [`os.splice()`](https://python-all.ru/3.13/library/os.html#os.splice), который позволяет перемещать данные между двумя файловыми дескрипторами без копирования между адресным пространством ядра и пользовательским адресным пространством, причём один из файловых дескрипторов должен ссылаться на канал. (Автор: Pablo Galindo в [bpo-41625](https://python-all.ru/3.13/whatsnew/3.10.html).)

Добавлены [`O_EVTONLY`](https://python-all.ru/3.13/library/os.html#os.O_EVTONLY), [`O_FSYNC`](https://python-all.ru/3.13/library/os.html#os.O_FSYNC), [`O_SYMLINK`](https://python-all.ru/3.13/library/os.html#os.O_SYMLINK) и [`O_NOFOLLOW_ANY`](https://python-all.ru/3.13/library/os.html#os.O_NOFOLLOW_ANY) для macOS. (Автор: Donghee Na в [bpo-43106](https://python-all.ru/3.13/whatsnew/3.10.html).)

### os.path

[`os.path.realpath()`](https://python-all.ru/3.13/library/os.path.html#os.path.realpath) теперь принимает именованный аргумент *strict*. Если установлено значение `True`, [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError) возбуждается, если путь не существует или обнаружен цикл символической ссылки. (Автор: Barney Gale в [bpo-43757](https://python-all.ru/3.13/whatsnew/3.10.html).)

### pathlib

Добавлена поддержка срезов для [`PurePath.parents`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath.parents). (Автор: Joshua Cannon в [bpo-35498](https://python-all.ru/3.13/whatsnew/3.10.html).)

Добавлена поддержка отрицательной индексации для [`PurePath.parents`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath.parents). (Автор: Yaroslav Pankovych в [bpo-21041](https://python-all.ru/3.13/whatsnew/3.10.html).)

Добавлен метод [`Path.hardlink_to`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.hardlink_to), который заменяет `link_to()`. Новый метод имеет тот же порядок аргументов, что и [`symlink_to()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.symlink_to). (Автор: Barney Gale в [bpo-39950](https://python-all.ru/3.13/whatsnew/3.10.html).)

[`pathlib.Path.stat()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.stat) и [`chmod()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.chmod) теперь принимают именованный аргумент *follow\_symlinks* для согласованности с соответствующими функциями в модуле [`os`](https://python-all.ru/3.13/library/os.html#module-os). (Автор: Barney Gale в [bpo-39906](https://python-all.ru/3.13/whatsnew/3.10.html).)

### platform

Добавлен [`platform.freedesktop_os_release()`](https://python-all.ru/3.13/library/platform.html#platform.freedesktop_os_release) для получения идентификации операционной системы из стандартного файла [freedesktop.org os-release](https://python-all.ru/3.13/whatsnew/3.10.html). (Автор: Christian Heimes в [bpo-28468](https://python-all.ru/3.13/whatsnew/3.10.html).)

### pprint

[`pprint.pprint()`](https://python-all.ru/3.13/library/pprint.html#pprint.pprint) теперь принимает новый именованный аргумент `underscore_numbers`. (Автор: sblondon в [bpo-42914](https://python-all.ru/3.13/whatsnew/3.10.html).)

[`pprint`](https://python-all.ru/3.13/library/pprint.html#module-pprint) теперь может красиво печатать экземпляры [`dataclasses.dataclass`](https://python-all.ru/3.13/library/dataclasses.html#dataclasses.dataclass). (Автор: Lewis Gaul в [bpo-43080](https://python-all.ru/3.13/whatsnew/3.10.html).)

### py\_compile

Добавлена опция `--quiet` в интерфейс командной строки [`py_compile`](https://python-all.ru/3.13/library/py_compile.html#module-py_compile). (Автор: Gregory Schevchenko в [bpo-38731](https://python-all.ru/3.13/whatsnew/3.10.html).)

### pyclbr

Добавлен атрибут `end_lineno` в объекты `Function` и `Class` в дереве, возвращаемом [`pyclbr.readmodule()`](https://python-all.ru/3.13/library/pyclbr.html#pyclbr.readmodule) и [`pyclbr.readmodule_ex()`](https://python-all.ru/3.13/library/pyclbr.html#pyclbr.readmodule_ex). Он соответствует существующему (начальному) `lineno`. (Автор: Aviral Srivastava в [bpo-38307](https://python-all.ru/3.13/whatsnew/3.10.html).)

### shelve

Модуль [`shelve`](https://python-all.ru/3.13/library/shelve.html#module-shelve) теперь по умолчанию использует [`pickle.DEFAULT_PROTOCOL`](https://python-all.ru/3.13/library/pickle.html#pickle.DEFAULT_PROTOCOL) вместо протокола [`pickle`](https://python-all.ru/3.13/library/pickle.html#module-pickle) `3` при создании shelves. (Автор: Zackery Spytz в [bpo-34204](https://python-all.ru/3.13/whatsnew/3.10.html).)

### statistics

Добавлены функции [`covariance()`](https://python-all.ru/3.13/library/statistics.html#statistics.covariance), [`correlation()`](https://python-all.ru/3.13/library/statistics.html#statistics.correlation) Пирсона и простая [`linear_regression()`](https://python-all.ru/3.13/library/statistics.html#statistics.linear_regression). (Автор: Tymoteusz Wołodźko в [bpo-38490](https://python-all.ru/3.13/whatsnew/3.10.html).)

### site

Если модуль не определяет `__loader__`, используется `__spec__.loader`. (Автор: Brett Cannon в [bpo-42133](https://python-all.ru/3.13/whatsnew/3.10.html).)

### socket

Исключение [`socket.timeout`](https://python-all.ru/3.13/library/socket.html#socket.timeout) теперь является псевдонимом [`TimeoutError`](https://python-all.ru/3.13/library/exceptions.html#TimeoutError). (Автор: Christian Heimes в [bpo-42413](https://python-all.ru/3.13/whatsnew/3.10.html).)

Добавлена возможность создавать MPTCP-сокеты с `IPPROTO_MPTCP` (Автор: Rui Cunha в [bpo-43571](https://python-all.ru/3.13/whatsnew/3.10.html).)

Добавлена опция `IP_RECVTOS` для получения поля Type of Service (ToS) или DSCP/ECN (Автор: Georg Sauthoff в [bpo-44077](https://python-all.ru/3.13/whatsnew/3.10.html).)

### ssl

Модуль ssl требует OpenSSL 1.1.1 или новее. (Автор: Christian Heimes в [**PEP 644**](https://python-all.ru/3.13/whatsnew/3.10.html) и [bpo-43669](https://python-all.ru/3.13/whatsnew/3.10.html).)

Модуль ssl получил предварительную поддержку OpenSSL 3.0.0 и новую опцию [`OP_IGNORE_UNEXPECTED_EOF`](https://python-all.ru/3.13/library/ssl.html#ssl.OP_IGNORE_UNEXPECTED_EOF). (Автор: Christian Heimes в [bpo-38820](https://python-all.ru/3.13/whatsnew/3.10.html), [bpo-43794](https://python-all.ru/3.13/whatsnew/3.10.html), [bpo-43788](https://python-all.ru/3.13/whatsnew/3.10.html), [bpo-43791](https://python-all.ru/3.13/whatsnew/3.10.html), [bpo-43799](https://python-all.ru/3.13/whatsnew/3.10.html), [bpo-43920](https://python-all.ru/3.13/whatsnew/3.10.html), [bpo-43789](https://python-all.ru/3.13/whatsnew/3.10.html) и [bpo-43811](https://python-all.ru/3.13/whatsnew/3.10.html).)

Устаревшие функции и использование устаревших констант теперь приводят к [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning). У [`ssl.SSLContext.options`](https://python-all.ru/3.13/library/ssl.html#ssl.SSLContext.options) по умолчанию установлены [`OP_NO_SSLv2`](https://python-all.ru/3.13/library/ssl.html#ssl.OP_NO_SSLv2) и [`OP_NO_SSLv3`](https://python-all.ru/3.13/library/ssl.html#ssl.OP_NO_SSLv3), поэтому он не может предупредить о повторной установке флага. В [разделе об устаревших возможностях](https://python-all.ru/3.13/whatsnew/3.10.html#whatsnew310-deprecated) приведён список устаревших функций. (Автор: Christian Heimes в [bpo-43880](https://python-all.ru/3.13/whatsnew/3.10.html).)

Модуль ssl теперь использует более безопасные настройки по умолчанию. Шифры без прямой секретности (forward secrecy) или с MAC SHA-1 отключены по умолчанию. Уровень безопасности 2 запрещает слабые ключи RSA, DH и ECC с надёжностью менее 112 бит. [`SSLContext`](https://python-all.ru/3.13/library/ssl.html#ssl.SSLContext) по умолчанию использует минимальную версию протокола TLS 1.2. Настройки основаны на исследовании Hynek Schlawack. (Автор: Christian Heimes в [bpo-43998](https://python-all.ru/3.13/whatsnew/3.10.html).)

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

Добавлен параметр *timeout* в функцию [`ssl.get_server_certificate()`](https://python-all.ru/3.13/library/ssl.html#ssl.get_server_certificate). (Автор: Zackery Spytz в [bpo-31870](https://python-all.ru/3.13/whatsnew/3.10.html).)

Модуль ssl использует heap-типы и многофазную инициализацию. (Автор: Christian Heimes в [bpo-42333](https://python-all.ru/3.13/whatsnew/3.10.html).)

Добавлен новый флаг проверки [`VERIFY_X509_PARTIAL_CHAIN`](https://python-all.ru/3.13/library/ssl.html#ssl.VERIFY_X509_PARTIAL_CHAIN). (Автор: l0x в [bpo-40849](https://python-all.ru/3.13/whatsnew/3.10.html).)

### sqlite3

Добавлены события аудита для [`connect()`](https://python-all.ru/3.13/library/sqlite3.html#sqlite3.connect), [`enable_load_extension()`](https://python-all.ru/3.13/library/sqlite3.html#sqlite3.Connection.enable_load_extension) и [`load_extension()`](https://python-all.ru/3.13/library/sqlite3.html#sqlite3.Connection.load_extension). (Автор: Erlend E. Aasland в [bpo-43762](https://python-all.ru/3.13/whatsnew/3.10.html).)

### sys

Добавлен атрибут [`sys.orig_argv`](https://python-all.ru/3.13/library/sys.html#sys.orig_argv): список исходных аргументов командной строки, переданных исполняемому файлу Python. (Автор: Victor Stinner в [bpo-23427](https://python-all.ru/3.13/whatsnew/3.10.html).)

Добавлен [`sys.stdlib_module_names`](https://python-all.ru/3.13/library/sys.html#sys.stdlib_module_names), содержащий список имён модулей стандартной библиотеки. (Автор: Victor Stinner в [bpo-42955](https://python-all.ru/3.13/whatsnew/3.10.html).)

### \_thread

[`_thread.interrupt_main()`](https://python-all.ru/3.13/library/_thread.html#thread.interrupt_main) теперь принимает необязательный номер сигнала для имитации (по умолчанию по-прежнему [`signal.SIGINT`](https://python-all.ru/3.13/library/signal.html#signal.SIGINT)). (Автор: Antoine Pitrou в [bpo-43356](https://python-all.ru/3.13/whatsnew/3.10.html).)

### threading

Добавлены [`threading.gettrace()`](https://python-all.ru/3.13/library/threading.html#threading.gettrace) и [`threading.getprofile()`](https://python-all.ru/3.13/library/threading.html#threading.getprofile) для получения функций, установленных [`threading.settrace()`](https://python-all.ru/3.13/library/threading.html#threading.settrace) и [`threading.setprofile()`](https://python-all.ru/3.13/library/threading.html#threading.setprofile) соответственно. (Автор: Mario Corchero в [bpo-42251](https://python-all.ru/3.13/whatsnew/3.10.html).)

Добавлен [`threading.__excepthook__`](https://python-all.ru/3.13/library/threading.html#threading.__excepthook__) для получения исходного значения [`threading.excepthook()`](https://python-all.ru/3.13/library/threading.html#threading.excepthook), если оно установлено в сломанное или другое значение. (Автор: Mario Corchero в [bpo-42308](https://python-all.ru/3.13/whatsnew/3.10.html).)

### traceback

Функции [`format_exception()`](https://python-all.ru/3.13/library/traceback.html#traceback.format_exception), [`format_exception_only()`](https://python-all.ru/3.13/library/traceback.html#traceback.format_exception_only) и [`print_exception()`](https://python-all.ru/3.13/library/traceback.html#traceback.print_exception) теперь могут принимать объект исключения в качестве позиционного аргумента (только позиционный). (Авторы: Zackery Spytz и Matthias Bussonnier в [bpo-26389](https://python-all.ru/3.13/whatsnew/3.10.html).)

### types

Повторно введены классы [`types.EllipsisType`](https://python-all.ru/3.13/library/types.html#types.EllipsisType), [`types.NoneType`](https://python-all.ru/3.13/library/types.html#types.NoneType) и [`types.NotImplementedType`](https://python-all.ru/3.13/library/types.html#types.NotImplementedType), предоставляющие новый набор типов, легко интерпретируемых средствами проверки типов. (Автор: Bas van Beek в [bpo-41810](https://python-all.ru/3.13/whatsnew/3.10.html).)

### typing

Основные изменения см. в [новых возможностях, связанных с аннотациями типов](https://python-all.ru/3.13/whatsnew/3.10.html#new-feat-related-type-hints).

Поведение [`typing.Literal`](https://python-all.ru/3.13/library/typing.html#typing.Literal) было изменено в соответствии с [**PEP 586**](https://python-all.ru/3.13/whatsnew/3.10.html) и для соответствия поведению статических анализаторов типов, описанному в PEP.

1. `Literal` теперь удаляет дубликаты параметров.
2. Проверки равенства между объектами `Literal` теперь не зависят от порядка.
3. Сравнения `Literal` теперь учитывают типы. Например, `Literal[0] == Literal[False]` ранее давало `True`. Теперь это `False`. Для поддержки этого изменения внутренний кеш типов теперь поддерживает различение типов.
4. Объекты `Literal` теперь будут вызывать исключение [`TypeError`](https://python-all.ru/3.13/library/exceptions.html#TypeError) при проверке равенства, если какой-либо из их параметров не является [хешируемым](https://python-all.ru/3.13/glossary.html#term-hashable). Обратите внимание, что объявление `Literal` с нехешируемыми параметрами не вызовет ошибку:

   ```python
   >>> 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](https://python-all.ru/3.13/whatsnew/3.10.html).)

Добавлена новая функция [`typing.is_typeddict()`](https://python-all.ru/3.13/library/typing.html#typing.is_typeddict) для проверки, является ли аннотация типом [`typing.TypedDict`](https://python-all.ru/3.13/library/typing.html#typing.TypedDict). (Предложено Патриком Ридером в [bpo-41792](https://python-all.ru/3.13/whatsnew/3.10.html).)

Подклассы `typing.Protocol`, которые объявляют только переменные данных, теперь будут вызывать `TypeError` при проверке с помощью `isinstance`, если они не декорированы [`runtime_checkable()`](https://python-all.ru/3.13/library/typing.html#typing.runtime_checkable). Ранее такие проверки проходили молча. Пользователям следует декорировать свои подклассы декоратором `runtime_checkable()`,\\если они хотят использовать протоколы времени выполнения. (Предложено Юрием Карабасом в [bpo-38908](https://python-all.ru/3.13/whatsnew/3.10.html).)

Импорт из подмодулей `typing.io` и `typing.re` теперь будет вызывать [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning). Эти подмодули устарели начиная с Python 3.8 и будут удалены в будущей версии Python. Все, что принадлежит этим подмодулям, следует импортировать напрямую из [`typing`](https://python-all.ru/3.13/library/typing.html#module-typing). (Предложено Sebastian Rittau в [bpo-38291](https://python-all.ru/3.13/whatsnew/3.10.html).)

### unittest

Добавлен новый метод [`assertNoLogs()`](https://python-all.ru/3.13/library/unittest.html#unittest.TestCase.assertNoLogs) в дополнение к существующему [`assertLogs()`](https://python-all.ru/3.13/library/unittest.html#unittest.TestCase.assertLogs). (Предложено Kit Yan Choi в [bpo-39385](https://python-all.ru/3.13/whatsnew/3.10.html).)

### urllib.parse

В версиях Python ниже 3.10 допускалось использование как `;`, так и `&` в качестве разделителей параметров запроса в [`urllib.parse.parse_qs()`](https://python-all.ru/3.13/library/urllib.parse.html#urllib.parse.parse_qs) и [`urllib.parse.parse_qsl()`](https://python-all.ru/3.13/library/urllib.parse.html#urllib.parse.parse_qsl). Из соображений безопасности и для соответствия новым рекомендациям W3C теперь разрешен только один разделитель, по умолчанию `&`. Это изменение также затрагивает `cgi.parse()` и `cgi.parse_multipart()`, так как они внутренне используют затронутые функции. Подробнее см. в их документации. (Предложено Adam Goldschmidt, Senthil Kumaran и Ken Jin в [bpo-42967](https://python-all.ru/3.13/whatsnew/3.10.html).)

Наличие символов новой строки или табуляции в частях URL допускает некоторые формы атак. Следуя спецификации WHATWG, обновляющей [**RFC 3986**](https://python-all.ru/3.13/whatsnew/3.10.html), символы ASCII новой строки `\n`, `\r` и табуляции `\t` удаляются из URL анализатором в [`urllib.parse`](https://python-all.ru/3.13/library/urllib.parse.html#module-urllib.parse), предотвращая такие атаки. Удаляемые символы контролируются новой переменной уровня модуля `urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE`. (См. [gh-88048](https://python-all.ru/3.13/whatsnew/3.10.html))

### xml

Добавлен класс [`LexicalHandler`](https://python-all.ru/3.13/library/xml.sax.handler.html#xml.sax.handler.LexicalHandler) в модуль [`xml.sax.handler`](https://python-all.ru/3.13/library/xml.sax.handler.html#module-xml.sax.handler). (Предложено Jonathan Gossage и Zackery Spytz в [bpo-35018](https://python-all.ru/3.13/whatsnew/3.10.html).)

### zipimport

Добавлены методы, связанные с [**PEP 451**](https://python-all.ru/3.13/whatsnew/3.10.html): [`find_spec()`](https://python-all.ru/3.13/library/zipimport.html#zipimport.zipimporter.find_spec), [`zipimport.zipimporter.create_module()`](https://python-all.ru/3.13/library/zipimport.html#zipimport.zipimporter.create_module) и [`zipimport.zipimporter.exec_module()`](https://python-all.ru/3.13/library/zipimport.html#zipimport.zipimporter.exec_module). (Предложено Brett Cannon в [bpo-42131](https://python-all.ru/3.13/whatsnew/3.10.html).)

Добавлен метод [`invalidate_caches()`](https://python-all.ru/3.13/library/zipimport.html#zipimport.zipimporter.invalidate_caches). (Предложено Desmond Cheong в [bpo-14678](https://python-all.ru/3.13/whatsnew/3.10.html).)

## Оптимизации

- Конструкторы [`str()`](https://python-all.ru/3.13/library/stdtypes.html#str), [`bytes()`](https://python-all.ru/3.13/library/stdtypes.html#bytes) и [`bytearray()`](https://python-all.ru/3.13/library/stdtypes.html#bytearray) теперь работают быстрее (примерно на 30–40% для маленьких объектов). (Предложено Serhiy Storchaka в [bpo-41334](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Модуль [`runpy`](https://python-all.ru/3.13/library/runpy.html#module-runpy) теперь импортирует меньше модулей. Время запуска команды `python3 -m module-name` в среднем в 1,4 раза быстрее. На Linux `python3 -I -m module-name` импортирует 69 модулей в Python 3.9, тогда как в Python 3.10 импортирует только 51 модуль (-18). (Предложено Victor Stinner в [bpo-41006](https://python-all.ru/3.13/whatsnew/3.10.html) и [bpo-41718](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Инструкция `LOAD_ATTR` теперь использует новый механизм «per opcode cache». Она работает примерно на 36% быстрее для обычных атрибутов и на 44% быстрее для слотов. (Предложено Pablo Galindo и Yury Selivanov в [bpo-42093](https://python-all.ru/3.13/whatsnew/3.10.html) и Guido van Rossum в [bpo-42927](https://python-all.ru/3.13/whatsnew/3.10.html), на основе идей, первоначально реализованных в PyPy и MicroPython.)
- При сборке Python с [`--enable-optimizations`](https://python-all.ru/3.13/using/configure.html#cmdoption-enable-optimizations) теперь `-fno-semantic-interposition` добавляется как в команду компиляции, так и в команду компоновки. Это ускоряет сборку интерпретатора Python, созданного с помощью [`--enable-shared`](https://python-all.ru/3.13/using/configure.html#cmdoption-enable-shared) с `gcc`, до 30%. См. [эту статью](https://python-all.ru/3.13/whatsnew/3.10.html) для подробностей. (Предложено Victor Stinner и Pablo Galindo в [bpo-38980](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Используется новый код управления выходным буфером для модулей [`bz2`](https://python-all.ru/3.13/library/bz2.html#module-bz2) / [`lzma`](https://python-all.ru/3.13/library/lzma.html#module-lzma) / [`zlib`](https://python-all.ru/3.13/library/zlib.html#module-zlib), и добавлена функция `.readall()` к классу `_compression.DecompressReader`. Распаковка bz2 теперь быстрее в 1,09x ~ 1,17x, распаковка lzma – в 1,20x ~ 1,32x, `GzipFile.read(-1)` – в 1,11x ~ 1,18x. (Предложено Ma Lin, проверено Gregory P. Smith, в [bpo-41486](https://python-all.ru/3.13/whatsnew/3.10.html))
- При использовании строковых аннотаций словари аннотаций для функций больше не создаются при создании функции. Вместо этого они хранятся в виде кортежа строк, и объект функции лениво преобразует его в словарь аннотаций по требованию. Эта оптимизация сокращает время CPU, необходимое для определения аннотированной функции, вдвое. (Предложено Yurii Karabas и Inada Naoki в [bpo-42202](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Функции поиска подстроки, такие как `str1 in str2` и `str2.find(str1)`, теперь иногда используют алгоритм поиска строк «Two-Way» Крочемора и Перрина, чтобы избежать квадратичного поведения на длинных строках. (Предложено Dennis Sweeney в [bpo-41972](https://python-all.ru/3.13/whatsnew/3.10.html))
- Добавлены микрооптимизации в `_PyType_Lookup()` для улучшения производительности поиска в кеше атрибутов типа в типичном случае попадания в кеш. Это делает интерпретатор в среднем в 1,04 раза быстрее. (Предложено Dino Viehland в [bpo-43452](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Следующие встроенные функции теперь поддерживают более быстрый соглашение вызова [**PEP 590**](https://python-all.ru/3.13/whatsnew/3.10.html) vectorcall: [`map()`](https://python-all.ru/3.13/library/functions.html#map), [`filter()`](https://python-all.ru/3.13/library/functions.html#filter), [`reversed()`](https://python-all.ru/3.13/library/functions.html#reversed), [`bool()`](https://python-all.ru/3.13/library/functions.html#bool) и [`float()`](https://python-all.ru/3.13/library/functions.html#float). (Предложено Donghee Na и Jeroen Demeyer в [bpo-43575](https://python-all.ru/3.13/whatsnew/3.10.html), [bpo-43287](https://python-all.ru/3.13/whatsnew/3.10.html), [bpo-41922](https://python-all.ru/3.13/whatsnew/3.10.html), [bpo-41873](https://python-all.ru/3.13/whatsnew/3.10.html) и [bpo-41870](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Производительность [`BZ2File`](https://python-all.ru/3.13/library/bz2.html#bz2.BZ2File) улучшена за счет удаления внутренних `RLock`. Это делает `BZ2File` потоконебезопасным при наличии нескольких одновременных читателей или писателей, как и его эквивалентные классы в [`gzip`](https://python-all.ru/3.13/library/gzip.html#module-gzip) и [`lzma`](https://python-all.ru/3.13/library/lzma.html#module-lzma) всегда были. (Предложено Inada Naoki в [bpo-43785](https://python-all.ru/3.13/whatsnew/3.10.html).)

## Устарело

- В настоящее время Python допускает числовые литералы, непосредственно после которых следуют ключевые слова, например `0in x`, `1or x`, `0if 1else 2`. Это приводит к появлению сбивающих с толку и неоднозначных выражений, таких как `[0x1for x in y]` (которые можно рассматривать как `[0x1 for x in y]` или `[0x1f or x in y]`). Начиная с этого выпуска, если за числовым литералом непосредственно следует одно из ключевых слов [`and`](https://python-all.ru/3.13/reference/expressions.html#and), [`else`](https://python-all.ru/3.13/reference/compound_stmts.html#else), [`for`](https://python-all.ru/3.13/reference/compound_stmts.html#for), [`if`](https://python-all.ru/3.13/reference/compound_stmts.html#if), [`in`](https://python-all.ru/3.13/reference/expressions.html#in), [`is`](https://python-all.ru/3.13/reference/expressions.html#is) и [`or`](https://python-all.ru/3.13/reference/expressions.html#or), выдаётся предупреждение об устаревании. В будущих выпусках оно будет заменено на синтаксическое предупреждение, а затем на синтаксическую ошибку. (Предложено Сергеем Сторчакой в [bpo-43833](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Начиная с этого выпуска будет предпринята согласованная работа по очистке старой семантики импорта, которая сохранялась для совместимости с Python 2.7. В частности, `find_loader()`/`find_module()` (заменено на [`find_spec()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.MetaPathFinder.find_spec)), [`load_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.load_module) (заменено на [`exec_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.exec_module)), `module_repr()` (о чём система импорта заботится сама), атрибут `__package__` (заменён на `__spec__.parent`), атрибут `__loader__` (заменён на `__spec__.loader`) и атрибут `__cached__` (заменён на `__spec__.cached`) будут постепенно удалены (а также другие классы и методы в [`importlib`](https://python-all.ru/3.13/library/importlib.html#module-importlib)). При необходимости будут выдаваться [`ImportWarning`](https://python-all.ru/3.13/library/exceptions.html#ImportWarning) и/или [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning), чтобы помочь определить код, требующий обновления в ходе этого перехода.
- Всё пространство имён `distutils` объявлено устаревшим и будет удалено в Python 3.12. Подробнее см. в разделе [изменения модулей](https://python-all.ru/3.13/whatsnew/3.10.html#distutils-deprecated).
- Нецелочисленные аргументы для [`random.randrange()`](https://python-all.ru/3.13/library/random.html#random.randrange) объявлены устаревшими. [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError) устарел в пользу [`TypeError`](https://python-all.ru/3.13/library/exceptions.html#TypeError). (Предложено Сергеем Сторчакой и Раймондом Хеттингером в [bpo-37319](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Различные методы `load_module()` класса [`importlib`](https://python-all.ru/3.13/library/importlib.html#module-importlib) были задокументированы как устаревшие, начиная с Python 3.6, но теперь они также будут вызывать [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning). Используйте вместо них [`exec_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.exec_module). (Предложено Бреттом Кэнноном в [bpo-26131](https://python-all.ru/3.13/whatsnew/3.10.html).)
- `zimport.zipimporter.load_module()` объявлен устаревшим в пользу [`exec_module()`](https://python-all.ru/3.13/library/zipimport.html#zipimport.zipimporter.exec_module). (Предложено Бреттом Кэнноном в [bpo-26131](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Использование [`load_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.load_module) системой импорта теперь вызывает [`ImportWarning`](https://python-all.ru/3.13/library/exceptions.html#ImportWarning), поскольку предпочтительнее использовать [`exec_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.exec_module). (Предложено Бреттом Кэнноном в [bpo-26131](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Использование `importlib.abc.MetaPathFinder.find_module()` и `importlib.abc.PathEntryFinder.find_module()` системой импорта теперь вызывает [`ImportWarning`](https://python-all.ru/3.13/library/exceptions.html#ImportWarning), поскольку предпочтительнее использовать [`importlib.abc.MetaPathFinder.find_spec()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.MetaPathFinder.find_spec) и [`importlib.abc.PathEntryFinder.find_spec()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.PathEntryFinder.find_spec) соответственно. Для помощи в переносе можно использовать [`importlib.util.spec_from_loader()`](https://python-all.ru/3.13/library/importlib.html#importlib.util.spec_from_loader). (Предложено Бреттом Кэнноном в [bpo-42134](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Использование `importlib.abc.PathEntryFinder.find_loader()` системой импорта теперь вызывает [`ImportWarning`](https://python-all.ru/3.13/library/exceptions.html#ImportWarning), поскольку предпочтительнее использовать [`importlib.abc.PathEntryFinder.find_spec()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.PathEntryFinder.find_spec). Для помощи в переносе можно использовать [`importlib.util.spec_from_loader()`](https://python-all.ru/3.13/library/importlib.html#importlib.util.spec_from_loader). (Предложено Бреттом Кэнноном в [bpo-43672](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Различные реализации `importlib.abc.MetaPathFinder.find_module()` ( `importlib.machinery.BuiltinImporter.find_module()`, `importlib.machinery.FrozenImporter.find_module()`, `importlib.machinery.WindowsRegistryFinder.find_module()`, `importlib.machinery.PathFinder.find_module()`, `importlib.abc.MetaPathFinder.find_module()` ), `importlib.abc.PathEntryFinder.find_module()` ( `importlib.machinery.FileFinder.find_module()` ) и `importlib.abc.PathEntryFinder.find_loader()` ( `importlib.machinery.FileFinder.find_loader()` ) теперь вызывают [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning) и планируются к удалению в Python 3.12 (ранее они были задокументированы как устаревшие в Python 3.4). (Предложено Бреттом Кэнноном в [bpo-42135](https://python-all.ru/3.13/whatsnew/3.10.html).)
- `importlib.abc.Finder` объявлен устаревшим (включая его единственный метод `find_module()`). Оба класса [`importlib.abc.MetaPathFinder`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.MetaPathFinder) и [`importlib.abc.PathEntryFinder`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.PathEntryFinder) больше не наследуются от этого класса. Вместо этого следует наследовать от одного из этих двух классов по ситуации. (Предложено Бреттом Кэнноном в [bpo-42135](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Уведомления об устаревании для `imp`, `importlib.find_loader()`, `importlib.util.set_package_wrapper()`, `importlib.util.set_loader_wrapper()`, `importlib.util.module_for_loader()`, `pkgutil.ImpImporter` и `pkgutil.ImpLoader` были обновлены: теперь в качестве планируемой версии удаления указан Python 3.12 (в предыдущих версиях Python они начали вызывать [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning)). (Предложено Бреттом Кэнноном в [bpo-43720](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Система импорта теперь использует атрибут `__spec__` у модулей, прежде чем обратиться к `module_repr()` для метода `__repr__()` модуля. Удаление использования `module_repr()` запланировано на Python 3.12. (Предложено Бреттом Кэнноном в [bpo-42137](https://python-all.ru/3.13/whatsnew/3.10.html).)
- `importlib.abc.Loader.module_repr()`, `importlib.machinery.FrozenLoader.module_repr()` и `importlib.machinery.BuiltinLoader.module_repr()` объявлены устаревшими и планируются к удалению в Python 3.12. (Предложено Бреттом Кэнноном в [bpo-42136](https://python-all.ru/3.13/whatsnew/3.10.html).)
- `sqlite3.OptimizedUnicode` не документирован и считается устаревшим начиная с Python 3.3, когда он стал псевдонимом для [`str`](https://python-all.ru/3.13/library/stdtypes.html#str). Теперь он объявлен устаревшим и запланирован к удалению в Python 3.12. (Предложено Эрлендом Э. Осландом в [bpo-42264](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Не документированная встроенная функция `sqlite3.enable_shared_cache` теперь объявлена устаревшей и запланирована к удалению в Python 3.12. Документация SQLite3 настоятельно не рекомендует её использовать. Подробнее см. в [документации SQLite3](https://python-all.ru/3.13/whatsnew/3.10.html). Если необходимо использовать общий кеш, откройте базу данных в режиме URI с помощью параметра запроса `cache=shared`. (Предложено Эрлендом Э. Осландом в [bpo-24464](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Следующие методы `threading` теперь объявлены устаревшими:

  - `threading.currentThread` =\> [`threading.current_thread()`](https://python-all.ru/3.13/library/threading.html#threading.current_thread)
  - `threading.activeCount` =\> [`threading.active_count()`](https://python-all.ru/3.13/library/threading.html#threading.active_count)
  - `threading.Condition.notifyAll` =\> [`threading.Condition.notify_all()`](https://python-all.ru/3.13/library/threading.html#threading.Condition.notify_all)
  - `threading.Event.isSet` =\> [`threading.Event.is_set()`](https://python-all.ru/3.13/library/threading.html#threading.Event.is_set)
  - `threading.Thread.setName` =\> [`threading.Thread.name`](https://python-all.ru/3.13/library/threading.html#threading.Thread.name)
  - `threading.thread.getName` =\> [`threading.Thread.name`](https://python-all.ru/3.13/library/threading.html#threading.Thread.name)
  - `threading.Thread.isDaemon` =\> [`threading.Thread.daemon`](https://python-all.ru/3.13/library/threading.html#threading.Thread.daemon)
  - `threading.Thread.setDaemon` =\> [`threading.Thread.daemon`](https://python-all.ru/3.13/library/threading.html#threading.Thread.daemon)

  (Предложено Йелле Зейлстрой в [gh-87889](https://python-all.ru/3.13/whatsnew/3.10.html).)
- `pathlib.Path.link_to()` объявлен устаревшим и запланирован к удалению в Python 3.12. Вместо него используйте [`pathlib.Path.hardlink_to()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.hardlink_to). (Предложено Барни Гейлом в [bpo-39950](https://python-all.ru/3.13/whatsnew/3.10.html).)
- `cgi.log()` объявлен устаревшим и запланирован к удалению в Python 3.12. (Предложено Инадой Наоки в [bpo-41139](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Следующие возможности [`ssl`](https://python-all.ru/3.13/library/ssl.html#module-ssl) объявлены устаревшими начиная с Python 3.6, Python 3.7 или OpenSSL 1.1.0 и будут удалены в 3.11:

  - `OP_NO_SSLv2`, `OP_NO_SSLv3`, `OP_NO_TLSv1`, `OP_NO_TLSv1_1`, `OP_NO_TLSv1_2` и `OP_NO_TLSv1_3` заменяются на [`minimum_version`](https://python-all.ru/3.13/library/ssl.html#ssl.SSLContext.minimum_version) и [`maximum_version`](https://python-all.ru/3.13/library/ssl.html#ssl.SSLContext.maximum_version).
  - `PROTOCOL_SSLv2`, `PROTOCOL_SSLv3`, `PROTOCOL_SSLv23`, `PROTOCOL_TLSv1`, `PROTOCOL_TLSv1_1`, `PROTOCOL_TLSv1_2` и `PROTOCOL_TLS` объявлены устаревшими в пользу [`PROTOCOL_TLS_CLIENT`](https://python-all.ru/3.13/library/ssl.html#ssl.PROTOCOL_TLS_CLIENT) и [`PROTOCOL_TLS_SERVER`](https://python-all.ru/3.13/library/ssl.html#ssl.PROTOCOL_TLS_SERVER)
  - `wrap_socket()` заменяется на [`ssl.SSLContext.wrap_socket()`](https://python-all.ru/3.13/library/ssl.html#ssl.SSLContext.wrap_socket)
  - `match_hostname()`
  - `RAND_pseudo_bytes()`, `RAND_egd()`
  - Возможности NPN, такие как [`ssl.SSLSocket.selected_npn_protocol()`](https://python-all.ru/3.13/library/ssl.html#ssl.SSLSocket.selected_npn_protocol) и [`ssl.SSLContext.set_npn_protocols()`](https://python-all.ru/3.13/library/ssl.html#ssl.SSLContext.set_npn_protocols), заменяются на ALPN.
- Отладка потоков (переменная окружения `PYTHONTHREADDEBUG`) объявлена устаревшей в Python 3.10 и будет удалена в Python 3.12. Эта возможность требует [отладочной сборки Python](https://python-all.ru/3.13/using/configure.html#debug-build). (Предложено Виктором Стиннером в [bpo-44584](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Импорт из подмодулей `typing.io` и `typing.re` теперь будет вызывать [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning). Эти подмодули будут удалены в будущей версии Python. Всё, что относится к этим подмодулям, следует импортировать напрямую из [`typing`](https://python-all.ru/3.13/library/typing.html#module-typing). (Предложено Себастьяном Риттау в [bpo-38291](https://python-all.ru/3.13/whatsnew/3.10.html).)

## Удалено

- Удалены специальные методы `__int__`, `__float__`, `__floordiv__`, `__mod__`, `__divmod__`, `__rfloordiv__`, `__rmod__` и `__rdivmod__` класса [`complex`](https://python-all.ru/3.13/library/functions.html#complex). Они всегда вызывали [`TypeError`](https://python-all.ru/3.13/library/exceptions.html#TypeError). (Предложено Сергеем Сторчакой в [bpo-41974](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Метод `ParserBase.error()` из приватного и недокументированного модуля `_markupbase` был удалён. [`html.parser.HTMLParser`](https://python-all.ru/3.13/library/html.parser.html#html.parser.HTMLParser) – единственный подкласс `ParserBase`, и его реализация `error()` уже была удалена в Python 3.5. (Предложено Беркером Пексагом в [bpo-31844](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Удалён атрибут `unicodedata.ucnhash_CAPI`, который был внутренним объектом PyCapsule. Соответствующая приватная структура `_PyUnicode_Name_CAPI` была перемещена во внутренний C API. (Предложено Виктором Стиннером в [bpo-42157](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Удалён модуль `parser`, который был объявлен устаревшим в версии 3.9 из-за перехода на новый PEG-парсер, а также все исходные C-файлы и заголовочные файлы, которые использовались только старым парсером, включая `node.h`, `parser.h`, `graminit.h` и `grammar.h`.
- Удалены функции публичного C API `PyParser_SimpleParseStringFlags`, `PyParser_SimpleParseStringFlagsFilename`, `PyParser_SimpleParseFileFlags` и `PyNode_Compile`, которые были объявлены устаревшими в версии 3.9 из-за перехода на новый PEG-парсер.
- Удалён модуль `formatter`, который был объявлен устаревшим в Python 3.4. Он несколько устарел, мало используется и не тестируется. Изначально его планировали удалить в Python 3.6, но такие удаления были отложены до окончания поддержки Python 2.7. Существующим пользователям следует скопировать используемые ими классы в свой код. (Авторы: Donghee Na и Terry J. Reedy в [bpo-42299](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Удалена функция `PyModule_GetWarningsModule()`, которая стала бесполезной после того, как модуль `_warnings` был преобразован во встроенный модуль в версии 2.6. (Автор: Hai Shi в [bpo-42599](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Удалены устаревшие псевдонимы для [абстрактных базовых классов коллекций](https://python-all.ru/3.13/library/collections.abc.html#collections-abstract-base-classes) из модуля [`collections`](https://python-all.ru/3.13/library/collections.html#module-collections). (Автор: Victor Stinner в [bpo-37324](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Параметр `loop` был удалён из большинства [высокоуровневого API](https://python-all.ru/3.13/library/asyncio-api-index.html) [`asyncio`](https://python-all.ru/3.13/library/asyncio.html#module-asyncio) после объявления устаревшим в Python 3.8. Причины этого изменения многообразны:

  1. Это упрощает высокоуровневый API.
  2. Функции высокоуровневого API неявно получают работающий цикл событий текущего потока, начиная с Python 3.7. В большинстве обычных случаев нет необходимости передавать цикл событий в API.
  3. Передача цикла событий чревата ошибками, особенно при работе с циклами, выполняющимися в разных потоках.

  Обратите внимание: низкоуровневый API по-прежнему принимает `loop`. Примеры замены существующего кода см. в разделе [Изменения в Python API](https://python-all.ru/3.13/whatsnew/3.10.html#changes-python-api).

  (Авторы: Yurii Karabas, Andrew Svetlov, Yury Selivanov и Kyle Stanley в [bpo-42392](https://python-all.ru/3.13/whatsnew/3.10.html).)

## Перенос на Python 3.10

В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.

### Изменения в синтаксисе Python

- Теперь выдаётся предупреждение об устаревании при компиляции ранее допустимого синтаксиса, если числовой литерал непосредственно предшествует ключевому слову (как в `0in x`). В будущих версиях это станет синтаксическим предупреждением, а затем синтаксической ошибкой. Чтобы избавиться от предупреждения и обеспечить совместимость с будущими версиями, просто добавьте пробел между числовым литералом и следующим ключевым словом. (Автор: Serhiy Storchaka в [bpo-43833](https://python-all.ru/3.13/whatsnew/3.10.html).)

### Изменения в Python API

- Параметры *etype* функций [`format_exception()`](https://python-all.ru/3.13/library/traceback.html#traceback.format_exception), [`format_exception_only()`](https://python-all.ru/3.13/library/traceback.html#traceback.format_exception_only) и [`print_exception()`](https://python-all.ru/3.13/library/traceback.html#traceback.print_exception) в модуле [`traceback`](https://python-all.ru/3.13/library/traceback.html#module-traceback) переименованы в *exc*. (Авторы: Zackery Spytz и Matthias Bussonnier в [bpo-26389](https://python-all.ru/3.13/whatsnew/3.10.html).)
- [`atexit`](https://python-all.ru/3.13/library/atexit.html#module-atexit): При завершении Python, если колбэк, зарегистрированный с помощью [`atexit.register()`](https://python-all.ru/3.13/library/atexit.html#atexit.register), завершается ошибкой, его исключение теперь записывается в журнал. Ранее регистрировались только некоторые исключения, а последнее исключение всегда молча игнорировалось. (Автор: Victor Stinner в [bpo-42639](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Обобщённый тип [`collections.abc.Callable`](https://python-all.ru/3.13/library/collections.abc.html#collections.abc.Callable) теперь уплощает параметры типа, аналогично тому, что делает [`typing.Callable`](https://python-all.ru/3.13/library/typing.html#typing.Callable). Это означает, что `collections.abc.Callable[[int, str], str]` будет иметь `__args__` из `(int, str, str)`; ранее это было `([int, str], str)`. Код, обращающийся к аргументам через [`typing.get_args()`](https://python-all.ru/3.13/library/typing.html#typing.get_args) или `__args__`, должен учитывать это изменение. Кроме того, [`TypeError`](https://python-all.ru/3.13/library/exceptions.html#TypeError) может быть возбуждено для некорректных форм параметризации `collections.abc.Callable`, которые в Python 3.9 могли проходить незамеченными. (Автор: Ken Jin в [bpo-42195](https://python-all.ru/3.13/whatsnew/3.10.html).)
- [`socket.htons()`](https://python-all.ru/3.13/library/socket.html#socket.htons) и [`socket.ntohs()`](https://python-all.ru/3.13/library/socket.html#socket.ntohs) теперь возбуждают [`OverflowError`](https://python-all.ru/3.13/library/exceptions.html#OverflowError) вместо [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning), если заданный параметр не помещается в 16-битное целое без знака. (Автор: Erlend E. Aasland в [bpo-42393](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Параметр `loop` был удалён из большинства [высокоуровневого API](https://python-all.ru/3.13/library/asyncio-api-index.html) [`asyncio`](https://python-all.ru/3.13/library/asyncio.html#module-asyncio) после объявления устаревшим в Python 3.8.

  Корутина, которая сейчас выглядит так:

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

  Должна быть заменена на:

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

  Если `foo()` была специально спроектирована *не* для работы в работающем цикле событий текущего потока (например, для работы в цикле событий другого потока), рассмотрите возможность использования [`asyncio.run_coroutine_threadsafe()`](https://python-all.ru/3.13/library/asyncio-task.html#asyncio.run_coroutine_threadsafe) вместо этого.

  (Авторы: Yurii Karabas, Andrew Svetlov, Yury Selivanov и Kyle Stanley в [bpo-42392](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Конструктор [`types.FunctionType`](https://python-all.ru/3.13/library/types.html#types.FunctionType) теперь наследует текущие встроенные функции, если словарь *globals* не содержит ключа `"__builtins__"`, вместо использования `{"None": None}` в качестве встроенных функций: такое же поведение, как у функций [`eval()`](https://python-all.ru/3.13/library/functions.html#eval) и [`exec()`](https://python-all.ru/3.13/library/functions.html#exec). Определение функции с помощью `def function(...): ...` в Python не затрагивается, глобальные переменные не могут быть переопределены этим синтаксисом: он также наследует текущие встроенные функции. (Автор: Victor Stinner в [bpo-42990](https://python-all.ru/3.13/whatsnew/3.10.html).)

### Изменения в C API

- Функции C API `PyParser_SimpleParseStringFlags`, `PyParser_SimpleParseStringFlagsFilename`, `PyParser_SimpleParseFileFlags`, `PyNode_Compile` и тип, используемый этими функциями, `struct _node`, были удалены из-за перехода на новый PEG-парсер.

  Исходный код теперь следует компилировать непосредственно в объект кода, например, с помощью [`Py_CompileString()`](https://python-all.ru/3.13/c-api/veryhigh.html#c.Py_CompileString). Полученный объект кода затем можно выполнить, например, с помощью [`PyEval_EvalCode()`](https://python-all.ru/3.13/c-api/veryhigh.html#c.PyEval_EvalCode).

  В частности:

  - Вызов `PyParser_SimpleParseStringFlags` с последующим `PyNode_Compile` можно заменить вызовом [`Py_CompileString()`](https://python-all.ru/3.13/c-api/veryhigh.html#c.Py_CompileString).
  - Прямой замены для `PyParser_SimpleParseFileFlags` не существует. Чтобы скомпилировать код из аргумента `FILE *`, вам нужно будет прочитать файл на C и передать полученный буфер в [`Py_CompileString()`](https://python-all.ru/3.13/c-api/veryhigh.html#c.Py_CompileString).
  - Чтобы скомпилировать файл по заданному имени файла `char *`, необходимо явно открыть файл, прочитать его и скомпилировать результат. Один из способов – использовать модуль [`io`](https://python-all.ru/3.13/library/io.html#module-io) с функциями [`PyImport_ImportModule()`](https://python-all.ru/3.13/c-api/import.html#c.PyImport_ImportModule), [`PyObject_CallMethod()`](https://python-all.ru/3.13/c-api/call.html#c.PyObject_CallMethod), [`PyBytes_AsString()`](https://python-all.ru/3.13/c-api/bytes.html#c.PyBytes_AsString) и [`Py_CompileString()`](https://python-all.ru/3.13/c-api/veryhigh.html#c.Py_CompileString), как показано ниже. (Объявления и обработка ошибок опущены.)

    ```python
    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);
    ```
  - Для объектов `FrameObject` член [`f_lasti`](https://python-all.ru/3.13/reference/datamodel.html#frame.f_lasti) теперь представляет смещение в wordcode, а не просто смещение в строке байткода. Это означает, что это число необходимо умножить на 2 для использования с API, которые ожидают смещение в байтах (например, [`PyCode_Addr2Line()`](https://python-all.ru/3.13/c-api/code.html#c.PyCode_Addr2Line)). Также обратите внимание, что член `f_lasti` объектов `FrameObject` не считается стабильным: используйте вместо него [`PyFrame_GetLineNumber()`](https://python-all.ru/3.13/c-api/frame.html#c.PyFrame_GetLineNumber).

## Изменения байткода CPython

- Инструкция `MAKE_FUNCTION` теперь принимает в качестве аннотаций функции либо словарь, либо кортеж строк. (Предложено Юрием Карабасом и Инадой Наоки в [bpo-42202](https://python-all.ru/3.13/whatsnew/3.10.html).)

## Изменения сборки

- [**PEP 644**](https://python-all.ru/3.13/whatsnew/3.10.html): Python теперь требует OpenSSL 1.1.1 или новее. OpenSSL 1.0.2 больше не поддерживается. (Предложено Кристианом Хаймсом в [bpo-43669](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Для сборки Python теперь требуются функции C99 `snprintf()` и `vsnprintf()`. (Предложено Виктором Штиннером в [bpo-36020](https://python-all.ru/3.13/whatsnew/3.10.html).)
- [`sqlite3`](https://python-all.ru/3.13/library/sqlite3.html#module-sqlite3) требует SQLite 3.7.15 или выше. (Предложено Сергеем Федосеевым и Эрлендом Э. Аасландом в [bpo-40744](https://python-all.ru/3.13/whatsnew/3.10.html) и [bpo-40810](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Модуль [`atexit`](https://python-all.ru/3.13/library/atexit.html#module-atexit) теперь всегда должен быть встроенным модулем. (Предложено Виктором Штиннером в [bpo-42639](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Добавлена опция [`--disable-test-modules`](https://python-all.ru/3.13/using/configure.html#cmdoption-disable-test-modules) в скрипт `configure`: не собирать и не устанавливать тестовые модули. (Предложено Ксавье де Гаем, Томасом Петаззони и Пейсином Сином в [bpo-27640](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Добавлен [`--with-wheel-pkg-dir=PATH option`](https://python-all.ru/3.13/using/configure.html#cmdoption-with-wheel-pkg-dir) в скрипт `./configure`. Если указано, модуль [`ensurepip`](https://python-all.ru/3.13/library/ensurepip.html#module-ensurepip) ищет колесные пакеты `setuptools` и `pip` в этом каталоге: если оба присутствуют, эти колесные пакеты используются вместо встроенных колесных пакетов ensurepip.

  Некоторые политики упаковки дистрибутивов Linux рекомендуют не включать зависимости. Например, Fedora устанавливает пакеты wheel в каталог `/usr/share/python-wheels/` и не устанавливает пакет `ensurepip._bundled`.

  (Предложено Виктором Штиннером в [bpo-42856](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Добавлена новая [`configure --without-static-libpython option`](https://python-all.ru/3.13/using/configure.html#cmdoption-without-static-libpython), чтобы не собирать статическую библиотеку `libpythonMAJOR.MINOR.a` и не устанавливать объектный файл `python.o`.

  (Предложено Виктором Штиннером в [bpo-43103](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Скрипт `configure` теперь использует утилиту `pkg-config`, если она доступна, для определения местоположения заголовков и библиотек Tcl/Tk. Как и раньше, эти местоположения можно указать явно с помощью опций конфигурации `--with-tcltk-includes` и `--with-tcltk-libs`. (Предложено Манолисом Стаматогианнакисом в [bpo-42603](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Добавлена опция [`--with-openssl-rpath`](https://python-all.ru/3.13/using/configure.html#cmdoption-with-openssl-rpath) в скрипт `configure`. Эта опция упрощает сборку Python с пользовательской установкой OpenSSL, например `./configure --with-openssl=/path/to/openssl --with-openssl-rpath=auto`. (Предложено Кристианом Хаймсом в [bpo-43466](https://python-all.ru/3.13/whatsnew/3.10.html).)

## Изменения C API

### PEP 652: Поддержание стабильного ABI

Стабильный ABI (интерфейс двоичного кода приложений) для модулей расширения или встраивания Python теперь явно определён. [Стабильность C API](https://python-all.ru/3.13/c-api/stable.html#stable) описывает гарантии стабильности C API и ABI, а также лучшие практики использования стабильного ABI.

(Предложено Петром Викториным в [**PEP 652**](https://python-all.ru/3.13/whatsnew/3.10.html) и [bpo-43795](https://python-all.ru/3.13/whatsnew/3.10.html).)

### Новые возможности

- Результат [`PyNumber_Index()`](https://python-all.ru/3.13/c-api/number.html#c.PyNumber_Index) теперь всегда имеет точный тип [`int`](https://python-all.ru/3.13/library/functions.html#int). Ранее результатом мог быть экземпляр подкласса `int`. (Предложено Сергеем Сторчакой в [bpo-40792](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Добавлен новый член [`orig_argv`](https://python-all.ru/3.13/c-api/init_config.html#c.PyConfig.orig_argv) в структуру [`PyConfig`](https://python-all.ru/3.13/c-api/init_config.html#c.PyConfig): список исходных аргументов командной строки, переданных исполняемому файлу Python. (Предложено Виктором Штиннером в [bpo-23427](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Добавлены макросы [`PyDateTime_DATE_GET_TZINFO()`](https://python-all.ru/3.13/c-api/datetime.html#c.PyDateTime_DATE_GET_TZINFO) и [`PyDateTime_TIME_GET_TZINFO()`](https://python-all.ru/3.13/c-api/datetime.html#c.PyDateTime_TIME_GET_TZINFO) для доступа к атрибутам `tzinfo` объектов [`datetime.datetime`](https://python-all.ru/3.13/library/datetime.html#datetime.datetime) и [`datetime.time`](https://python-all.ru/3.13/library/datetime.html#datetime.time). (Предложено Закери Спайтцем в [bpo-30155](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Добавлена функция [`PyCodec_Unregister()`](https://python-all.ru/3.13/c-api/codec.html#c.PyCodec_Unregister) для отмены регистрации функции поиска кодеков. (Предложено Хай Ши в [bpo-41842](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Добавлена функция [`PyIter_Send()`](https://python-all.ru/3.13/c-api/iter.html#c.PyIter_Send), позволяющая отправить значение в итератор без возбуждения исключения `StopIteration`. (Предложено Владимиром Матвеевым в [bpo-41756](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Добавлен [`PyUnicode_AsUTF8AndSize()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_AsUTF8AndSize) в ограниченный C API. (Предложено Алексом Гейнором в [bpo-41784](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Добавлена функция [`PyModule_AddObjectRef()`](https://python-all.ru/3.13/c-api/module.html#c.PyModule_AddObjectRef): похожа на [`PyModule_AddObject()`](https://python-all.ru/3.13/c-api/module.html#c.PyModule_AddObject), но не крадёт ссылку на значение при успехе. (Предложено Виктором Штиннером в [bpo-1635741](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Добавлены функции [`Py_NewRef()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_NewRef) и [`Py_XNewRef()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_XNewRef) для увеличения счётчика ссылок объекта и возврата объекта. (Предложено Виктором Штиннером в [bpo-42262](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Функции [`PyType_FromSpecWithBases()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_FromSpecWithBases) и [`PyType_FromModuleAndSpec()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_FromModuleAndSpec) теперь принимают один класс в качестве аргумента *bases*. (Предложено Сергеем Сторчакой в [bpo-42423](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Функция [`PyType_FromModuleAndSpec()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_FromModuleAndSpec) теперь принимает NULL-слот `tp_doc`. (Предложено Хай Ши в [bpo-41832](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Функция [`PyType_GetSlot()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_GetSlot) может принимать [статические типы](https://python-all.ru/3.13/c-api/typeobj.html#static-types). (Предложено Хай Ши и Петром Викториным в [bpo-41073](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Добавлена новая функция [`PySet_CheckExact()`](https://python-all.ru/3.13/c-api/set.html#c.PySet_CheckExact) в C-API, проверяющая, является ли объект экземпляром [`set`](https://python-all.ru/3.13/library/stdtypes.html#set), но не экземпляром подтипа. (Автор: Pablo Galindo в [bpo-43277](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Добавлена функция [`PyErr_SetInterruptEx()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_SetInterruptEx), позволяющая передавать номер сигнала для имитации. (Автор: Antoine Pitrou в [bpo-43356](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Ограниченный C-API теперь поддерживается, если [Python собран в режиме отладки](https://python-all.ru/3.13/using/configure.html#debug-build) (если определён макрос `Py_DEBUG`). В ограниченном C-API функции [`Py_INCREF()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_INCREF) и [`Py_DECREF()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_DECREF) теперь реализованы как вызовы непрозрачных функций, а не как прямой доступ к члену [`PyObject.ob_refcnt`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyObject.ob_refcnt), если Python собран в режиме отладки и макрос `Py_LIMITED_API` нацелен на Python 3.10 или новее. Поддержка ограниченного C-API в режиме отладки стала возможна благодаря тому, что структура [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) одинакова в релизном и отладочном режимах начиная с Python 3.8 (см. [bpo-36465](https://python-all.ru/3.13/whatsnew/3.10.html)).

  Ограниченный C-API по-прежнему не поддерживается в специальной сборке [`--with-trace-refs`](https://python-all.ru/3.13/using/configure.html#cmdoption-with-trace-refs) (макрос `Py_TRACE_REFS`). (Автор: Victor Stinner в [bpo-43688](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Добавлена функция [`Py_Is(x, y)`](https://python-all.ru/3.13/c-api/structures.html#c.Py_Is) для проверки, является ли объект *x* тем же объектом *y*, что аналогично `x is y` в Python. Также добавлены функции [`Py_IsNone()`](https://python-all.ru/3.13/c-api/structures.html#c.Py_IsNone), [`Py_IsTrue()`](https://python-all.ru/3.13/c-api/structures.html#c.Py_IsTrue), [`Py_IsFalse()`](https://python-all.ru/3.13/c-api/structures.html#c.Py_IsFalse) для проверки, является ли объект соответственно синглтоном `None`, синглтоном `True` или синглтоном `False`. (Автор: Victor Stinner в [bpo-43753](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Добавлены новые функции для управления сборщиком мусора из C-кода: [`PyGC_Enable()`](https://python-all.ru/3.13/c-api/gcsupport.html#c.PyGC_Enable), [`PyGC_Disable()`](https://python-all.ru/3.13/c-api/gcsupport.html#c.PyGC_Disable), [`PyGC_IsEnabled()`](https://python-all.ru/3.13/c-api/gcsupport.html#c.PyGC_IsEnabled). Эти функции позволяют активировать, деактивировать и запрашивать состояние сборщика мусора из C-кода без необходимости импорта модуля [`gc`](https://python-all.ru/3.13/library/gc.html#module-gc).
- Добавлен новый флаг типа [`Py_TPFLAGS_DISALLOW_INSTANTIATION`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_DISALLOW_INSTANTIATION) для запрета создания экземпляров типа. (Автор: Victor Stinner в [bpo-43916](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Добавлен новый флаг типа [`Py_TPFLAGS_IMMUTABLETYPE`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_IMMUTABLETYPE) для создания неизменяемых объектов типа: атрибуты типа нельзя ни установить, ни удалить. (Авторы: Victor Stinner и Erlend E. Aasland в [bpo-43908](https://python-all.ru/3.13/whatsnew/3.10.html).)

### Перенос на Python 3.10

- Теперь для использования форматов [`PyArg_ParseTuple()`](https://python-all.ru/3.13/c-api/arg.html#c.PyArg_ParseTuple) и [`Py_BuildValue()`](https://python-all.ru/3.13/c-api/arg.html#c.Py_BuildValue), которые используют `#`, должен быть определён макрос `PY_SSIZE_T_CLEAN`: `es#`, `et#`, `s#`, `u#`, `y#`, `z#`, `U#` и `Z#`. См. [Разбор аргументов и формирование значений](https://python-all.ru/3.13/c-api/arg.html#arg-parsing) и [**PEP 353**](https://python-all.ru/3.13/whatsnew/3.10.html). (Автор: Victor Stinner в [bpo-40943](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Поскольку [`Py_REFCNT()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_REFCNT) изменена на встраиваемую статическую функцию, `Py_REFCNT(obj) = new_refcnt` должна быть заменена на `Py_SET_REFCNT(obj, new_refcnt)`: см. [`Py_SET_REFCNT()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_SET_REFCNT) (доступно начиная с Python 3.9). Для обратной совместимости может использоваться этот макрос:

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

  (Автор: Victor Stinner в [bpo-39573](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Вызов [`PyDict_GetItem()`](https://python-all.ru/3.13/c-api/dict.html#c.PyDict_GetItem) без удержания [GIL](https://python-all.ru/3.13/glossary.html#term-GIL) ранее допускался по историческим причинам. Теперь это запрещено. (Автор: Victor Stinner в [bpo-40839](https://python-all.ru/3.13/whatsnew/3.10.html).)
- `PyUnicode_FromUnicode(NULL, size)` и `PyUnicode_FromStringAndSize(NULL, size)` теперь возбуждают `DeprecationWarning`. Для выделения объекта Unicode без начальных данных используйте [`PyUnicode_New()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_New). (Автор: Inada Naoki в [bpo-36346](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Приватная структура `_PyUnicode_Name_CAPI` `unicodedata.ucnhash_CAPI` API PyCapsule перемещена во внутренний C-API. (Автор: Victor Stinner в [bpo-42157](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Функции [`Py_GetPath()`](https://python-all.ru/3.13/c-api/init.html#c.Py_GetPath), [`Py_GetPrefix()`](https://python-all.ru/3.13/c-api/init.html#c.Py_GetPrefix), [`Py_GetExecPrefix()`](https://python-all.ru/3.13/c-api/init.html#c.Py_GetExecPrefix), [`Py_GetProgramFullPath()`](https://python-all.ru/3.13/c-api/init.html#c.Py_GetProgramFullPath), [`Py_GetPythonHome()`](https://python-all.ru/3.13/c-api/init.html#c.Py_GetPythonHome) и [`Py_GetProgramName()`](https://python-all.ru/3.13/c-api/init.html#c.Py_GetProgramName) теперь возвращают `NULL`, если они вызваны до [`Py_Initialize()`](https://python-all.ru/3.13/c-api/init.html#c.Py_Initialize) (до инициализации Python). Используйте новый API [Начальная конфигурация Python](https://python-all.ru/3.13/c-api/init_config.html#init-config) для получения [Конфигурации путей Python](https://python-all.ru/3.13/c-api/init_config.html#init-path-config). (Автор: Victor Stinner в [bpo-42260](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Макросы [`PyList_SET_ITEM()`](https://python-all.ru/3.13/c-api/list.html#c.PyList_SET_ITEM), [`PyTuple_SET_ITEM()`](https://python-all.ru/3.13/c-api/tuple.html#c.PyTuple_SET_ITEM) и [`PyCell_SET()`](https://python-all.ru/3.13/c-api/cell.html#c.PyCell_SET) больше нельзя использовать в качестве l-value или r-value. Например, `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](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Файлы `odictobject.h`, `parser_interface.h`, `picklebufobject.h`, `pyarena.h`, `pyctype.h`, `pydebug.h`, `pyfpe.h` и `pytime.h` (не входящие в ограниченный API) перемещены в каталог `Include/cpython`. Эти файлы не следует включать напрямую, поскольку они уже включены в `Python.h`; см. [Файлы для включения](https://python-all.ru/3.13/c-api/intro.html#api-includes). Если они были включены напрямую, рассмотрите включение `Python.h` вместо этого. (Автор: Nicholas Sim в [bpo-35134](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Используйте флаг типа [`Py_TPFLAGS_IMMUTABLETYPE`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_IMMUTABLETYPE) для создания неизменяемых объектов типа. Не полагайтесь на [`Py_TPFLAGS_HEAPTYPE`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HEAPTYPE), чтобы определить, является ли объект типа изменяемым; вместо этого проверяйте, установлен ли `Py_TPFLAGS_IMMUTABLETYPE`. (Авторы: Victor Stinner и Erlend E. Aasland в [bpo-43908](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Незадокументированная функция `Py_FrozenMain` удалена из ограниченного API. Эта функция в основном полезна для пользовательских сборок Python. (Автор: Petr Viktorin в [bpo-26241](https://python-all.ru/3.13/whatsnew/3.10.html).)

### Устарело

- Функция `PyUnicode_InternImmortal()` теперь устарела и будет удалена в Python 3.12; используйте [`PyUnicode_InternInPlace()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_InternInPlace) вместо неё. (Автор: Victor Stinner в [bpo-41692](https://python-all.ru/3.13/whatsnew/3.10.html).)

### Удалено

- Удалены функции `Py_UNICODE_str*`, работающие со строками `Py_UNICODE*`. (Автор: Inada Naoki в [bpo-41123](https://python-all.ru/3.13/whatsnew/3.10.html).)

  - `Py_UNICODE_strlen`: используйте [`PyUnicode_GetLength()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_GetLength) или [`PyUnicode_GET_LENGTH`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_GET_LENGTH)
  - `Py_UNICODE_strcat`: используйте [`PyUnicode_CopyCharacters()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_CopyCharacters) или [`PyUnicode_FromFormat()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_FromFormat)
  - `Py_UNICODE_strcpy`, `Py_UNICODE_strncpy`: используйте [`PyUnicode_CopyCharacters()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_CopyCharacters) или [`PyUnicode_Substring()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_Substring)
  - `Py_UNICODE_strcmp`: используйте [`PyUnicode_Compare()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_Compare)
  - `Py_UNICODE_strncmp`: используйте [`PyUnicode_Tailmatch()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_Tailmatch)
  - `Py_UNICODE_strchr`, `Py_UNICODE_strrchr`: используйте [`PyUnicode_FindChar()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_FindChar)
- Удалена `PyUnicode_GetMax()`. Переходите на новые API ([**PEP 393**](https://python-all.ru/3.13/whatsnew/3.10.html)). (Автор: Inada Naoki в [bpo-41103](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Удалена `PyLong_FromUnicode()`. Переходите на [`PyLong_FromUnicodeObject()`](https://python-all.ru/3.13/c-api/long.html#c.PyLong_FromUnicodeObject). (Автор: Inada Naoki в [bpo-41103](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Удалено `PyUnicode_AsUnicodeCopy()`. Используйте [`PyUnicode_AsUCS4Copy()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_AsUCS4Copy) или [`PyUnicode_AsWideCharString()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_AsWideCharString) (Автор: Inada Naoki, [bpo-41103](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Удалена переменная `_Py_CheckRecursionLimit`: она заменена на `ceval.recursion_limit` структуры [`PyInterpreterState`](https://python-all.ru/3.13/c-api/init.html#c.PyInterpreterState). (Автор: Victor Stinner, [bpo-41834](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Удалены недокументированные макросы `Py_ALLOW_RECURSION` и `Py_END_ALLOW_RECURSION`, а также поле `recursion_critical` структуры [`PyInterpreterState`](https://python-all.ru/3.13/c-api/init.html#c.PyInterpreterState). (Автор: Serhiy Storchaka, [bpo-41936](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Удалена недокументированная функция `PyOS_InitInterrupts()`. При инициализации Python уже неявно устанавливает обработчики сигналов: см. [`PyConfig.install_signal_handlers`](https://python-all.ru/3.13/c-api/init_config.html#c.PyConfig.install_signal_handlers). (Автор: Victor Stinner, [bpo-41713](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Remove the `PyAST_Validate()` function. It is no longer possible to build a AST object (`mod_ty` type) with the public C API. The function was already excluded from the limited C API ([**PEP 384**](https://python-all.ru/3.13/whatsnew/3.10.html)). (Contributed by Victor Stinner in [bpo-43244](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Удалены заголовочный файл `symtable.h` и недокументированные функции:

  - `PyST_GetScope()`
  - `PySymtable_Build()`
  - `PySymtable_BuildObject()`
  - `PySymtable_Free()`
  - `Py_SymtableString()`
  - `Py_SymtableStringObject()`

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

  Вместо этого используйте модуль Python [`symtable`](https://python-all.ru/3.13/library/symtable.html#module-symtable). (Автор: Victor Stinner, [bpo-43244](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Удалён [`PyOS_ReadlineFunctionPointer()`](https://python-all.ru/3.13/c-api/veryhigh.html#c.PyOS_ReadlineFunctionPointer) из заголовков ограниченного C API и из `python3.dll` (библиотеки, предоставляющей стабильный ABI в Windows). Поскольку функция принимает аргумент `FILE*`, её стабильность ABI не может быть гарантирована. (Автор: Petr Viktorin, [bpo-43868](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Удалены заголовочные файлы `ast.h`, `asdl.h` и `Python-ast.h`. Эти функции были недокументированы и исключены из ограниченного C API. Большинство имён, определённых в этих заголовочных файлах, не имели префикса `Py` и поэтому могли создавать конфликты имён. Например, `Python-ast.h` определял макрос `Yield`, который конфликтовал с именем `Yield`, используемым заголовком Windows `<winbase.h>`. Вместо этого используйте модуль Python [`ast`](https://python-all.ru/3.13/library/ast.html#module-ast). (Автор: Victor Stinner, [bpo-43244](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Удалены функции компилятора и парсера, использующие тип `struct _mod`, так как публичный C API для AST был удалён:

  - `PyAST_Compile()`
  - `PyAST_CompileEx()`
  - `PyAST_CompileObject()`
  - `PyFuture_FromAST()`
  - `PyFuture_FromASTObject()`
  - `PyParser_ASTFromFile()`
  - `PyParser_ASTFromFileObject()`
  - `PyParser_ASTFromFilename()`
  - `PyParser_ASTFromString()`
  - `PyParser_ASTFromStringObject()`

  Эти функции были недокументированы и исключены из ограниченного C API. (Автор: Victor Stinner, [bpo-43244](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Удалён заголовочный файл `pyarena.h` с функциями:

  - `PyArena_New()`
  - `PyArena_Free()`
  - `PyArena_Malloc()`
  - `PyArena_AddPyObject()`

  Эти функции были недокументированы, исключены из ограниченного C API и использовались только внутри компилятора. (Автор: Victor Stinner, [bpo-43244](https://python-all.ru/3.13/whatsnew/3.10.html).)
- Элемент `PyThreadState.use_tracing` удалён для оптимизации Python. (Автор: Mark Shannon, [bpo-43760](https://python-all.ru/3.13/whatsnew/3.10.html).)

## Важная функция безопасности в 3.10.7

Преобразование между [`int`](https://python-all.ru/3.13/library/functions.html#int) и [`str`](https://python-all.ru/3.13/library/stdtypes.html#str) по основаниям, отличным от 2 (двоичное), 4, 8 (восьмеричное), 16 (шестнадцатеричное) или 32, таким как основание 10 (десятичное), теперь вызывает [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError), если количество цифр в строковом представлении превышает лимит, чтобы избежать потенциальных атак типа «отказ в обслуживании» из-за алгоритмической сложности. Это смягчение для [**CVE 2020-10735**](https://python-all.ru/3.13/whatsnew/3.10.html). Этот лимит можно настроить или отключить с помощью переменной окружения, флага командной строки или API [`sys`](https://python-all.ru/3.13/library/sys.html#module-sys). См. документацию [ограничения длины строкового представления целых чисел](https://python-all.ru/3.13/library/stdtypes.html#int-max-str-digits). Лимит по умолчанию – 4300 цифр в строковом представлении.

## Важная функция безопасности в 3.10.8

Устаревший модуль `mailcap` теперь отказывается внедрять небезопасный текст (имена файлов, MIME-типы, параметры) в команды оболочки. Вместо использования такого текста он выдаст предупреждение и будет действовать так, как если бы совпадение не было найдено (или для тестовых команд, как если бы тест провалился). (Автор: Petr Viktorin, [gh-98966](https://python-all.ru/3.13/whatsnew/3.10.html).)

## Важные изменения в 3.10.12

### tarfile

- Методы извлечения в [`tarfile`](https://python-all.ru/3.13/library/tarfile.html#module-tarfile) и [`shutil.unpack_archive()`](https://python-all.ru/3.13/library/shutil.html#shutil.unpack_archive) получили новый аргумент *filter*, позволяющий ограничивать возможности tar, которые могут быть неожиданными или опасными, например создание файлов за пределами целевого каталога. Подробнее см. [Extraction filters](https://python-all.ru/3.13/library/tarfile.html#tarfile-extraction-filter). В Python 3.12 использование без аргумента *filter* вызовет [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning). В Python 3.14 значение по умолчанию будет изменено на `'data'`. (Автор: Petr Viktorin в [**PEP 706**](https://python-all.ru/3.13/whatsnew/3.10.html).)
