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

---

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

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

Pablo Galindo Salgado

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

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

- Python 3.11 работает на 10–60% быстрее Python 3.10. В среднем по стандартному набору тестов ускорение составило 1,25 раза. Подробнее см. [Faster CPython](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-faster-cpython).

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

- [PEP 654: Группы исключений и except\*](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-pep654)

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

- [PEP 678: Исключения можно дополнять примечаниями](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-pep678)

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

- [**PEP 680**](https://python-all.ru/3.16/whatsnew/3.11.html): [`tomllib`](https://python-all.ru/3.16/library/tomllib.html#module-tomllib) – Поддержка разбора [TOML](https://python-all.ru/3.16/whatsnew/3.11.html) в стандартной библиотеке

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

- [PEP 657: Детализированное указание на ошибки в трассировках](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-pep657)
- Новый параметр командной строки [`-P`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-P) и переменная окружения [`PYTHONSAFEPATH`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONSAFEPATH) для [отключения автоматического добавления потенциально небезопасных путей](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-pythonsafepath) в [`sys.path`](https://python-all.ru/3.16/library/sys.html#sys.path)

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

- [PEP 646: Вариативные обобщения](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-pep646)
- [PEP 655: Пометка отдельных элементов TypedDict как обязательных или необязательных](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-pep655)
- [PEP 673: Тип Self](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-pep673)
- [PEP 675: Произвольный тип литеральной строки](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-pep675)
- [PEP 681: Преобразования классов данных](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-pep681)

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

- [**PEP 594**](https://python-all.ru/3.16/whatsnew/3.11.html): [Многие устаревшие модули стандартной библиотеки объявлены устаревшими](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-pep594) и будут удалены в Python 3.13
- [**PEP 624**](https://python-all.ru/3.16/whatsnew/3.11.html): [API кодировщиков Py\_UNICODE удалены](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-pep624)
- [**PEP 670**](https://python-all.ru/3.16/whatsnew/3.11.html): [Макросы преобразованы в статические встраиваемые функции](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-pep670)

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

### PEP 657: Детализированное указание на ошибки в трассировках

При выводе трассировки интерпретатор теперь указывает на точное выражение, которое вызвало ошибку, а не просто на строку. Например:

```python
Traceback (most recent call last):
  File "distance.py", line 11, in <module>
    print(manhattan_distance(p1, p2))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "distance.py", line 6, in manhattan_distance
    return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
                           ^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'x'
```

В предыдущих версиях интерпретатор указывал только на строку, из-за чего было непонятно, какой объект был `None`. Эти улучшенные сообщения об ошибках также могут быть полезны при работе с глубоко вложенными объектами [`dict`](https://python-all.ru/3.16/library/stdtypes.html#dict) и множественными вызовами функций:

```python
Traceback (most recent call last):
  File "query.py", line 37, in <module>
    magic_arithmetic('foo')
  File "query.py", line 18, in magic_arithmetic
    return add_counts(x) / 25
           ^^^^^^^^^^^^^
  File "query.py", line 24, in add_counts
    return 25 + query_user(user1) + query_user(user2)
                ^^^^^^^^^^^^^^^^^
  File "query.py", line 32, in query_user
    return 1 + query_count(db, response['a']['b']['c']['user'], retry=True)
                               ~~~~~~~~~~~~~~~~~~^^^^^
TypeError: 'NoneType' object is not subscriptable
```

А также сложные арифметические выражения:

```python
Traceback (most recent call last):
  File "calculation.py", line 54, in <module>
    result = (x / y / z) * (a / b / c)
              ~~~~~~^~~
ZeroDivisionError: division by zero
```

Кроме того, информация, используемая улучшенной функцией трассировки, становится доступной через общий API, который можно использовать для сопоставления [байт-кода](https://python-all.ru/3.16/glossary.html#term-bytecode) [инструкций](https://python-all.ru/3.16/library/dis.html#bytecodes) с расположением в исходном коде. Эту информацию можно получить с помощью:

- Метод [`codeobject.co_positions()`](https://python-all.ru/3.16/reference/datamodel.html#codeobject.co_positions) в Python.
- Функция [`PyCode_Addr2Location()`](https://python-all.ru/3.16/c-api/code.html#c.PyCode_Addr2Location) в C API.

См. [**PEP 657**](https://python-all.ru/3.16/whatsnew/3.11.html) для получения более подробной информации. (Авторы: Pablo Galindo, Batuhan Taskaya и Ammar Askar в [bpo-43950](https://python-all.ru/3.16/whatsnew/3.11.html).)

> **Примечание**
>
> Эта функция требует хранения позиций столбцов в [объектах кода](https://python-all.ru/3.16/c-api/code.html#codeobjects), что может привести к небольшому увеличению использования памяти интерпретатора и места на диске для скомпилированных файлов Python. Чтобы избежать хранения дополнительной информации и отключить печать дополнительной информации трассировки, используйте опцию командной строки [`-X no_debug_ranges`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-X) или переменную окружения [`PYTHONNODEBUGRANGES`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONNODEBUGRANGES).

### PEP 654: Группы исключений и `except*`

[**PEP 654**](https://python-all.ru/3.16/whatsnew/3.11.html) вводит языковые возможности, которые позволяют программе возбуждать и обрабатывать несколько не связанных исключений одновременно. Встроенные типы [`ExceptionGroup`](https://python-all.ru/3.16/library/exceptions.html#ExceptionGroup) и [`BaseExceptionGroup`](https://python-all.ru/3.16/library/exceptions.html#BaseExceptionGroup) позволяют группировать исключения и возбуждать их вместе, а новый синтаксис [`except*`](https://python-all.ru/3.16/reference/compound_stmts.html#except-star) обобщает [`except`](https://python-all.ru/3.16/reference/compound_stmts.html#except) для сопоставления подгрупп групп исключений.

См. [**PEP 654**](https://python-all.ru/3.16/whatsnew/3.11.html) для получения более подробной информации.

(Автор: Irit Katriel в [bpo-45292](https://python-all.ru/3.16/whatsnew/3.11.html). PEP написан Irit Katriel, Yury Selivanov и Guido van Rossum.)

### PEP 678: Исключения можно обогащать примечаниями

Метод [`add_note()`](https://python-all.ru/3.16/library/exceptions.html#BaseException.add_note) добавлен в [`BaseException`](https://python-all.ru/3.16/library/exceptions.html#BaseException). Его можно использовать для обогащения исключений контекстной информацией, которая недоступна в момент возбуждения исключения. Добавленные примечания отображаются в стандартной трассировке.

См. [**PEP 678**](https://python-all.ru/3.16/whatsnew/3.11.html) для получения более подробной информации.

(Автор: Irit Katriel в [bpo-45607](https://python-all.ru/3.16/whatsnew/3.11.html). PEP написан Zac Hatfield-Dodds.)

### Улучшения `py.exe` лаунчера Windows

Копия [менеджера установки Python](https://python-all.ru/3.16/using/windows.html#launcher), включенная в Python 3.11, была значительно обновлена. Теперь он поддерживает синтаксис company/tag, как определено в [**PEP 514**](https://python-all.ru/3.16/whatsnew/3.11.html), с использованием аргумента `-V:<company>/<tag>` вместо ограниченного `-<major>.<minor>`. Это позволяет запускать дистрибутивы, отличные от `PythonCore`, того, который размещен на [python.org](https://python-all.ru/3.16/whatsnew/3.11.html).

При использовании селекторов `-V:` можно опустить либо компанию, либо тег, но будут сканироваться все установки. Например, `-V:OtherPython/` выберет «лучший» тег, зарегистрированный для `OtherPython`, в то время как `-V:3.11` или `-V:/3.11` выберут «лучший» дистрибутив с тегом `3.11`.

При использовании устаревших аргументов `-<major>`, `-<major>.<minor>`, `-<major>-<bitness>` или `-<major>.<minor>-<bitness>` все существующее поведение должно сохраняться из прошлых версий, и будут выбраны только выпуски с `PythonCore`. Однако суффикс `-64` теперь означает «не 32-битный» (не обязательно x86-64), поскольку существует несколько поддерживаемых 64-битных платформ. 32-битные среды выполнения определяются путем проверки тега среды выполнения на наличие суффикса `-32`. Все выпуски Python начиная с 3.5 включали это в свои 32-битные сборки.

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

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

### PEP 646: Вариативные дженерики

[**PEP 484**](https://python-all.ru/3.16/whatsnew/3.11.html) ранее представил [`TypeVar`](https://python-all.ru/3.16/library/typing.html#typing.TypeVar), позволяющий создание дженериков, параметризованных одним типом. [**PEP 646**](https://python-all.ru/3.16/whatsnew/3.11.html) добавляет [`TypeVarTuple`](https://python-all.ru/3.16/library/typing.html#typing.TypeVarTuple), позволяющий параметризацию произвольным количеством типов. Другими словами, `TypeVarTuple` – это вариативная переменная типа, что позволяет использовать вариативные дженерики.

Это позволяет реализовать широкий спектр вариантов использования. В частности, это позволяет типу массивоподобных структур в библиотеках численных вычислений, таких как NumPy и TensorFlow, быть параметризованным формой массива . Статические анализаторы типов теперь смогут выявлять ошибки, связанные с формой, в коде, использующем эти библиотеки.

См. [**PEP 646**](https://python-all.ru/3.16/whatsnew/3.11.html) для получения более подробной информации.

(Автор: Matthew Rahtz в [bpo-43224](https://python-all.ru/3.16/whatsnew/3.11.html), с участием Serhiy Storchaka и Jelle Zijlstra. PEP написан Mark Mendoza, Matthew Rahtz, Pradeep Kumar Srinivasan и Vincent Siles.)

### PEP 655: Маркировка отдельных элементов `TypedDict` как обязательных или необязательных

[`Required`](https://python-all.ru/3.16/library/typing.html#typing.Required) и [`NotRequired`](https://python-all.ru/3.16/library/typing.html#typing.NotRequired) предоставляют простой способ отметить, должны ли отдельные элементы в [`TypedDict`](https://python-all.ru/3.16/library/typing.html#typing.TypedDict) присутствовать. Ранее это было возможно только с использованием наследования.

Все поля по-прежнему обязательны по умолчанию, если только параметр *total* не установлен в `False`, в этом случае все поля по-прежнему необязательны по умолчанию. Например, следующее определяет `TypedDict` с одним обязательным и одним необязательным ключом:

```python
class Movie(TypedDict):
   title: str
   year: NotRequired[int]

m1: Movie = {"title": "Black Panther", "year": 2018}  # ОК
m2: Movie = {"title": "Star Wars"}  # OK (год не обязателен)
m3: Movie = {"year": 2022}  # ОШИБКА (отсутствует обязательное поле title)
```

Следующее определение эквивалентно:

```python
class Movie(TypedDict, total=False):
   title: Required[str]
   year: int
```

См. [**PEP 655**](https://python-all.ru/3.16/whatsnew/3.11.html) для получения более подробной информации.

(Авторы: David Foster и Jelle Zijlstra в [bpo-47087](https://python-all.ru/3.16/whatsnew/3.11.html). PEP написан David Foster.)

### PEP 673: `Self` тип

Новая аннотация [`Self`](https://python-all.ru/3.16/library/typing.html#typing.Self) предоставляет простой и интуитивно понятный способ аннотировать методы, возвращающие экземпляр своего класса. Она ведёт себя так же, как подход на основе [`TypeVar`](https://python-all.ru/3.16/library/typing.html#typing.TypeVar), [**описанный в PEP 484**](https://python-all.ru/3.16/whatsnew/3.11.html), но более лаконична и понятна.

Типичные случаи использования включают альтернативные конструкторы, предоставляемые как [`classmethod`](https://python-all.ru/3.16/library/functions.html#classmethod), и методы [`__enter__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__enter__), возвращающие `self`:

```python
class MyLock:
    def __enter__(self) -> Self:
        self.lock()
        return self

    ...

class MyInt:
    @classmethod
    def fromhex(cls, s: str) -> Self:
        return cls(int(s, 16))

    ...
```

[`Self`](https://python-all.ru/3.16/library/typing.html#typing.Self) также можно использовать для аннотирования параметров методов или атрибутов того же типа, что и их объемлющий класс.

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

(Предложено James Hilton-Balfe в [bpo-46534](https://python-all.ru/3.16/whatsnew/3.11.html). PEP написан Pradeep Kumar Srinivasan и James Hilton-Balfe.)

### PEP 675: Произвольный строковый литеральный тип

Новая аннотация [`LiteralString`](https://python-all.ru/3.16/library/typing.html#typing.LiteralString) может использоваться для указания того, что параметр функции может быть любого строкового литерального типа. Это позволяет функции принимать произвольные строковые литеральные типы, а также строки, созданные из других строковых литералов. Тогда проверяющие типы могут гарантировать, что чувствительные функции, такие как выполняющие SQL-запросы или команды оболочки, вызываются только со статическими аргументами, обеспечивая защиту от атак внедрения.

Например, функцию SQL-запроса можно аннотировать следующим образом:

```python
def run_query(sql: LiteralString) -> ...
    ...

def caller(
    arbitrary_string: str,
    query_string: LiteralString,
    table_name: LiteralString,
) -> None:
    run_query("SELECT * FROM students")       # ok
    run_query(query_string)                   # ok
    run_query("SELECT * FROM " + table_name)  # ok
    run_query(arbitrary_string)               # ошибка проверки типов
    run_query(                                # ошибка проверки типов
        f"SELECT * FROM students WHERE name = {arbitrary_string}"
    )
```

Подробнее см. [**PEP 675**](https://python-all.ru/3.16/whatsnew/3.11.html).

(Предложено Jelle Zijlstra в [bpo-47088](https://python-all.ru/3.16/whatsnew/3.11.html). PEP написан Pradeep Kumar Srinivasan и Graham Bleaney.)

### PEP 681: Преобразования классов данных

[`@~typing.dataclass_transform`](https://python-all.ru/3.16/library/typing.html#typing.dataclass_transform) может использоваться для декорирования класса, метакласса или функции, которая сама является декоратором. Наличие `@dataclass_transform()` сообщает статическому проверяющему типов, что декорированный объект выполняет «магию» времени выполнения, преобразующую класс и придающую ему поведение, похожее на [`dataclass`](https://python-all.ru/3.16/library/dataclasses.html#dataclasses.dataclass).

Например:

```python
# Декоратор create_model определён в библиотеке.
@typing.dataclass_transform()
def create_model(cls: Type[T]) -> Type[T]:
    cls.__init__ = ...
    cls.__eq__ = ...
    cls.__ne__ = ...
    return cls

# Теперь с помощью декоратора create_model можно создавать новые классы моделей:
@create_model
class CustomerModel:
    id: int
    name: str

c = CustomerModel(id=327, name="Eric Idle")
```

Подробнее см. [**PEP 681**](https://python-all.ru/3.16/whatsnew/3.11.html).

(Предложено Jelle Zijlstra в [gh-91860](https://python-all.ru/3.16/whatsnew/3.11.html). PEP написан Erik De Bonte и Eric Traut.)

### PEP 563 может и не быть будущим

[**PEP 563**](https://python-all.ru/3.16/whatsnew/3.11.html) Отложенная оценка аннотаций (`from __future__ import annotations` [future statement](https://python-all.ru/3.16/reference/simple_stmts.html#future)), которая изначально планировалась к выпуску в Python 3.10, отложена на неопределённый срок. См. [это сообщение от Управляющего совета](https://python-all.ru/3.16/whatsnew/3.11.html) для получения дополнительной информации.

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

- Выражения распаковки со звёздочкой теперь можно использовать в операторах [`for`](https://python-all.ru/3.16/reference/compound_stmts.html#for). (Подробнее см. [bpo-46725](https://python-all.ru/3.16/whatsnew/3.11.html).)
- [Асинхронные включения](https://python-all.ru/3.16/reference/expressions.html#comprehensions) теперь разрешены внутри включений в [асинхронных функциях](https://python-all.ru/3.16/reference/compound_stmts.html#async-def). Внешние включения в этом случае неявно становятся асинхронными. (Предложено Serhiy Storchaka в [bpo-33346](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Теперь возбуждается [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError) вместо [`AttributeError`](https://python-all.ru/3.16/library/exceptions.html#AttributeError) в операторах [`with`](https://python-all.ru/3.16/reference/compound_stmts.html#with) и [`contextlib.ExitStack.enter_context()`](https://python-all.ru/3.16/library/contextlib.html#contextlib.ExitStack.enter_context) для объектов, не поддерживающих протокол [менеджера контекста](https://python-all.ru/3.16/glossary.html#term-context-manager), а также в операторах [`async with`](https://python-all.ru/3.16/reference/compound_stmts.html#async-with) и [`contextlib.AsyncExitStack.enter_async_context()`](https://python-all.ru/3.16/library/contextlib.html#contextlib.AsyncExitStack.enter_async_context) для объектов, не поддерживающих протокол [асинхронного менеджера контекста](https://python-all.ru/3.16/glossary.html#term-asynchronous-context-manager). (Предложено Serhiy Storchaka в [bpo-12022](https://python-all.ru/3.16/whatsnew/3.11.html) и [bpo-44471](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлен [`object.__getstate__()`](https://python-all.ru/3.16/library/pickle.html#object.__getstate__), предоставляющий реализацию по умолчанию метода `__getstate__()`. [`copy`](https://python-all.ru/3.16/library/copy.html#module-copy) и [`pickle`](https://python-all.ru/3.16/library/pickle.html#module-pickle) экземпляров подклассов встроенных типов [`bytearray`](https://python-all.ru/3.16/library/stdtypes.html#bytearray), [`set`](https://python-all.ru/3.16/library/stdtypes.html#set), [`frozenset`](https://python-all.ru/3.16/library/stdtypes.html#frozenset), [`collections.OrderedDict`](https://python-all.ru/3.16/library/collections.html#collections.OrderedDict), [`collections.deque`](https://python-all.ru/3.16/library/collections.html#collections.deque), [`weakref.WeakSet`](https://python-all.ru/3.16/library/weakref.html#weakref.WeakSet) и [`datetime.tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo) теперь копируют и пиклизуют атрибуты экземпляров, реализованные как [слоты](https://python-all.ru/3.16/glossary.html#term-__slots__). Это изменение имеет непреднамеренный побочный эффект: оно задевает небольшое количество существующих проектов Python, не ожидающих существования `object.__getstate__()`. См. последующие комментарии в [gh-70766](https://python-all.ru/3.16/whatsnew/3.11.html) для обсуждения возможных обходных путей для такого кода. (Предложено Serhiy Storchaka в [bpo-26579](https://python-all.ru/3.16/whatsnew/3.11.html).)

- Добавлен параметр командной строки [`-P`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-P) и переменная окружения [`PYTHONSAFEPATH`](https://python-all.ru/3.16/using/cmdline.html#envvar-PYTHONSAFEPATH), которые отключают автоматическое добавление в начало [`sys.path`](https://python-all.ru/3.16/library/sys.html#sys.path) каталога скрипта при его выполнении или текущего каталога при использовании [`-c`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-c) и [`-m`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-m). Это гарантирует, что [`import`](https://python-all.ru/3.16/reference/simple_stmts.html#import) будут подхватываться только модули из стандартной библиотеки и установленные модули, и предотвращает непреднамеренное или злонамеренное затенение модулей модулями из локального (обычно доступного для записи пользователем) каталога. (Предложено Victor Stinner в [gh-57684](https://python-all.ru/3.16/whatsnew/3.11.html).)
- В [миниязык спецификации формата](https://python-all.ru/3.16/library/string.html#formatspec) добавлена опция `"z"`, которая преобразует отрицательный ноль в положительный после округления до точности формата. Подробнее см. [**PEP 682**](https://python-all.ru/3.16/whatsnew/3.11.html). (Предложено John Belmonte в [gh-90153](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Объекты bytes больше не принимаются в [`sys.path`](https://python-all.ru/3.16/library/sys.html#sys.path). Поддержка была нарушена где-то между Python 3.2 и 3.6, и никто этого не заметил до выхода Python 3.10.0. Кроме того, восстановление поддержки было бы проблематичным из-за взаимодействия между [`-b`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-b) и [`sys.path_importer_cache`](https://python-all.ru/3.16/library/sys.html#sys.path_importer_cache) при смешивании ключей [`str`](https://python-all.ru/3.16/library/stdtypes.html#str) и [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes). (Предложено Thomas Grainger в [gh-91181](https://python-all.ru/3.16/whatsnew/3.11.html).)

## Прочие изменения в реализации CPython

- Специальные методы [`__complex__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__complex__) для [`complex`](https://python-all.ru/3.16/library/functions.html#complex) и [`__bytes__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__bytes__) для [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes) реализованы для поддержки протоколов [`typing.SupportsComplex`](https://python-all.ru/3.16/library/typing.html#typing.SupportsComplex) и [`typing.SupportsBytes`](https://python-all.ru/3.16/library/typing.html#typing.SupportsBytes). (Предложено Mark Dickinson и Donghee Na в [bpo-24234](https://python-all.ru/3.16/whatsnew/3.11.html).)
- `siphash13` добавлен как новый внутренний алгоритм хеширования. Он обладает аналогичными свойствами безопасности, что и `siphash24`, но немного быстрее для длинных входных данных. [`str`](https://python-all.ru/3.16/library/stdtypes.html#str), [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes) и некоторые другие типы теперь используют его как алгоритм по умолчанию для [`hash()`](https://python-all.ru/3.16/library/functions.html#hash). [**PEP 552**](https://python-all.ru/3.16/whatsnew/3.11.html) [хешированные .pyc-файлы](https://python-all.ru/3.16/reference/import.html#pyc-invalidation) теперь также используют `siphash13`. (Предложено Inada Naoki в [bpo-29410](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Когда активное исключение повторно возбуждается оператором [`raise`](https://python-all.ru/3.16/reference/simple_stmts.html#raise) без параметров, трассировка, прикреплённая к этому исключению, теперь всегда `sys.exc_info()[1].__traceback__`. Это означает, что изменения, внесённые в трассировку в текущем предложении [`except`](https://python-all.ru/3.16/reference/compound_stmts.html#except), отражаются в повторно возбуждённом исключении. (Предложено Irit Katriel в [bpo-45711](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Представление обработанных исключений в состоянии интерпретатора (также известное как `exc_info` или `_PyErr_StackItem`) теперь содержит только поле `exc_value`; `exc_type` и `exc_traceback` удалены, поскольку они могут быть получены из `exc_value`. (Предложено Irit Katriel в [bpo-45711](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Для установщика Windows добавлена новая [опция командной строки](https://python-all.ru/3.16/using/windows.html#install-quiet-option), `AppendPath`. Она ведёт себя аналогично `PrependPath`, но добавляет каталоги установки и скриптов в конец, а не в начало. (Предложено Bastian Neuburger в [bpo-44934](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Поле [`PyConfig.module_search_paths_set`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.module_search_paths_set) теперь должно быть установлено в `1`, чтобы инициализация использовала [`PyConfig.module_search_paths`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.module_search_paths) для инициализации [`sys.path`](https://python-all.ru/3.16/library/sys.html#sys.path). В противном случае инициализация пересчитает путь и заменит любые значения, добавленные в `module_search_paths`.
- Вывод опции [`--help`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-help) теперь умещается в 50 строк/80 столбцов. Информация о [переменных окружения Python](https://python-all.ru/3.16/using/cmdline.html#using-on-envvars) и опциях [`-X`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-X) теперь доступна с помощью соответствующих флагов [`--help-env`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-help-env) и [`--help-xoptions`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-help-xoptions), а также новой [`--help-all`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-help-all). (Предложено Éric Araujo в [bpo-46142](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Преобразование между [`int`](https://python-all.ru/3.16/library/functions.html#int) и [`str`](https://python-all.ru/3.16/library/stdtypes.html#str) по основаниям, отличным от 2 (двоичное), 4, 8 (восьмеричное), 16 (шестнадцатеричное) или 32, таким как основание 10 (десятичное), теперь вызывает [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError), если количество цифр в строковом представлении превышает лимит, чтобы избежать потенциальных атак типа «отказ в обслуживании» из-за алгоритмической сложности. Это смягчение для [**CVE 2020-10735**](https://python-all.ru/3.16/whatsnew/3.11.html). Этот лимит можно настроить или отключить с помощью переменной окружения, флага командной строки или API [`sys`](https://python-all.ru/3.16/library/sys.html#module-sys). См. документацию [ограничения длины строкового представления целых чисел](https://python-all.ru/3.16/library/stdtypes.html#int-max-str-digits). Лимит по умолчанию – 4300 цифр в строковом представлении.

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

- [`tomllib`](https://python-all.ru/3.16/library/tomllib.html#module-tomllib): Для разбора [TOML](https://python-all.ru/3.16/whatsnew/3.11.html). Подробнее см. [**PEP 680**](https://python-all.ru/3.16/whatsnew/3.11.html). (Предложено Taneli Hukkinen в [bpo-40059](https://python-all.ru/3.16/whatsnew/3.11.html).)
- [`wsgiref.types`](https://python-all.ru/3.16/library/wsgiref.html#module-wsgiref.types): [**WSGI**](https://python-all.ru/3.16/whatsnew/3.11.html)-специфичные типы для статической проверки типов. (Автор: Sebastian Rittau, [bpo-42012](https://python-all.ru/3.16/whatsnew/3.11.html).)

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

### asyncio

- Добавлен класс [`TaskGroup`](https://python-all.ru/3.16/library/asyncio-task.html#asyncio.TaskGroup), [асинхронный контекстный менеджер](https://python-all.ru/3.16/reference/datamodel.html#async-context-managers), который содержит группу задач и ожидает завершения всех при выходе. Для нового кода рекомендуется использовать его вместо непосредственного использования [`create_task()`](https://python-all.ru/3.16/library/asyncio-task.html#asyncio.create_task) и [`gather()`](https://python-all.ru/3.16/library/asyncio-task.html#asyncio.gather). (Автор: Yury Selivanov и другие, [gh-90908](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлен [`timeout()`](https://python-all.ru/3.16/library/asyncio-task.html#asyncio.timeout) – асинхронный контекстный менеджер для установки тайм-аута на асинхронные операции. Для нового кода рекомендуется использовать его вместо непосредственного использования [`wait_for()`](https://python-all.ru/3.16/library/asyncio-task.html#asyncio.wait_for). (Автор: Andrew Svetlov, [gh-90927](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлен класс [`Runner`](https://python-all.ru/3.16/library/asyncio-runner.html#asyncio.Runner), предоставляющий доступ к механизмам, используемым [`run()`](https://python-all.ru/3.16/library/asyncio-runner.html#asyncio.run). (Автор: Andrew Svetlov, [gh-91218](https://python-all.ru/3.16/whatsnew/3.11.html).)
- В библиотеку asyncio добавлен класс [`Barrier`](https://python-all.ru/3.16/library/asyncio-sync.html#asyncio.Barrier) к примитивам синхронизации, а также связанное с ним исключение [`BrokenBarrierError`](https://python-all.ru/3.16/library/asyncio-sync.html#asyncio.BrokenBarrierError). (Авторы: Yves Duprat и Andrew Svetlov, [gh-87518](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлен именованный аргумент *all\_errors* в функцию [`asyncio.loop.create_connection()`](https://python-all.ru/3.16/library/asyncio-eventloop.html#asyncio.loop.create_connection), чтобы несколько ошибок соединения можно было возбудить как одно [`ExceptionGroup`](https://python-all.ru/3.16/library/exceptions.html#ExceptionGroup).
- Добавлен метод [`asyncio.StreamWriter.start_tls()`](https://python-all.ru/3.16/library/asyncio-stream.html#asyncio.StreamWriter.start_tls) для обновления существующих потоковых соединений до TLS. (Автор: Ian Good, [bpo-34975](https://python-all.ru/3.16/whatsnew/3.11.html).)
- В цикл событий добавлены функции для работы с сырыми датаграммными сокетами: [`sock_sendto()`](https://python-all.ru/3.16/library/asyncio-eventloop.html#asyncio.loop.sock_sendto), [`sock_recvfrom()`](https://python-all.ru/3.16/library/asyncio-eventloop.html#asyncio.loop.sock_recvfrom) и [`sock_recvfrom_into()`](https://python-all.ru/3.16/library/asyncio-eventloop.html#asyncio.loop.sock_recvfrom_into). Их реализации находятся в [`SelectorEventLoop`](https://python-all.ru/3.16/library/asyncio-eventloop.html#asyncio.SelectorEventLoop) и [`ProactorEventLoop`](https://python-all.ru/3.16/library/asyncio-eventloop.html#asyncio.ProactorEventLoop). (Автор: Alex Grönholm, [bpo-46805](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлены методы [`cancelling()`](https://python-all.ru/3.16/library/asyncio-task.html#asyncio.Task.cancelling) и [`uncancel()`](https://python-all.ru/3.16/library/asyncio-task.html#asyncio.Task.uncancel) в [`Task`](https://python-all.ru/3.16/library/asyncio-task.html#asyncio.Task). Они предназначены в первую очередь для внутреннего использования, в частности, [`TaskGroup`](https://python-all.ru/3.16/library/asyncio-task.html#asyncio.TaskGroup).

### contextlib

- Добавлен не потокобезопасный контекстный менеджер [`chdir()`](https://python-all.ru/3.16/library/contextlib.html#contextlib.chdir) для смены текущего рабочего каталога с последующим восстановлением при выходе. Простая обёртка вокруг [`chdir()`](https://python-all.ru/3.16/library/os.html#os.chdir). (Автор: Filipe Laíns, [bpo-25625](https://python-all.ru/3.16/whatsnew/3.11.html))

### dataclasses

- Изменена проверка мутабельности значений по умолчанию для полей: теперь допускаются только [хешируемые](https://python-all.ru/3.16/glossary.html#term-hashable) значения вместо любого объекта, не являющегося экземпляром [`dict`](https://python-all.ru/3.16/library/stdtypes.html#dict), [`list`](https://python-all.ru/3.16/library/stdtypes.html#list) или [`set`](https://python-all.ru/3.16/library/stdtypes.html#set). (Автор: Eric V. Smith, [bpo-44674](https://python-all.ru/3.16/whatsnew/3.11.html).)

### datetime

- Добавлен [`datetime.UTC`](https://python-all.ru/3.16/library/datetime.html#datetime.UTC) – удобный псевдоним для [`datetime.timezone.utc`](https://python-all.ru/3.16/library/datetime.html#datetime.timezone.utc). (Автор: Kabir Kwatra, [gh-91973](https://python-all.ru/3.16/whatsnew/3.11.html).)
- [`datetime.date.fromisoformat()`](https://python-all.ru/3.16/library/datetime.html#datetime.date.fromisoformat), [`datetime.time.fromisoformat()`](https://python-all.ru/3.16/library/datetime.html#datetime.time.fromisoformat) и [`datetime.datetime.fromisoformat()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.fromisoformat) теперь можно использовать для разбора большинства форматов ISO 8601 (за исключением тех, которые поддерживают дробные часы и минуты). (Автор: Paul Ganssle, [gh-80010](https://python-all.ru/3.16/whatsnew/3.11.html).)

### enum

- Переименован `EnumMeta` в [`EnumType`](https://python-all.ru/3.16/library/enum.html#enum.EnumType) (`EnumMeta` оставлен как псевдоним).
- Добавлен [`StrEnum`](https://python-all.ru/3.16/library/enum.html#enum.StrEnum), с членами, которые могут (и должны) использоваться как строки.
- Добавлен [`ReprEnum`](https://python-all.ru/3.16/library/enum.html#enum.ReprEnum), который изменяет только [`__repr__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__repr__) членов, возвращая их буквальные значения (а не имена) для [`__str__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__str__) и [`__format__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__format__) (используется в [`str()`](https://python-all.ru/3.16/library/stdtypes.html#str), [`format()`](https://python-all.ru/3.16/library/functions.html#format) и [f-строках](https://python-all.ru/3.16/glossary.html#term-f-string)).
- Изменено [`Enum.__format__()`](https://python-all.ru/3.16/library/enum.html#enum.Enum.__format__) (значение по умолчанию для [`format()`](https://python-all.ru/3.16/library/functions.html#format), [`str.format()`](https://python-all.ru/3.16/library/stdtypes.html#str.format) и [f-строк](https://python-all.ru/3.16/glossary.html#term-f-string)) – теперь оно всегда даёт тот же результат, что и [`Enum.__str__()`](https://python-all.ru/3.16/library/enum.html#enum.Enum.__str__): для перечислений, наследующих от [`ReprEnum`](https://python-all.ru/3.16/library/enum.html#enum.ReprEnum), это будет значение члена; для всех остальных перечислений это будет имя перечисления и имя члена (например, `Color.RED`).
- Добавлен новый параметр класса *boundary* для перечислений [`Flag`](https://python-all.ru/3.16/library/enum.html#enum.Flag) и перечисление [`FlagBoundary`](https://python-all.ru/3.16/library/enum.html#enum.FlagBoundary) с его параметрами, чтобы управлять обработкой значений флагов, выходящих за пределы диапазона.
- Добавлены декоратор перечислений [`verify()`](https://python-all.ru/3.16/library/enum.html#enum.verify) и перечисление [`EnumCheck`](https://python-all.ru/3.16/library/enum.html#enum.EnumCheck) с его параметрами для проверки классов перечислений на соответствие нескольким конкретным ограничениям.
- Добавлены декораторы [`member()`](https://python-all.ru/3.16/library/enum.html#enum.member) и [`nonmember()`](https://python-all.ru/3.16/library/enum.html#enum.nonmember), чтобы гарантировать, что декорируемый объект преобразуется/не преобразуется в член перечисления.
- Добавлен декоратор [`@~enum.property`](https://python-all.ru/3.16/library/enum.html#enum.property), который работает как [`@property`](https://python-all.ru/3.16/library/functions.html#property), но для перечислений. Используйте его вместо [`types.DynamicClassAttribute()`](https://python-all.ru/3.16/library/types.html#types.DynamicClassAttribute).
- Добавлен декоратор перечислений [`global_enum()`](https://python-all.ru/3.16/library/enum.html#enum.global_enum), который изменяет [`__repr__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__repr__) и [`__str__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__str__) так, чтобы отображать значения как члены их модуля, а не класса перечисления. Например, `'re.ASCII'` для члена [`ASCII`](https://python-all.ru/3.16/library/re.html#re.ASCII) из [`re.RegexFlag`](https://python-all.ru/3.16/library/re.html#re.RegexFlag) вместо `'RegexFlag.ASCII'`.
- Улучшен [`Flag`](https://python-all.ru/3.16/library/enum.html#enum.Flag): теперь поддерживаются [`len()`](https://python-all.ru/3.16/library/functions.html#len), итерация и [`in`](https://python-all.ru/3.16/reference/expressions.html#in)/[`not in`](https://python-all.ru/3.16/reference/expressions.html#not-in) по его членам. Например, теперь работает следующий код: `len(AFlag(3)) == 2 and list(AFlag(3)) == (AFlag.ONE, AFlag.TWO)`
- Изменены [`Enum`](https://python-all.ru/3.16/library/enum.html#enum.Enum) и [`Flag`](https://python-all.ru/3.16/library/enum.html#enum.Flag): теперь члены определяются до вызова [`__init_subclass__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__init_subclass__); [`dir()`](https://python-all.ru/3.16/library/functions.html#dir) теперь включает методы и т.д. из примешанных типов данных.
- Изменено [`Flag`](https://python-all.ru/3.16/library/enum.html#enum.Flag): теперь только первичные значения (степени двойки) считаются каноническими, в то время как составные значения (`3`, `6`, `10` и т.д.) считаются псевдонимами; инвертированные флаги приводятся к положительному эквиваленту.

### fcntl

- На FreeBSD поддерживаются флаги `F_DUP2FD` и `F_DUP2FD_CLOEXEC`: первый эквивалентен использованию `dup2`, а второй, кроме того, устанавливает флаг `FD_CLOEXEC`.

### fractions

- Support [**PEP 515**](https://python-all.ru/3.16/whatsnew/3.11.html)-style initialization of [`Fraction`](https://python-all.ru/3.16/library/fractions.html#fractions.Fraction) from string. (Contributed by Sergey B Kirpichev in [bpo-44258](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Теперь [`Fraction`](https://python-all.ru/3.16/library/fractions.html#fractions.Fraction) реализует метод `__int__`, благодаря чему проверка `isinstance(some_fraction, typing.SupportsInt)` успешно проходит. (Автор: Mark Dickinson, [bpo-44547](https://python-all.ru/3.16/whatsnew/3.11.html).)

### functools

- Теперь [`@functools.singledispatch`](https://python-all.ru/3.16/library/functools.html#functools.singledispatch) поддерживает [`types.UnionType`](https://python-all.ru/3.16/library/types.html#types.UnionType) и [`typing.Union`](https://python-all.ru/3.16/library/typing.html#typing.Union) в качестве аннотаций к аргументу dispatch.:

  ```python
  >>> from functools import singledispatch
  >>> @singledispatch
  ... def fun(arg, verbose=False):
  ...     if verbose:
  ...         print("Let me just say,", end=" ")
  ...     print(arg)
  ...
  >>> @fun.register
  ... def _(arg: int | float, verbose=False):
  ...     if verbose:
  ...         print("Strength in numbers, eh?", end=" ")
  ...     print(arg)
  ...
  >>> from typing import Union
  >>> @fun.register
  ... def _(arg: Union[list, set], verbose=False):
  ...     if verbose:
  ...         print("Enumerate this:")
  ...     for i, elem in enumerate(arg):
  ...         print(i, elem)
  ...
  ```

  (Автор: Yurii Karabas, [bpo-46014](https://python-all.ru/3.16/whatsnew/3.11.html).)

### gzip

- Функция [`gzip.compress()`](https://python-all.ru/3.16/library/gzip.html#gzip.compress) теперь работает быстрее при использовании аргумента **mtime=0**, так как она полностью делегирует сжатие единственной операции [`zlib.compress()`](https://python-all.ru/3.16/library/zlib.html#zlib.compress). У этого изменения есть один побочный эффект: заголовок gzip-файла содержит байт «OS». Ранее модуль [`gzip`](https://python-all.ru/3.16/library/gzip.html#module-gzip) всегда устанавливал в нём значение 255, означающее «неизвестно». Теперь при использовании `compress()` с **mtime=0** это значение может быть другим, в зависимости от библиотеки zlib на C, с которой слинкован Python. (Подробнее о побочном эффекте см. [gh-112346](https://python-all.ru/3.16/whatsnew/3.11.html).)

### hashlib

- [`hashlib.blake2b()`](https://python-all.ru/3.16/library/hashlib.html#hashlib.blake2b) и [`hashlib.blake2s()`](https://python-all.ru/3.16/library/hashlib.html#hashlib.blake2s) теперь предпочитают [libb2](https://python-all.ru/3.16/whatsnew/3.11.html) собственной копии Python. (Автор: Christian Heimes, [bpo-47095](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Внутренний модуль `_sha3` с алгоритмами SHA3 и SHAKE теперь использует *tiny\_sha3* вместо *Keccak Code Package* для уменьшения объёма кода и двоичного размера. Модуль [`hashlib`](https://python-all.ru/3.16/library/hashlib.html#module-hashlib) предпочитает оптимизированные реализации SHA3 и SHAKE из OpenSSL. Изменение затрагивает только установки без поддержки OpenSSL. (Автор: Christian Heimes, [bpo-47098](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлена [`hashlib.file_digest()`](https://python-all.ru/3.16/library/hashlib.html#hashlib.file_digest) – вспомогательная функция для эффективного хеширования файлов или файлоподобных объектов. (Автор: Christian Heimes, [gh-89313](https://python-all.ru/3.16/whatsnew/3.11.html).)

### IDLE and idlelib

- Применять подсветку синтаксиса для файлов `.pyi`. (Авторы: Alex Waygood и Terry Jan Reedy, [bpo-45447](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Включение приглашений при сохранении содержимого Shell с вводом и выводом. (Автор: Terry Jan Reedy, [gh-95191](https://python-all.ru/3.16/whatsnew/3.11.html).)

### inspect

- Добавлена [`getmembers_static()`](https://python-all.ru/3.16/library/inspect.html#inspect.getmembers_static) для возврата всех членов без запуска динамического поиска через протокол дескрипторов. (Автор: Weipeng Hong, [bpo-30533](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлена [`ismethodwrapper()`](https://python-all.ru/3.16/library/inspect.html#inspect.ismethodwrapper) для проверки, является ли тип объекта [`MethodWrapperType`](https://python-all.ru/3.16/library/types.html#types.MethodWrapperType). (Автор: Hakan Çelik, [bpo-29418](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Функции, связанные с фреймами, в модуле [`inspect`](https://python-all.ru/3.16/library/inspect.html#module-inspect) изменены так, чтобы возвращать новые экземпляры классов [`FrameInfo`](https://python-all.ru/3.16/library/inspect.html#inspect.FrameInfo) и [`Traceback`](https://python-all.ru/3.16/library/inspect.html#inspect.Traceback) (обратно совместимые с предыдущими интерфейсами, подобными [именованным кортежам](https://python-all.ru/3.16/glossary.html#term-named-tuple)), которые включают расширенную информацию о позиции [**PEP 657**](https://python-all.ru/3.16/whatsnew/3.11.html) (номер конечной строки, колонку и конечную колонку). Затронуты следующие функции:

  - [`inspect.getframeinfo()`](https://python-all.ru/3.16/library/inspect.html#inspect.getframeinfo)
  - [`inspect.getouterframes()`](https://python-all.ru/3.16/library/inspect.html#inspect.getouterframes)
  - [`inspect.getinnerframes()`](https://python-all.ru/3.16/library/inspect.html#inspect.getinnerframes),
  - [`inspect.stack()`](https://python-all.ru/3.16/library/inspect.html#inspect.stack)
  - [`inspect.trace()`](https://python-all.ru/3.16/library/inspect.html#inspect.trace)

  (Автор: Pablo Galindo, [gh-88116](https://python-all.ru/3.16/whatsnew/3.11.html).)

### locale

- Добавлена [`locale.getencoding()`](https://python-all.ru/3.16/library/locale.html#locale.getencoding) для получения текущей кодировки локали. Она аналогична `locale.getpreferredencoding(False)`, но игнорирует [режим UTF-8 в Python](https://python-all.ru/3.16/library/os.html#utf8-mode).

### logging

- Добавлена [`getLevelNamesMapping()`](https://python-all.ru/3.16/library/logging.html#logging.getLevelNamesMapping) для возврата отображения имён уровней логирования (например, `'CRITICAL'`) в значения соответствующих [уровней логирования](https://python-all.ru/3.16/library/logging.html#levels) (например, `50` по умолчанию). (Автор: Andrei Kulakovin, [gh-88024](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлен метод [`createSocket()`](https://python-all.ru/3.16/library/logging.handlers.html#logging.handlers.SysLogHandler.createSocket) в [`SysLogHandler`](https://python-all.ru/3.16/library/logging.handlers.html#logging.handlers.SysLogHandler) для соответствия [`SocketHandler.createSocket()`](https://python-all.ru/3.16/library/logging.handlers.html#logging.handlers.SocketHandler.createSocket). Он вызывается автоматически при инициализации обработчика и при отправке события, если нет активного сокета. (Автор: Kirill Pinchuk, [gh-88457](https://python-all.ru/3.16/whatsnew/3.11.html).)

### math

- Добавлена [`math.exp2()`](https://python-all.ru/3.16/library/math.html#math.exp2): возвращает 2, возведённое в степень x. (Автор: Gideon Mitchell, [bpo-45917](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлена [`math.cbrt()`](https://python-all.ru/3.16/library/math.html#math.cbrt): возвращает кубический корень из x. (Автор: Ajith Ramachandran, [bpo-44357](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Поведение двух особых случаев [`math.pow()`](https://python-all.ru/3.16/library/math.html#math.pow) было изменено для соответствия спецификации IEEE 754. Операции `math.pow(0.0, -math.inf)` и `math.pow(-0.0, -math.inf)` теперь возвращают `inf`. Ранее они вызывали [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError). (Автор: Mark Dickinson, [bpo-44339](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Значение [`math.nan`](https://python-all.ru/3.16/library/math.html#math.nan) теперь всегда доступно. (Автор: Victor Stinner, [bpo-46917](https://python-all.ru/3.16/whatsnew/3.11.html).)

### operator

- Добавлена новая функция `operator.call`, так что `operator.call(obj, *args, **kwargs) == obj(*args, **kwargs)`. (Предложено Antony Lee в [bpo-44019](https://python-all.ru/3.16/whatsnew/3.11.html).)

### os

- В Windows [`os.urandom()`](https://python-all.ru/3.16/library/os.html#os.urandom) теперь использует `BCryptGenRandom()` вместо `CryptGenRandom()`, который устарел. (Предложено Donghee Na в [bpo-44611](https://python-all.ru/3.16/whatsnew/3.11.html).)

### pathlib

- [`glob()`](https://python-all.ru/3.16/library/pathlib.html#pathlib.Path.glob) и [`rglob()`](https://python-all.ru/3.16/library/pathlib.html#pathlib.Path.rglob) возвращают только каталоги, если *pattern* заканчивается разделителем компонентов пути: [`sep`](https://python-all.ru/3.16/library/os.html#os.sep) или [`altsep`](https://python-all.ru/3.16/library/os.html#os.altsep). (Предложено Eisuke Kawasima в [bpo-22276](https://python-all.ru/3.16/whatsnew/3.11.html) и [bpo-33392](https://python-all.ru/3.16/whatsnew/3.11.html).)

### re

- Атомарные группы (`(?>...)`) и possessive-квантификаторы (`*+`, `++`, `?+`, `{m,n}+`) теперь поддерживаются в регулярных выражениях. (Предложено Jeffrey C. Jacobs и Serhiy Storchaka в [bpo-433030](https://python-all.ru/3.16/whatsnew/3.11.html).)

### shutil

- Добавлен необязательный параметр *dir\_fd* в [`shutil.rmtree()`](https://python-all.ru/3.16/library/shutil.html#shutil.rmtree). (Предложено Serhiy Storchaka в [bpo-46245](https://python-all.ru/3.16/whatsnew/3.11.html).)

### socket

- Добавлена поддержка CAN-сокетов для NetBSD. (Предложено Thomas Klausner в [bpo-30512](https://python-all.ru/3.16/whatsnew/3.11.html).)
- [`create_connection()`](https://python-all.ru/3.16/library/socket.html#socket.create_connection) имеет опцию, позволяющую в случае неудачи подключения возбуждать [`ExceptionGroup`](https://python-all.ru/3.16/library/exceptions.html#ExceptionGroup), содержащее все ошибки, вместо того чтобы возбуждать только последнюю. (Предложено Irit Katriel в [bpo-29980](https://python-all.ru/3.16/whatsnew/3.11.html).)

### sqlite3

- Теперь можно отключить авторизатор, передав [`None`](https://python-all.ru/3.16/library/constants.html#None) в [`set_authorizer()`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Connection.set_authorizer). (Предложено Erlend E. Aasland в [bpo-44491](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Имя collation [`create_collation()`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Connection.create_collation) теперь может содержать любые символы Unicode. Имена collation с недопустимыми символами теперь возбуждают [`UnicodeEncodeError`](https://python-all.ru/3.16/library/exceptions.html#UnicodeEncodeError) вместо [`sqlite3.ProgrammingError`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.ProgrammingError). (Предложено Erlend E. Aasland в [bpo-44688](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Исключения [`sqlite3`](https://python-all.ru/3.16/library/sqlite3.html#module-sqlite3) теперь включают расширенный код ошибки SQLite как [`sqlite_errorcode`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Error.sqlite_errorcode) и имя ошибки SQLite как [`sqlite_errorname`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Error.sqlite_errorname). (Предложено Aviv Palivoda, Daniel Shahaf и Erlend E. Aasland в [bpo-16379](https://python-all.ru/3.16/whatsnew/3.11.html) и [bpo-24139](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлены [`setlimit()`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Connection.setlimit) и [`getlimit()`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Connection.getlimit) в [`sqlite3.Connection`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Connection) для установки и получения лимитов SQLite на уровне соединения. (Предложено Erlend E. Aasland в [bpo-45243](https://python-all.ru/3.16/whatsnew/3.11.html).)
- [`sqlite3`](https://python-all.ru/3.16/library/sqlite3.html#module-sqlite3) теперь устанавливает [`sqlite3.threadsafety`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.threadsafety) на основе режима потоков по умолчанию, с которым скомпилирована базовая библиотека SQLite. (Предложено Erlend E. Aasland в [bpo-45613](https://python-all.ru/3.16/whatsnew/3.11.html).)
- C-колбэки [`sqlite3`](https://python-all.ru/3.16/library/sqlite3.html#module-sqlite3) теперь используют невыбрасываемые исключения, если включены трассировки колбэков. Пользователи теперь могут зарегистрировать [`unraisable hook handler`](https://python-all.ru/3.16/library/sys.html#sys.unraisablehook) для улучшения опыта отладки. (Предложено Erlend E. Aasland в [bpo-45828](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Выборка при откате больше не возбуждает [`InterfaceError`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.InterfaceError). Вместо этого мы передаём обработку этих случаев библиотеке SQLite. (Предложено Erlend E. Aasland в [bpo-44092](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлены [`serialize()`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Connection.serialize) и [`deserialize()`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Connection.deserialize) в [`sqlite3.Connection`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Connection) для сериализации и десериализации баз данных. (Предложено Erlend E. Aasland в [bpo-41930](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлен [`create_window_function()`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Connection.create_window_function) в [`sqlite3.Connection`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Connection) для создания агрегатных оконных функций. (Предложено Erlend E. Aasland в [bpo-34916](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлен [`blobopen()`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Connection.blobopen) в [`sqlite3.Connection`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Connection). [`sqlite3.Blob`](https://python-all.ru/3.16/library/sqlite3.html#sqlite3.Blob) позволяет выполнять инкрементальные операции ввода-вывода над BLOB-ами. (Предложено Aviv Palivoda и Erlend E. Aasland в [bpo-24905](https://python-all.ru/3.16/whatsnew/3.11.html).)

### string

- Добавлены [`get_identifiers()`](https://python-all.ru/3.16/library/string.html#string.Template.get_identifiers) и [`is_valid()`](https://python-all.ru/3.16/library/string.html#string.Template.is_valid) в [`string.Template`](https://python-all.ru/3.16/library/string.html#string.Template), которые соответственно возвращают все допустимые заполнители и наличие недопустимых заполнителей. (Предложено Ben Kehoe в [gh-90465](https://python-all.ru/3.16/whatsnew/3.11.html).)

### sys

- [`sys.exc_info()`](https://python-all.ru/3.16/library/sys.html#sys.exc_info) теперь выводит поля `type` и `traceback` из `value` (экземпляра исключения), так что при изменении исключения во время его обработки изменения отражаются в результатах последующих вызовов `exc_info()`. (Предложено Irit Katriel в [bpo-45711](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлен [`sys.exception()`](https://python-all.ru/3.16/library/sys.html#sys.exception), который возвращает активный экземпляр исключения (эквивалентно `sys.exc_info()[1]`). (Предложено Irit Katriel в [bpo-46328](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлен флаг [`sys.flags.safe_path`](https://python-all.ru/3.16/library/sys.html#sys.flags). (Предложено Victor Stinner в [gh-57684](https://python-all.ru/3.16/whatsnew/3.11.html).)

### sysconfig

- Три новые [схемы установки](https://python-all.ru/3.16/library/sysconfig.html#installation-paths) (*posix\_venv*, *nt\_venv* и *venv*) были добавлены и используются, когда Python создаёт новые виртуальные окружения или запускается из виртуального окружения. Первые две схемы (*posix\_venv* и *nt\_venv*) являются зависимыми от ОС: для не-Windows и Windows, а *venv* по сути является псевдонимом одной из них в зависимости от ОС, на которой работает Python. Это полезно для дистрибьюторов, которые модифицируют [`sysconfig.get_preferred_scheme()`](https://python-all.ru/3.16/library/sysconfig.html#sysconfig.get_preferred_scheme). Сторонний код, создающий новые виртуальные окружения, должен использовать новую схему установки *venv* для определения путей, как это делает [`venv`](https://python-all.ru/3.16/library/venv.html#module-venv). (Предложено Miro Hrončok в [bpo-45413](https://python-all.ru/3.16/whatsnew/3.11.html).)

### tempfile

- Объекты [`SpooledTemporaryFile`](https://python-all.ru/3.16/library/tempfile.html#tempfile.SpooledTemporaryFile) теперь полностью реализуют методы [`io.BufferedIOBase`](https://python-all.ru/3.16/library/io.html#io.BufferedIOBase) или [`io.TextIOBase`](https://python-all.ru/3.16/library/io.html#io.TextIOBase) (в зависимости от режима файла). Это позволяет им корректно работать с API, ожидающими объекты, подобные файлам, например, модулями сжатия. (Автор: Carey Metcalfe в [gh-70363](https://python-all.ru/3.16/whatsnew/3.11.html).)

### threading

- В Unix, если функция `sem_clockwait()` доступна в библиотеке C (glibc 2.30 и новее), метод [`threading.Lock.acquire()`](https://python-all.ru/3.16/library/threading.html#threading.Lock.acquire) теперь использует монотонные часы ([`time.CLOCK_MONOTONIC`](https://python-all.ru/3.16/library/time.html#time.CLOCK_MONOTONIC)) для тайм-аута, вместо использования системных часов ([`time.CLOCK_REALTIME`](https://python-all.ru/3.16/library/time.html#time.CLOCK_REALTIME)), чтобы не зависеть от изменений системных часов. (Автор: Victor Stinner в [bpo-41710](https://python-all.ru/3.16/whatsnew/3.11.html).)

### time

- В Unix, [`time.sleep()`](https://python-all.ru/3.16/library/time.html#time.sleep) теперь использует функцию `clock_nanosleep()` или `nanosleep()`, если она доступна, которая имеет разрешение 1 наносекунда (10-9 секунды), вместо использования `select()`, которая имеет разрешение 1 микросекунда (10-6 секунды). (Авторы: Benjamin Szőke и Victor Stinner в [bpo-21302](https://python-all.ru/3.16/whatsnew/3.11.html).)
- В Windows 8.1 и новее, [`time.sleep()`](https://python-all.ru/3.16/library/time.html#time.sleep) теперь использует ожидаемый таймер на основе [высокоточных таймеров](https://python-all.ru/3.16/whatsnew/3.11.html), который имеет разрешение 100 наносекунд (10-7 секунды). Ранее он имел разрешение 1 миллисекунда (10-3 секунды). (Авторы: Benjamin Szőke, Donghee Na, Eryk Sun и Victor Stinner в [bpo-21302](https://python-all.ru/3.16/whatsnew/3.11.html) и [bpo-45429](https://python-all.ru/3.16/whatsnew/3.11.html).)

### tkinter

- Добавлен метод `info_patchlevel()`, который возвращает точную версию библиотеки Tcl в виде именованного кортежа, подобного [`sys.version_info`](https://python-all.ru/3.16/library/sys.html#sys.version_info). (Автор: Serhiy Storchaka в [gh-91827](https://python-all.ru/3.16/whatsnew/3.11.html).)

### traceback

- Добавлен [`traceback.StackSummary.format_frame_summary()`](https://python-all.ru/3.16/library/traceback.html#traceback.StackSummary.format_frame_summary), чтобы позволить пользователям переопределять, какие фреймы появляются в трассировке и как они форматируются. (Автор: Ammar Askar в [bpo-44569](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлен [`traceback.TracebackException.print()`](https://python-all.ru/3.16/library/traceback.html#traceback.TracebackException.print), который выводит отформатированный экземпляр [`TracebackException`](https://python-all.ru/3.16/library/traceback.html#traceback.TracebackException) в файл. (Автор: Irit Katriel в [bpo-33809](https://python-all.ru/3.16/whatsnew/3.11.html).)

### typing

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

- Добавлены [`typing.assert_never()`](https://python-all.ru/3.16/library/typing.html#typing.assert_never) и [`typing.Never`](https://python-all.ru/3.16/library/typing.html#typing.Never). `typing.assert_never()` полезен для запроса к проверяльщику типов подтверждения, что строка кода недостижима. Во время выполнения он возбуждает [`AssertionError`](https://python-all.ru/3.16/library/exceptions.html#AssertionError). (Автор: Jelle Zijlstra в [gh-90633](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлен [`typing.reveal_type()`](https://python-all.ru/3.16/library/typing.html#typing.reveal_type). Это полезно для запроса к проверяльщику типов, какой тип он вывел для данного выражения. Во время выполнения он выводит тип полученного значения. (Автор: Jelle Zijlstra в [gh-90572](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлен [`typing.assert_type()`](https://python-all.ru/3.16/library/typing.html#typing.assert_type). Это полезно для запроса к проверяльщику типов подтверждения, что выведенный им тип для данного выражения соответствует заданному типу. Во время выполнения он просто возвращает полученное значение. (Автор: Jelle Zijlstra в [gh-90638](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Типы [`typing.TypedDict`](https://python-all.ru/3.16/library/typing.html#typing.TypedDict) теперь могут быть обобщёнными. (Автор: Samodya Abeysiriwardane в [gh-89026](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Типы [`NamedTuple`](https://python-all.ru/3.16/library/typing.html#typing.NamedTuple) теперь могут быть обобщёнными. (Автор: Serhiy Storchaka в [bpo-43923](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Разрешено создание подклассов [`typing.Any`](https://python-all.ru/3.16/library/typing.html#typing.Any). Это полезно для избежания ошибок проверяльщика типов, связанных с высокодинамичными классами, такими как mocks. (Автор: Shantanu Jain в [gh-91154](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Декоратор [`@typing.final`](https://python-all.ru/3.16/library/typing.html#typing.final) теперь устанавливает атрибут `__final__` на декорируемом объекте. (Автор: Jelle Zijlstra в [gh-90500](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Функция [`typing.get_overloads()`](https://python-all.ru/3.16/library/typing.html#typing.get_overloads) может использоваться для интроспекции перегрузок функции. [`typing.clear_overloads()`](https://python-all.ru/3.16/library/typing.html#typing.clear_overloads) можно использовать для очистки всех зарегистрированных перегрузок функции. (Автор: Jelle Zijlstra в [gh-89263](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Метод [`__init__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__init__) подклассов [`Protocol`](https://python-all.ru/3.16/library/typing.html#typing.Protocol) теперь сохраняется. (Автор: Adrian Garcia Badarasco в [gh-88970](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Представление типов пустых кортежей (`Tuple[()]`) упрощено. Это влияет на интроспекцию, например, `get_args(Tuple[()])` теперь вычисляется в `()` вместо `((),)`. (Автор: Serhiy Storchaka в [gh-91137](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Ослаблены требования времени выполнения для аннотаций типов путём удаления проверки на вызываемость в частной функции `typing._type_check`. (Автор: Gregory Beauregard в [gh-90802](https://python-all.ru/3.16/whatsnew/3.11.html).)
- [`typing.get_type_hints()`](https://python-all.ru/3.16/library/typing.html#typing.get_type_hints) теперь поддерживает вычисление строк как прямых ссылок в [обобщённых псевдонимах PEP 585](https://python-all.ru/3.16/library/stdtypes.html#types-genericalias). (Автор: Niklas Rosenstein в [gh-85542](https://python-all.ru/3.16/whatsnew/3.11.html).)
- [`typing.get_type_hints()`](https://python-all.ru/3.16/library/typing.html#typing.get_type_hints) больше не добавляет [`Optional`](https://python-all.ru/3.16/library/typing.html#typing.Optional) к параметрам с `None` в качестве значения по умолчанию. (Автор: Nikita Sobolev в [gh-90353](https://python-all.ru/3.16/whatsnew/3.11.html).)
- [`typing.get_type_hints()`](https://python-all.ru/3.16/library/typing.html#typing.get_type_hints) теперь поддерживает вычисление чистых строковых аннотаций [`ClassVar`](https://python-all.ru/3.16/library/typing.html#typing.ClassVar). (Автор: Gregory Beauregard в [gh-90711](https://python-all.ru/3.16/whatsnew/3.11.html).)
- [`@typing.no_type_check`](https://python-all.ru/3.16/library/typing.html#typing.no_type_check) больше не изменяет внешние классы и функции. Теперь он также корректно помечает методы класса как не подлежащие проверке типов. (Автор: Nikita Sobolev в [gh-90729](https://python-all.ru/3.16/whatsnew/3.11.html).)

### unicodedata

- База данных Unicode обновлена до версии 14.0.0. (Автор: Benjamin Peterson в [bpo-45190](https://python-all.ru/3.16/whatsnew/3.11.html)).

### unittest

- Добавлены методы [`enterContext()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.enterContext) и [`enterClassContext()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.enterClassContext) класса [`TestCase`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase), метод [`enterAsyncContext()`](https://python-all.ru/3.16/library/unittest.html#unittest.IsolatedAsyncioTestCase.enterAsyncContext) класса [`IsolatedAsyncioTestCase`](https://python-all.ru/3.16/library/unittest.html#unittest.IsolatedAsyncioTestCase) и функция [`unittest.enterModuleContext()`](https://python-all.ru/3.16/library/unittest.html#unittest.enterModuleContext). (Автор: Serhiy Storchaka в [bpo-45046](https://python-all.ru/3.16/whatsnew/3.11.html).)

### venv

- Когда создаются новые виртуальные окружения Python, *venv* [схема установки sysconfig](https://python-all.ru/3.16/library/sysconfig.html#installation-paths) используется для определения путей внутри окружения. Когда Python работает в виртуальном окружении, эта же схема установки используется по умолчанию. Это означает, что нижестоящие распространители могут изменить схему установки sysconfig по умолчанию, не меняя поведение виртуальных окружений. Сторонний код, который также создаёт новые виртуальные окружения, должен делать то же самое. (Предложено Miro Hrončok в [bpo-45413](https://python-all.ru/3.16/whatsnew/3.11.html).)

### warnings

- [`warnings.catch_warnings()`](https://python-all.ru/3.16/library/warnings.html#warnings.catch_warnings) теперь принимает аргументы для [`warnings.simplefilter()`](https://python-all.ru/3.16/library/warnings.html#warnings.simplefilter), предоставляя более краткий способ локального игнорирования предупреждений или преобразования их в ошибки. (Предложено Zac Hatfield-Dodds в [bpo-47074](https://python-all.ru/3.16/whatsnew/3.11.html).)

### zipfile

- Добавлена поддержка указания кодировки имён членов для чтения метаданных в заголовках каталога и файлов [`ZipFile`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile). (Предложено Stephen J. Turnbull и Serhiy Storchaka в [bpo-28080](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлен [`ZipFile.mkdir()`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile.mkdir) для создания новых каталогов внутри ZIP-архивов. (Предложено Sam Ezeh в [gh-49083](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлены [`stem`](https://python-all.ru/3.16/library/zipfile.html#zipfile.Path.stem), [`suffix`](https://python-all.ru/3.16/library/zipfile.html#zipfile.Path.suffix) и [`suffixes`](https://python-all.ru/3.16/library/zipfile.html#zipfile.Path.suffixes) в [`zipfile.Path`](https://python-all.ru/3.16/library/zipfile.html#zipfile.Path). (Предложено Miguel Brito в [gh-88261](https://python-all.ru/3.16/whatsnew/3.11.html).)

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

В этом разделе рассматриваются конкретные оптимизации, не связанные с проектом [Faster CPython](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-faster-cpython), который описан в отдельном разделе.

- Компилятор теперь оптимизирует простое [printf-форматирование %](https://python-all.ru/3.16/library/stdtypes.html#old-string-formatting) строковых литералов, содержащих только коды формата `%s`, `%r` и `%a`, и делает его таким же быстрым, как соответствующее выражение [f-строки](https://python-all.ru/3.16/glossary.html#term-f-string). (Предложено Serhiy Storchaka в [bpo-28307](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Целочисленное деление (`//`) лучше оптимизируется компиляторами. Теперь оно примерно на 20% быстрее на x86-64 при делении [`int`](https://python-all.ru/3.16/library/functions.html#int) на значение меньше `2**30`. (Предложено Gregory P. Smith и Tim Peters в [gh-90564](https://python-all.ru/3.16/whatsnew/3.11.html).)
- [`sum()`](https://python-all.ru/3.16/library/functions.html#sum) теперь почти на 30% быстрее для целых чисел меньше `2**30`. (Предложено Stefan Behnel в [gh-68264](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Изменение размера списков оптимизировано для типичного случая, ускоряя [`list.append()`](https://python-all.ru/3.16/library/stdtypes.html#list.append) примерно на 15% и простые [списковые включения](https://python-all.ru/3.16/glossary.html#term-list-comprehension) до 20–30%. (Предложено Dennis Sweeney в [gh-91165](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Словари не хранят хеш-значения, если все ключи являются объектами Unicode, что уменьшает размер [`dict`](https://python-all.ru/3.16/library/stdtypes.html#dict). Например, `sys.getsizeof(dict.fromkeys("abcdefg"))` уменьшается с 352 байт до 272 байт (на 23% меньше) на 64-битных платформах. (Предложено Inada Naoki в [bpo-46845](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Использование [`asyncio.DatagramProtocol`](https://python-all.ru/3.16/library/asyncio-protocol.html#asyncio.DatagramProtocol) теперь на порядки быстрее при передаче больших файлов через UDP: скорость более чем в 100 раз выше для файла размером ≈60 МиБ. (Предложено msoxzw в [gh-91487](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Функции [`math`](https://python-all.ru/3.16/library/math.html#module-math) [`comb()`](https://python-all.ru/3.16/library/math.html#math.comb) и [`perm()`](https://python-all.ru/3.16/library/math.html#math.perm) теперь примерно в 10 раз быстрее для больших аргументов (с большим ускорением для больших *k*). (Предложено Serhiy Storchaka в [bpo-37295](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Функции [`statistics`](https://python-all.ru/3.16/library/statistics.html#module-statistics) [`mean()`](https://python-all.ru/3.16/library/statistics.html#statistics.mean), [`variance()`](https://python-all.ru/3.16/library/statistics.html#statistics.variance) и [`stdev()`](https://python-all.ru/3.16/library/statistics.html#statistics.stdev) теперь обрабатывают итераторы за один проход, а не преобразуют их сначала в [`list`](https://python-all.ru/3.16/library/stdtypes.html#list). Это вдвое быстрее и может существенно сэкономить память. (Предложено Raymond Hettinger в [gh-90415](https://python-all.ru/3.16/whatsnew/3.11.html).)
- [`unicodedata.normalize()`](https://python-all.ru/3.16/library/unicodedata.html#unicodedata.normalize) теперь нормализует строки из чистого ASCII за константное время. (Предложено Donghee Na в [bpo-44987](https://python-all.ru/3.16/whatsnew/3.11.html).)

## Более быстрый CPython

CPython 3.11 в среднем на [25% быстрее](https://python-all.ru/3.16/whatsnew/3.11.html) CPython 3.10 по результатам тестового набора [pyperformance](https://python-all.ru/3.16/whatsnew/3.11.html) при компиляции с GCC на Ubuntu Linux. В зависимости от нагрузки общее ускорение может составлять 10–60%.

Этот проект фокусируется на двух основных областях Python: [Faster Startup](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-faster-startup) и [Faster Runtime](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-faster-runtime). Оптимизации, не охваченные этим проектом, перечислены отдельно в разделе [Optimizations](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-optimizations).

### Более быстрый запуск

#### Замороженные импорты / Статические объекты кода

Python кеширует [байткод](https://python-all.ru/3.16/glossary.html#term-bytecode) в каталоге [\_\_pycache\_\_](https://python-all.ru/3.16/tutorial/modules.html#tut-pycache) для ускорения загрузки модулей.

Ранее в Python 3.10 выполнение модуля выглядело так:

```text
Read __pycache__ -> Unmarshal -> Heap allocated code object -> Evaluate
```

В Python 3.11 основные модули, необходимые для запуска Python, «заморожены». Это означает, что их [объекты кода](https://python-all.ru/3.16/c-api/code.html#codeobjects) (и байткод) статически выделяются интерпретатором. Это сокращает этапы выполнения модуля до:

```text
Statically allocated code object -> Evaluate
```

Запуск интерпретатора теперь на 10–15% быстрее в Python 3.11. Это оказывает большое влияние на короткие программы, использующие Python.

(Предложено Eric Snow, Guido van Rossum и Kumar Aditya во многих тикетах.)

### Более быстрое выполнение

#### Более легковесные, ленивые фреймы Python

Фреймы Python, содержащие информацию о выполнении, создаются при каждом вызове Python-функции. Ниже приведены новые оптимизации фреймов:

- Упрощён процесс создания фреймов.
- Удалось избежать выделения памяти за счёт повторного использования пространства фреймов в C-стеке.
- Упрощена внутренняя структура фрейма: теперь она содержит только основную информацию. Раньше фреймы содержали дополнительную отладочную информацию и информацию об управлении памятью.

[Объекты фреймов](https://python-all.ru/3.16/reference/datamodel.html#frame-objects) старого стиля теперь создаются только по запросу отладчиков или функций самоанализа Python, таких как [`sys._getframe()`](https://python-all.ru/3.16/library/sys.html#sys._getframe) и [`inspect.currentframe()`](https://python-all.ru/3.16/library/inspect.html#inspect.currentframe). Для большинства пользовательского кода объекты фреймов не создаются вовсе. Как результат, почти все вызовы функций Python значительно ускорились. Мы измерили прирост производительности на 3–7% в pyperformance.

(Предложено Марком Шенноном в [bpo-44590](https://python-all.ru/3.16/whatsnew/3.11.html).)

#### Встраивание вызовов функций Python

Во время вызова функции Python вызывает C-функцию оценки для интерпретации кода этой функции. Это фактически ограничивает чистую рекурсию Python тем, что безопасно для C-стека.

В версии 3.11, когда CPython обнаруживает, что Python-код вызывает другую функцию Python, он создаёт новый фрейм и «перепрыгивает» к новому коду внутри нового фрейма. Это позволяет полностью избежать вызова C-функции интерпретации.

Большинство вызовов функций Python теперь не расходуют память C-стека, что ускоряет их. В простых рекурсивных функциях, таких как fibonacci или factorial, мы наблюдали ускорение в 1,7 раза. Это также означает, что рекурсивные функции могут углубляться значительно сильнее (если пользователь увеличивает предел рекурсии с помощью [`sys.setrecursionlimit()`](https://python-all.ru/3.16/library/sys.html#sys.setrecursionlimit)). Мы измерили улучшение на 1–3% в pyperformance.

(Предложено Пабло Галиндо и Марком Шенноном в [bpo-45256](https://python-all.ru/3.16/whatsnew/3.11.html).)

#### PEP 659: Специализирующийся адаптивный интерпретатор

[**PEP 659**](https://python-all.ru/3.16/whatsnew/3.11.html) – одна из ключевых частей проекта Faster CPython. Общая идея в том, что, хотя Python – динамический язык, в большинстве кода есть участки, где объекты и типы редко меняются. Эта концепция известна как *стабильность типов*.

Во время выполнения Python пытается найти общие шаблоны и стабильность типов в исполняемом коде. Затем Python заменяет текущую операцию на более специализированную. Эта специализированная операция использует быстрые пути, доступные только для этих сценариев использования/типов, которые в целом превосходят свои универсальные аналоги. Это также вводит ещё одну концепцию, называемую *кэширование в коде*, когда Python кэширует результаты дорогостоящих операций непосредственно в [байткод](https://python-all.ru/3.16/glossary.html#term-bytecode).

Специализатор также объединяет некоторые распространённые пары инструкций в одну суперинструкцию, уменьшая накладные расходы во время выполнения.

Python выполняет специализацию только тогда, когда видит код, который является «горячим» (выполняется несколько раз). Это предотвращает трату времени Python на код, выполняющийся один раз. Python также может деспециализироваться, когда код слишком динамичен или когда использование меняется. Специализация предпринимается периодически, и попытки специализации не слишком дороги, что позволяет специализации адаптироваться к новым условиям.

(PEP написан Марком Шенноном, идеи вдохновлены Стефаном Брунталером. См. [**PEP 659**](https://python-all.ru/3.16/whatsnew/3.11.html) для получения дополнительной информации. Реализация Марка Шеннона и Брэндта Бухера, с дополнительной помощью Ирит Катриэль и Денниса Суини.)

| Операция | Форма | Специализация | Ускорение операции (до) | Автор(ы) |
| --- | --- | --- | --- | --- |
| Бинарные операции | `x + x` `x - x` `x * x` | Бинарные сложение, умножение и вычитание для распространённых типов, таких как [`int`](https://python-all.ru/3.16/library/functions.html#int), [`float`](https://python-all.ru/3.16/library/functions.html#float) и [`str`](https://python-all.ru/3.16/library/stdtypes.html#str), используют специальные быстрые пути для своих базовых типов. | 10% | Mark Shannon, Donghee Na, Brandt Bucher, Dennis Sweeney |
| Индексация | `a[i]` | Индексация типов-контейнеров, таких как [`list`](https://python-all.ru/3.16/library/stdtypes.html#list), [`tuple`](https://python-all.ru/3.16/library/stdtypes.html#tuple) и [`dict`](https://python-all.ru/3.16/library/stdtypes.html#dict), напрямую обращается к базовым структурам данных. Индексация пользовательских [`__getitem__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__getitem__) также встраивается аналогично [встраиванию вызовов функций Python](https://python-all.ru/3.16/whatsnew/3.11.html#inline-calls). | 10-25% | Irit Katriel, Mark Shannon |
| Присваивание по индексу | `a[i] = z` | Аналогично специализации индексации выше. | 10-25% | Dennis Sweeney |
| Вызовы | `f(arg)` `C(arg)` | Вызовы распространённых встроенных (C) функций и типов, таких как [`len()`](https://python-all.ru/3.16/library/functions.html#len) и [`str`](https://python-all.ru/3.16/library/stdtypes.html#str), напрямую вызывают их базовую C-версию. Это позволяет обойти внутреннее соглашение о вызовах. | 20% | Mark Shannon, Ken Jin |
| Загрузка глобальной переменной | `print` `len` | Индекс объекта в пространстве имён globals/builtins кэшируется. Для загрузки globals и builtins не требуется ни одного поиска в пространстве имён. | [\[1\]](https://python-all.ru/3.16/whatsnew/3.11.html#load-global) | Mark Shannon |
| Загрузка атрибута | `o.attr` | Аналогично загрузке глобальных переменных. Индекс атрибута внутри пространства имён класса/объекта кэшируется. В большинстве случаев загрузка атрибута не требует поиска в пространстве имён. | [\[2\]](https://python-all.ru/3.16/whatsnew/3.11.html#load-attr) | Mark Shannon |
| Загрузка методов для вызова | `o.meth()` | Фактический адрес метода кэшируется. Загрузка метода теперь не требует поиска в пространстве имён – даже для классов с длинными цепочками наследования. | 10-20% | Ken Jin, Mark Shannon |
| Сохранение атрибута | `o.attr = z` | Аналогично оптимизации загрузки атрибута. | 2% в pyperformance | Mark Shannon |
| Распаковка последовательности | `*seq` | Специализирован для распространённых контейнеров, таких как [`list`](https://python-all.ru/3.16/library/stdtypes.html#list) и [`tuple`](https://python-all.ru/3.16/library/stdtypes.html#tuple). Избегает внутреннего соглашения о вызовах. | 8% | Brandt Bucher |

\[[1](https://python-all.ru/3.16/whatsnew/3.11.html#id2)\]

Подобная оптимизация существовала ещё с Python 3.8. 3.11 специализируется на большем количестве форм и снижает некоторые накладные расходы.

\[[2](https://python-all.ru/3.16/whatsnew/3.11.html#id3)\]

Подобная оптимизация существовала ещё с Python 3.10. 3.11 специализируется на большем количестве форм. Кроме того, все загрузки атрибутов должны стать быстрее благодаря [bpo-45947](https://python-all.ru/3.16/whatsnew/3.11.html).

### Разное

- Объекты теперь требуют меньше памяти благодаря лениво создаваемым пространствам имён объектов. Их словари пространств имён теперь также более свободно разделяют ключи. (Вклад Марка Шеннона в [bpo-45340](https://python-all.ru/3.16/whatsnew/3.11.html) и [bpo-40116](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Реализованы исключения с «нулевой стоимостью», устраняющие затраты на оператор [`try`](https://python-all.ru/3.16/reference/compound_stmts.html#try), когда исключение не возбуждается. (Вклад Марка Шеннона в [bpo-40222](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Более компактное представление исключений в интерпретаторе сократило время, необходимое для перехвата исключения, примерно на 10%. (Вклад Ирит Катриэль в [bpo-45711](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Движок сопоставления регулярных выражений [`re`](https://python-all.ru/3.16/library/re.html#module-re) был частично переработан и теперь на поддерживаемых платформах использует вычисляемые переходы (или «threaded code»). В результате Python 3.11 выполняет [тесты производительности регулярных выражений pyperformance](https://python-all.ru/3.16/whatsnew/3.11.html) до 10% быстрее, чем Python 3.10. (Вклад Брандта Бухера в [gh-91404](https://python-all.ru/3.16/whatsnew/3.11.html).)

### Часто задаваемые вопросы

#### Как следует писать код, чтобы использовать эти ускорения?

Пишите Pythonic-код, следующий общепринятым лучшим практикам; вам не нужно менять свой код. Проект Faster CPython оптимизирует типичные шаблоны кода, которые мы наблюдаем.

#### Будет ли CPython 3.11 использовать больше памяти?

Возможно, нет; мы не ожидаем, что использование памяти превысит 20% по сравнению с 3.10. Это компенсируется оптимизациями памяти для объектов фреймов и словарей объектов, как упоминалось выше.

#### Я не вижу ускорений в своей рабочей нагрузке. Почему?

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

Кроме того, показатели pyperformance являются средним геометрическим. Даже среди тестов pyperformance некоторые тесты немного замедлились, в то время как другие ускорились почти в 2 раза!

#### Есть ли JIT-компилятор?

Нет. Мы всё ещё изучаем другие оптимизации.

### О проекте

Проект Faster CPython изучает оптимизации для [CPython](https://python-all.ru/3.16/glossary.html#term-CPython). Основная команда финансируется Microsoft для полной занятости над проектом. Пабло Галиндо Сальгадо также получает финансирование от Bloomberg LP для работы над проектом неполный рабочий день. Наконец, многие участники являются волонтёрами из сообщества.

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

Байткод теперь содержит встроенные записи кэша в виде недавно добавленных инструкций [`CACHE`](https://python-all.ru/3.16/library/dis.html#opcode-CACHE). Многие опкоды ожидают, что за ними следует точное количество записей кэша, и инструктируют интерпретатор пропускать их во время выполнения. Заполненные записи кэша могут выглядеть как произвольные инструкции, поэтому следует проявлять особую осторожность при чтении или изменении сырого адаптивного байткода, содержащего ускоренные данные.

### Новые опкоды

- `ASYNC_GEN_WRAP`, [`RETURN_GENERATOR`](https://python-all.ru/3.16/library/dis.html#opcode-RETURN_GENERATOR) и [`SEND`](https://python-all.ru/3.16/library/dis.html#opcode-SEND), используемые в генераторах и корутинах.
- [`COPY_FREE_VARS`](https://python-all.ru/3.16/library/dis.html#opcode-COPY_FREE_VARS), что устраняет необходимость в специальном коде на стороне вызывающего для замыканий.
- [`JUMP_BACKWARD_NO_INTERRUPT`](https://python-all.ru/3.16/library/dis.html#opcode-JUMP_BACKWARD_NO_INTERRUPT), для использования в определённых циклах, где обработка прерываний нежелательна.
- [`MAKE_CELL`](https://python-all.ru/3.16/library/dis.html#opcode-MAKE_CELL), для создания [Cell Objects](https://python-all.ru/3.16/c-api/cell.html#cell-objects).
- [`CHECK_EG_MATCH`](https://python-all.ru/3.16/library/dis.html#opcode-CHECK_EG_MATCH) и `PREP_RERAISE_STAR`, для обработки [новых групп исключений и except\*](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-pep654), добавленных в [**PEP 654**](https://python-all.ru/3.16/whatsnew/3.11.html).
- [`PUSH_EXC_INFO`](https://python-all.ru/3.16/library/dis.html#opcode-PUSH_EXC_INFO), для использования в обработчиках исключений.
- [`RESUME`](https://python-all.ru/3.16/library/dis.html#opcode-RESUME), пустая операция (no-op), для внутреннего трассирования, отладки и проверок оптимизации.

### Заменённые опкоды

| Заменённый(ые) опкод(ы) | Новый(ые) опкод(ы) | Примечания |
| --- | --- | --- |
| `BINARY_*` `INPLACE_*` | [`BINARY_OP`](https://python-all.ru/3.16/library/dis.html#opcode-BINARY_OP) | Заменены все числовые бинарные/операции на месте одним опкодом |
| `CALL_FUNCTION` `CALL_FUNCTION_KW` `CALL_METHOD` | [`CALL`](https://python-all.ru/3.16/library/dis.html#opcode-CALL) `KW_NAMES` `PRECALL` [`PUSH_NULL`](https://python-all.ru/3.16/library/dis.html#opcode-PUSH_NULL) | Разделяет сдвиг аргументов для методов и обработку именованных аргументов; позволяет лучше специализировать вызовы |
| `DUP_TOP` `DUP_TOP_TWO` `ROT_TWO` `ROT_THREE` `ROT_FOUR` `ROT_N` | [`COPY`](https://python-all.ru/3.16/library/dis.html#opcode-COPY) [`SWAP`](https://python-all.ru/3.16/library/dis.html#opcode-SWAP) | Инструкции манипуляции стеком |
| `JUMP_IF_NOT_EXC_MATCH` | [`CHECK_EXC_MATCH`](https://python-all.ru/3.16/library/dis.html#opcode-CHECK_EXC_MATCH) | Теперь выполняет проверку, но не переходит |
| `JUMP_ABSOLUTE` `POP_JUMP_IF_FALSE` `POP_JUMP_IF_TRUE` | [`JUMP_BACKWARD`](https://python-all.ru/3.16/library/dis.html#opcode-JUMP_BACKWARD) `POP_JUMP_BACKWARD_IF_*` `POP_JUMP_FORWARD_IF_*` | См. [\[3\]](https://python-all.ru/3.16/whatsnew/3.11.html#bytecode-jump); варианты `TRUE`, `FALSE`, `NONE` и `NOT_NONE` для каждого направления |
| `SETUP_WITH` `SETUP_ASYNC_WITH` | `BEFORE_WITH` | Настройка блока [`with`](https://python-all.ru/3.16/reference/compound_stmts.html#with) |

\[[3](https://python-all.ru/3.16/whatsnew/3.11.html#id4)\]

Все опкоды перехода теперь относительные, включая существующие `JUMP_IF_TRUE_OR_POP` и `JUMP_IF_FALSE_OR_POP`. Аргумент теперь является смещением от текущей инструкции, а не абсолютным адресом.

### Изменённые/удалённые опкоды

- Изменены [`MATCH_CLASS`](https://python-all.ru/3.16/library/dis.html#opcode-MATCH_CLASS) и [`MATCH_KEYS`](https://python-all.ru/3.16/library/dis.html#opcode-MATCH_KEYS): они больше не помещают дополнительное логическое значение для указания успеха/неудачи. Вместо этого при неудаче помещается `None` вместо кортежа извлечённых значений.
- Изменены опкоды, работающие с исключениями, чтобы отразить их представление в виде одного элемента в стеке вместо трёх (см. [gh-89874](https://python-all.ru/3.16/whatsnew/3.11.html)).
- Удалены `COPY_DICT_WITHOUT_KEYS`, `GEN_START`, `POP_BLOCK`, `SETUP_FINALLY` и `YIELD_FROM`.

## Устарело

В этом разделе перечислены API Python, объявленные устаревшими в Python 3.11.

Устаревшие C API [перечислены отдельно](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-c-api-deprecated).

### Язык/Встроенные функции

- Цепочка дескрипторов [`classmethod`](https://python-all.ru/3.16/library/functions.html#classmethod) (введённая в [bpo-19072](https://python-all.ru/3.16/whatsnew/3.11.html)) теперь устарела. Её больше нельзя использовать для оборачивания других дескрипторов, таких как [`property`](https://python-all.ru/3.16/library/functions.html#property). Базовая архитектура этой возможности была ошибочной и вызвала ряд проблем в дальнейшем. Для «пропускания» `classmethod` рекомендуется использовать атрибут `__wrapped__`, добавленный в Python 3.10. (Автор: Raymond Hettinger, [gh-89519](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Восьмеричные управляющие последовательности в строковых и байтовых литералах со значениями больше `0o377` (255 в десятичной системе) теперь вызывают [`DeprecationWarning`](https://python-all.ru/3.16/library/exceptions.html#DeprecationWarning). В будущей версии Python они будут порождать [`SyntaxWarning`](https://python-all.ru/3.16/library/exceptions.html#SyntaxWarning) и в конечном итоге [`SyntaxError`](https://python-all.ru/3.16/library/exceptions.html#SyntaxError). (Автор: Serhiy Storchaka в [gh-81548](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Делегирование [`int()`](https://python-all.ru/3.16/library/functions.html#int) в [`__trunc__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__trunc__) теперь устарело. Вызов `int(a)`, когда `type(a)` реализует `__trunc__()`, но не [`__int__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__int__) или [`__index__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__index__), теперь вызывает [`DeprecationWarning`](https://python-all.ru/3.16/library/exceptions.html#DeprecationWarning). (Автор: Zackery Spytz в [bpo-44977](https://python-all.ru/3.16/whatsnew/3.11.html).)

### Модули

- [**PEP 594**](https://python-all.ru/3.16/whatsnew/3.11.html) привёл к объявлению устаревшими следующих модулей, которые планируется удалить в Python 3.13:

  | `aifc` | `chunk` | `msilib` | `pipes` | `telnetlib` |
  | --- | --- | --- | --- | --- |
  | `audioop` | `crypt` | `nis` | `sndhdr` | `uu` |
  | `cgi` | `imghdr` | `nntplib` | `spwd` | `xdrlib` |
  | `cgitb` | `mailcap` | `ossaudiodev` | `sunau` |  |

  (Авторы: Brett Cannon в [bpo-47061](https://python-all.ru/3.16/whatsnew/3.11.html) и Victor Stinner в [gh-68966](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Модули `asynchat`, `asyncore` и `smtpd` устарели начиная как минимум с Python 3.6. Их документация и предупреждения об устаревании теперь обновлены, чтобы отметить, что они будут удалены в Python 3.12. (Автор: Hugo van Kemenade в [bpo-47022](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Пакет `lib2to3` и инструмент `2to3` теперь устарели и могут не поддерживать синтаксис Python 3.10 и новее. Подробнее см. [**PEP 617**](https://python-all.ru/3.16/whatsnew/3.11.html), который вводит новый PEG-парсер. (Автор: Victor Stinner в [bpo-40360](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Модули без документации `sre_compile`, `sre_constants` и `sre_parse` теперь устарели. (Автор: Serhiy Storchaka в [bpo-47152](https://python-all.ru/3.16/whatsnew/3.11.html).)

### Стандартная библиотека

- Следующие элементы устарели в [`configparser`](https://python-all.ru/3.16/library/configparser.html#module-configparser) начиная с Python 3.2. Теперь предупреждения об устаревании обновлены, чтобы указать, что они будут удалены в Python 3.12:

  - класс `configparser.SafeConfigParser`
  - свойство `configparser.ParsingError.filename`
  - метод `configparser.RawConfigParser.readfp()`

  (Автор: Hugo van Kemenade в [bpo-45173](https://python-all.ru/3.16/whatsnew/3.11.html).)
- `configparser.LegacyInterpolation` устарел в строке документации начиная с Python 3.2 и не указан в документации [`configparser`](https://python-all.ru/3.16/library/configparser.html#module-configparser). Теперь он вызывает [`DeprecationWarning`](https://python-all.ru/3.16/library/exceptions.html#DeprecationWarning) и будет удалён в Python 3.13. Вместо него используйте [`configparser.BasicInterpolation`](https://python-all.ru/3.16/library/configparser.html#configparser.BasicInterpolation) или [`configparser.ExtendedInterpolation`](https://python-all.ru/3.16/library/configparser.html#configparser.ExtendedInterpolation). (Автор: Hugo van Kemenade в [bpo-46607](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Старый набор функций [`importlib.resources`](https://python-all.ru/3.16/library/importlib.resources.html#module-importlib.resources) был объявлен устаревшим в пользу замен, добавленных в Python 3.9, и будет удалён в будущей версии Python из-за отсутствия поддержки ресурсов, находящихся в подкаталогах пакетов:

  - `importlib.resources.contents()`
  - `importlib.resources.is_resource()`
  - `importlib.resources.open_binary()`
  - `importlib.resources.open_text()`
  - `importlib.resources.read_binary()`
  - `importlib.resources.read_text()`
  - `importlib.resources.path()`
- Функция [`locale.getdefaultlocale()`](https://python-all.ru/3.16/library/locale.html#locale.getdefaultlocale) устарела и будет удалена в Python 3.15. Используйте функции [`locale.setlocale()`](https://python-all.ru/3.16/library/locale.html#locale.setlocale), [`locale.getpreferredencoding(False)`](https://python-all.ru/3.16/library/locale.html#locale.getpreferredencoding) и [`locale.getlocale()`](https://python-all.ru/3.16/library/locale.html#locale.getlocale). (Автор: Victor Stinner в [gh-90817](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Функция `locale.resetlocale()` устарела и будет удалена в Python 3.13. Вместо неё используйте `locale.setlocale(locale.LC_ALL, "")`. (Автор: Victor Stinner в [gh-90817](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Теперь будут применяться более строгие правила для числовых ссылок на группы и имён групп в [регулярных выражениях](https://python-all.ru/3.16/library/re.html#re-syntax). В качестве числовой ссылки будут приниматься только последовательности ASCII-цифр, а имя группы в [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes) шаблонах и строках замены может содержать только ASCII-буквы, цифры и символы подчёркивания. Пока что для синтаксиса, нарушающего эти правила, выводится предупреждение об устаревании. (Автор: Serhiy Storchaka в [gh-91760](https://python-all.ru/3.16/whatsnew/3.11.html).)
- В модуле [`re`](https://python-all.ru/3.16/library/re.html#module-re) функция `re.template()` и соответствующие флаги `re.TEMPLATE` и `re.T` устарели, поскольку они не были документированы и не имели очевидного назначения. Они будут удалены в Python 3.13. (Авторы: Serhiy Storchaka и Miro Hrončok в [gh-92728](https://python-all.ru/3.16/whatsnew/3.11.html).)
- `turtle.settiltangle()` устарел начиная с Python 3.1; теперь он выдаёт предупреждение об устаревании и будет удалён в Python 3.13. Используйте вместо него [`turtle.tiltangle()`](https://python-all.ru/3.16/library/turtle.html#turtle.tiltangle) (ранее он был ошибочно помечен как устаревший, и его строка документации теперь исправлена). (Автор: Hugo van Kemenade в [bpo-45837](https://python-all.ru/3.16/whatsnew/3.11.html).)
- [`typing.Text`](https://python-all.ru/3.16/library/typing.html#typing.Text), который существует исключительно для обеспечения совместимости между кодом Python 2 и Python 3, теперь устарел. Его удаление пока не планируется, но пользователям рекомендуется использовать [`str`](https://python-all.ru/3.16/library/stdtypes.html#str) везде, где это возможно. (Автор: Alex Waygood в [gh-92332](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Синтаксис с именованными аргументами для создания типов [`typing.TypedDict`](https://python-all.ru/3.16/library/typing.html#typing.TypedDict) теперь устарел. Поддержка будет удалена в Python 3.13. (Автор: Jingchen Ye в [gh-90224](https://python-all.ru/3.16/whatsnew/3.11.html).)
- `webbrowser.MacOSX` устарел и будет удалён в Python 3.13. Он не тестируется, не документирован и не используется самим [`webbrowser`](https://python-all.ru/3.16/library/webbrowser.html#module-webbrowser). (Автор: Donghee Na в [bpo-42255](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Поведение, при котором из тестовых методов [`TestCase`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase) и [`IsolatedAsyncioTestCase`](https://python-all.ru/3.16/library/unittest.html#unittest.IsolatedAsyncioTestCase) возвращается значение (отличное от значения по умолчанию `None`), теперь устарело.
- Объявлены устаревшими следующие неофициально документированные функции [`unittest`](https://python-all.ru/3.16/library/unittest.html#module-unittest), запланированные к удалению в Python 3.13:

  - `unittest.findTestCases()`
  - `unittest.makeSuite()`
  - `unittest.getTestCaseNames()`

  Вместо них используйте методы [`TestLoader`](https://python-all.ru/3.16/library/unittest.html#unittest.TestLoader):

  - [`unittest.TestLoader.loadTestsFromModule()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestLoader.loadTestsFromModule)
  - [`unittest.TestLoader.loadTestsFromTestCase()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestLoader.loadTestsFromTestCase)
  - [`unittest.TestLoader.getTestCaseNames()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestLoader.getTestCaseNames)

  (Автор: Erlend E. Aasland в [bpo-5846](https://python-all.ru/3.16/whatsnew/3.11.html).)
- `unittest.TestProgram.usageExit()` отмечен как устаревший, будет удалён в 3.13. (Автор: Carlos Damázio в [gh-67048](https://python-all.ru/3.16/whatsnew/3.11.html).)

## Запланировано к удалению в Python 3.12

Следующие Python API были объявлены устаревшими в более ранних версиях Python и будут удалены в Python 3.12.

API языка C, которые планируется удалить, [перечислены отдельно](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-c-api-pending-removal).

- Модуль `asynchat`
- Модуль `asyncore`
- [Весь пакет distutils](https://python-all.ru/3.16/whatsnew/3.10.html#distutils-deprecated)
- Модуль `imp`
- Пространство имён [`typing.io`](https://python-all.ru/3.16/library/typing.html#typing.IO)
- Пространство имён [`typing.re`](https://python-all.ru/3.16/library/typing.html#typing.Pattern)
- `cgi.log()`
- `importlib.find_loader()`
- `importlib.abc.Loader.module_repr()`
- `importlib.abc.MetaPathFinder.find_module()`
- `importlib.abc.PathEntryFinder.find_loader()`
- `importlib.abc.PathEntryFinder.find_module()`
- `importlib.machinery.BuiltinImporter.find_module()`
- `importlib.machinery.BuiltinLoader.module_repr()`
- `importlib.machinery.FileFinder.find_loader()`
- `importlib.machinery.FileFinder.find_module()`
- `importlib.machinery.FrozenImporter.find_module()`
- `importlib.machinery.FrozenLoader.module_repr()`
- `importlib.machinery.PathFinder.find_module()`
- `importlib.machinery.WindowsRegistryFinder.find_module()`
- `importlib.util.module_for_loader()`
- `importlib.util.set_loader_wrapper()`
- `importlib.util.set_package_wrapper()`
- `pkgutil.ImpImporter`
- `pkgutil.ImpLoader`
- `pathlib.Path.link_to()`
- `sqlite3.enable_shared_cache()`
- `sqlite3.OptimizedUnicode()`
- переменная окружения `PYTHONTHREADDEBUG`
- Следующие устаревшие псевдонимы в [`unittest`](https://python-all.ru/3.16/library/unittest.html#module-unittest):

  > | Устаревший псевдоним | Имя метода | Устарело в |
  > | --- | --- | --- |
  > | `failUnless` | [`assertTrue()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.assertTrue) | 3.1 |
  > | `failIf` | [`assertFalse()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.assertFalse) | 3.1 |
  > | `failUnlessEqual` | [`assertEqual()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.assertEqual) | 3.1 |
  > | `failIfEqual` | [`assertNotEqual()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.assertNotEqual) | 3.1 |
  > | `failUnlessAlmostEqual` | [`assertAlmostEqual()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.assertAlmostEqual) | 3.1 |
  > | `failIfAlmostEqual` | [`assertNotAlmostEqual()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.assertNotAlmostEqual) | 3.1 |
  > | `failUnlessRaises` | [`assertRaises()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.assertRaises) | 3.1 |
  > | `assert_` | [`assertTrue()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.assertTrue) | 3.2 |
  > | `assertEquals` | [`assertEqual()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.assertEqual) | 3.2 |
  > | `assertNotEquals` | [`assertNotEqual()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.assertNotEqual) | 3.2 |
  > | `assertAlmostEquals` | [`assertAlmostEqual()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.assertAlmostEqual) | 3.2 |
  > | `assertNotAlmostEquals` | [`assertNotAlmostEqual()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.assertNotAlmostEqual) | 3.2 |
  > | `assertRegexpMatches` | [`assertRegex()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.assertRegex) | 3.2 |
  > | `assertRaisesRegexp` | [`assertRaisesRegex()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.assertRaisesRegex) | 3.2 |
  > | `assertNotRegexpMatches` | [`assertNotRegex()`](https://python-all.ru/3.16/library/unittest.html#unittest.TestCase.assertNotRegex) | 3.5 |

## Удалено

В этом разделе перечислены API Python, которые были удалены в Python 3.11.

Удалённые C API [перечислены отдельно](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-c-api-removed).

- Удалён `@asyncio.coroutine()` [декоратор](https://python-all.ru/3.16/glossary.html#term-decorator), обеспечивающий совместимость устаревших корутин на основе генераторов с кодом [`async`](https://python-all.ru/3.16/reference/compound_stmts.html#async) / [`await`](https://python-all.ru/3.16/reference/expressions.html#await). Эта функция считается устаревшей с Python 3.8, и удаление изначально планировалось на Python 3.10. Используйте [`async def`](https://python-all.ru/3.16/reference/compound_stmts.html#async-def) вместо неё. (Автор: Illia Volochii в [bpo-43216](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Удалён `asyncio.coroutines.CoroWrapper`, использовавшийся для обёртывания устаревших корутинных объектов на основе генераторов в режиме отладки. (Автор: Illia Volochii в [bpo-43216](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Из-за серьёзных проблем безопасности параметр *reuse\_address* функции [`asyncio.loop.create_datagram_endpoint()`](https://python-all.ru/3.16/library/asyncio-eventloop.html#asyncio.loop.create_datagram_endpoint), отключённый в Python 3.9, теперь полностью удалён. Это связано с поведением опции сокета `SO_REUSEADDR` в UDP. (Автор: Hugo van Kemenade в [bpo-45129](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Удалён модуль `binhex`, считавшийся устаревшим в Python 3.9. Также удалены связанные с ним, также устаревшие, функции [`binascii`](https://python-all.ru/3.16/library/binascii.html#module-binascii):

  - `binascii.a2b_hqx()`
  - `binascii.b2a_hqx()`
  - `binascii.rlecode_hqx()`
  - `binascii.rldecode_hqx()`

  Функция [`binascii.crc_hqx()`](https://python-all.ru/3.16/library/binascii.html#binascii.crc_hqx) остаётся доступной.

  (Автор: Victor Stinner в [bpo-45085](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Удалена команда `distutils` `bdist_msi`, устаревшая в Python 3.9. Вместо неё используйте `bdist_wheel` (wheel-пакеты). (Автор: Hugo van Kemenade в [bpo-45124](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Удалены методы [`__getitem__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__getitem__) у [`xml.dom.pulldom.DOMEventStream`](https://python-all.ru/3.16/library/xml.dom.pulldom.html#xml.dom.pulldom.DOMEventStream), [`wsgiref.util.FileWrapper`](https://python-all.ru/3.16/library/wsgiref.html#wsgiref.util.FileWrapper) и [`fileinput.FileInput`](https://python-all.ru/3.16/library/fileinput.html#fileinput.FileInput), объявленные устаревшими с Python 3.9. (Автор: Hugo van Kemenade в [bpo-45132](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Удалены устаревшие функции [`gettext`](https://python-all.ru/3.16/library/gettext.html#module-gettext): `lgettext()`, `ldgettext()`, `lngettext()` и `ldngettext()`. Также удалены функция `bind_textdomain_codeset()`, методы `NullTranslations.output_charset()` и `NullTranslations.set_output_charset()`, а также параметр *codeset* функций `translation()` и `install()`, поскольку они используются только для функций `l*gettext()`. (Авторы: Donghee Na и Serhiy Storchaka в [bpo-44235](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Удалено из модуля [`inspect`](https://python-all.ru/3.16/library/inspect.html#module-inspect):

  - Функция `getargspec()`, устаревшая с Python 3.0; используйте [`inspect.signature()`](https://python-all.ru/3.16/library/inspect.html#inspect.signature) или [`inspect.getfullargspec()`](https://python-all.ru/3.16/library/inspect.html#inspect.getfullargspec) вместо неё.
  - Функция `formatargspec()`, устаревшая с Python 3.5; используйте функцию [`inspect.signature()`](https://python-all.ru/3.16/library/inspect.html#inspect.signature) или непосредственно объект [`inspect.Signature`](https://python-all.ru/3.16/library/inspect.html#inspect.Signature).
  - Незадокументированные методы `Signature.from_builtin()` и `Signature.from_function()`, устаревшие с Python 3.5; вместо них используйте метод [`Signature.from_callable()`](https://python-all.ru/3.16/library/inspect.html#inspect.Signature.from_callable).

  (Автор: Hugo van Kemenade в [bpo-45320](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Удалён метод [`__class_getitem__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__class_getitem__) из [`pathlib.PurePath`](https://python-all.ru/3.16/library/pathlib.html#pathlib.PurePath), поскольку он не использовался и был добавлен по ошибке в предыдущих версиях. (Автор: Nikita Sobolev в [bpo-46483](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Удалён класс `MailmanProxy` из модуля `smtpd`, так как он непригоден для использования без внешнего пакета `mailman`. (Автор: Donghee Na в [bpo-35800](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Удалён устаревший метод `split()` объекта `_tkinter.TkappType`. (Автор: Erlend E. Aasland в [bpo-38371](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Удалена поддержка пакетов пространства имён из обнаружения [`unittest`](https://python-all.ru/3.16/library/unittest.html#module-unittest). Она была введена в Python 3.4, но была неработоспособна начиная с Python 3.7. (Автор: Inada Naoki в [bpo-23882](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Удалён недокументированный приватный метод `float.__set_format__()`, ранее известный как `float.__setformat__()` в Python 3.7. Его докстринг гласил: «Вероятно, вам не следует использовать эту функцию. Она существует в основном для использования в тестовом наборе Python». (Автор: Victor Stinner в [bpo-46852](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Флаг конфигурации `--experimental-isolated-subinterpreters` (и соответствующий макрос `EXPERIMENTAL_ISOLATED_SUBINTERPRETERS`) были удалены.
- [Pynche](https://python-all.ru/3.16/whatsnew/3.11.html) – The Pythonically Natural Color and Hue Editor – был вынесен из `Tools/scripts` и [развивается независимо](https://python-all.ru/3.16/whatsnew/3.11.html) от дерева исходных кодов Python.

## Переход на Python 3.11

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

Замечания по переносу для C API [приведены отдельно](https://python-all.ru/3.16/whatsnew/3.11.html#whatsnew311-c-api-porting).

- [`open()`](https://python-all.ru/3.16/library/functions.html#open), [`io.open()`](https://python-all.ru/3.16/library/io.html#io.open), [`codecs.open()`](https://python-all.ru/3.16/library/codecs.html#codecs.open) и [`fileinput.FileInput`](https://python-all.ru/3.16/library/fileinput.html#fileinput.FileInput) больше не принимают `'U'` («универсальный символ новой строки») в режиме файла. В Python 3 режим «универсального символа новой строки» используется по умолчанию при открытии файла в текстовом режиме, а флаг `'U'` устарел начиная с Python 3.3. Параметр [параметр newline](https://python-all.ru/3.16/library/functions.html#open-newline-parameter) этих функций управляет работой универсальных символов новой строки. (Автор: Victor Stinner в [bpo-37330](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Позиции узлов [`ast.AST`](https://python-all.ru/3.16/library/ast.html#ast.AST) теперь проверяются при передаче в [`compile()`](https://python-all.ru/3.16/library/functions.html#compile) и другие связанные функции. Если обнаружены недопустимые позиции, будет вызвано исключение [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError). (Автор: Pablo Galindo в [gh-93351](https://python-all.ru/3.16/whatsnew/3.11.html))
- Запрещена передача исполнителей, не являющихся [`concurrent.futures.ThreadPoolExecutor`](https://python-all.ru/3.16/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor), в [`asyncio.loop.set_default_executor()`](https://python-all.ru/3.16/library/asyncio-eventloop.html#asyncio.loop.set_default_executor) после объявления устаревшим в Python 3.8. (Автор: Illia Volochii в [bpo-43234](https://python-all.ru/3.16/whatsnew/3.11.html).)
- [`calendar`](https://python-all.ru/3.16/library/calendar.html#module-calendar): классы [`calendar.LocaleTextCalendar`](https://python-all.ru/3.16/library/calendar.html#calendar.LocaleTextCalendar) и [`calendar.LocaleHTMLCalendar`](https://python-all.ru/3.16/library/calendar.html#calendar.LocaleHTMLCalendar) теперь используют [`locale.getlocale()`](https://python-all.ru/3.16/library/locale.html#locale.getlocale) вместо [`locale.getdefaultlocale()`](https://python-all.ru/3.16/library/locale.html#locale.getdefaultlocale), если локаль не указана. (Автор: Victor Stinner в [bpo-46659](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Модуль [`pdb`](https://python-all.ru/3.16/library/pdb.html#module-pdb) теперь читает конфигурационный файл `.pdbrc` с кодировкой `'UTF-8'`. (Автор: Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి) в [bpo-41137](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Параметр *популяция* функции [`random.sample()`](https://python-all.ru/3.16/library/random.html#random.sample) должен быть последовательностью, и автоматическое преобразование [`set`](https://python-all.ru/3.16/library/stdtypes.html#set) в [`list`](https://python-all.ru/3.16/library/stdtypes.html#list) больше не поддерживается. Кроме того, если размер выборки превышает размер популяции, вызывается исключение [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError). (Автор: Raymond Hettinger в [bpo-40465](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Необязательный параметр *random* функции [`random.shuffle()`](https://python-all.ru/3.16/library/random.html#random.shuffle) был удалён. Ранее это была произвольная случайная функция для перемешивания; теперь всегда будет использоваться [`random.random()`](https://python-all.ru/3.16/library/random.html#random.random) (её предыдущее значение по умолчанию).
- В [`re`](https://python-all.ru/3.16/library/re.html#module-re) [синтаксисе регулярных выражений](https://python-all.ru/3.16/library/re.html#re-syntax) глобальные инлайновые флаги (например `(?i)`) теперь можно использовать только в начале регулярных выражений. Использование их в других местах устарело с Python 3.6. (Автор: Serhiy Storchaka в [bpo-47066](https://python-all.ru/3.16/whatsnew/3.11.html).)
- В модуле [`re`](https://python-all.ru/3.16/library/re.html#module-re) были исправлены несколько давних ошибок, которые в редких случаях могли приводить к неверным результатам в захватываемых группах. Поэтому в этих случаях может измениться захваченный вывод. (Автор: Ma Lin в [bpo-35859](https://python-all.ru/3.16/whatsnew/3.11.html).)

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

- В CPython теперь есть [**PEP 11**](https://python-all.ru/3.16/whatsnew/3.11.html) [**поддержка третьего уровня**](https://python-all.ru/3.16/whatsnew/3.11.html) для кросс-компиляции на платформы [WebAssembly](https://python-all.ru/3.16/whatsnew/3.11.html) [Emscripten](https://python-all.ru/3.16/whatsnew/3.11.html) (`wasm32-unknown-emscripten`, т.е. Python в браузере) и [WebAssembly System Interface (WASI)](https://python-all.ru/3.16/whatsnew/3.11.html) (`wasm32-unknown-wasi`). Эта работа вдохновлена предыдущими проектами, такими как [Pyodide](https://python-all.ru/3.16/whatsnew/3.11.html). Эти платформы предоставляют ограниченное подмножество POSIX API; возможности и модули стандартной библиотеки Python, связанные с сетью, процессами, потоками, сигналами, mmap, пользователями/группами, недоступны или не работают. (Emscripten: авторы Christian Heimes и Ethan Smith в [gh-84461](https://python-all.ru/3.16/whatsnew/3.11.html) и WASI: автор Christian Heimes в [gh-90473](https://python-all.ru/3.16/whatsnew/3.11.html); платформы повышены до уровня в [gh-95085](https://python-all.ru/3.16/whatsnew/3.11.html))
- Для сборки CPython теперь требуется:

  - Компилятор [C11](https://python-all.ru/3.16/whatsnew/3.11.html) и стандартная библиотека. [Опциональные возможности C11](https://python-all.ru/3.16/whatsnew/3.11.html) не требуются. (Автор: Victor Stinner в [bpo-46656](https://python-all.ru/3.16/whatsnew/3.11.html), [bpo-45440](https://python-all.ru/3.16/whatsnew/3.11.html) и [bpo-46640](https://python-all.ru/3.16/whatsnew/3.11.html).)
  - Поддержка чисел с плавающей запятой стандарта [IEEE 754](https://python-all.ru/3.16/whatsnew/3.11.html). (Автор: Victor Stinner в [bpo-46917](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Макрос `Py_NO_NAN` был удалён. Поскольку CPython теперь требует IEEE 754 с плавающей запятой, значения NaN всегда доступны. (Автор: Victor Stinner в [bpo-46656](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Пакет [`tkinter`](https://python-all.ru/3.16/library/tkinter.html#module-tkinter) теперь требует [Tcl/Tk](https://python-all.ru/3.16/whatsnew/3.11.html) версии 8.5.12 или новее. (Автор: Serhiy Storchaka в [bpo-46996](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Зависимости сборки, флаги компилятора и флаги компоновщика для большинства модулей расширения стандартной библиотеки теперь определяются с помощью **configure**. Флаги для libffi, libnsl, libsqlite3, zlib, bzip2, liblzma, libcrypt, Tcl/Tk и uuid определяются [pkg-config](https://python-all.ru/3.16/whatsnew/3.11.html) (при наличии). Для [`tkinter`](https://python-all.ru/3.16/library/tkinter.html#module-tkinter) теперь требуется команда pkg-config, чтобы определить настройки разработки для заголовков и библиотек [Tcl/Tk](https://python-all.ru/3.16/whatsnew/3.11.html). (Авторы: Christian Heimes и Erlend Egeberg Aasland в [bpo-45847](https://python-all.ru/3.16/whatsnew/3.11.html), [bpo-45747](https://python-all.ru/3.16/whatsnew/3.11.html) и [bpo-45763](https://python-all.ru/3.16/whatsnew/3.11.html).)
- libpython больше не компонуется с libcrypt. (Автор: Mike Gilbert в [bpo-45433](https://python-all.ru/3.16/whatsnew/3.11.html).)
- CPython теперь может быть собран с опцией [ThinLTO](https://python-all.ru/3.16/whatsnew/3.11.html) путём передачи `thin` в [`--with-lto`](https://python-all.ru/3.16/using/configure.html#cmdoption-with-lto), т.е. `--with-lto=thin`. (Авторы: Donghee Na и Brett Holman в [bpo-44340](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Списки свободных блоков для структур объектов теперь можно отключить. Новая опция **configure** `--without-freelists` может использоваться для отключения всех списков свободных блоков, кроме синглтона пустого кортежа. (Автор: Christian Heimes в [bpo-45522](https://python-all.ru/3.16/whatsnew/3.11.html).)
- `Modules/Setup` и `Modules/makesetup` были улучшены и доработаны. Модули расширения теперь можно собирать через `makesetup`. Все, кроме некоторых тестовых модулей, могут быть статически скомпонованы в основную программу или библиотеку. (Авторы: Brett Cannon и Christian Heimes в [bpo-45548](https://python-all.ru/3.16/whatsnew/3.11.html), [bpo-45570](https://python-all.ru/3.16/whatsnew/3.11.html), [bpo-45571](https://python-all.ru/3.16/whatsnew/3.11.html) и [bpo-43974](https://python-all.ru/3.16/whatsnew/3.11.html).)

  > **Примечание**
  >
  > Используйте переменные окружения `TCLTK_CFLAGS` и `TCLTK_LIBS` для ручного указания расположения заголовков Tcl/Tk и библиотек. Опции **configure** `--with-tcltk-includes` и `--with-tcltk-libs` были удалены.
  >
  > В RHEL 7 и CentOS 7 пакеты разработки не предоставляют `tcl.pc` и `tk.pc`; используйте `TCLTK_LIBS="-ltk8.5 -ltkstub8.5 -ltcl8.5"`. Каталог `Misc/rhel7` содержит файлы `.pc` и инструкции о том, как собрать Python с Tcl/Tk и OpenSSL из RHEL 7 и CentOS 7.
- CPython теперь будет использовать 30-битные цифры по умолчанию для реализации [`int`](https://python-all.ru/3.16/library/functions.html#int) Python. Ранее по умолчанию использовались 30-битные цифры на платформах с `SIZEOF_VOID_P >= 8`, и 15-битные цифры в остальных случаях. По-прежнему возможно явно запросить использование 15-битных цифр через опцию [`--enable-big-digits`](https://python-all.ru/3.16/using/configure.html#cmdoption-enable-big-digits) скрипта configure или (для Windows) переменную `PYLONG_BITS_IN_DIGIT` в `PC/pyconfig.h`, но эта опция может быть удалена в будущем. (Автор: Mark Dickinson в [bpo-45569](https://python-all.ru/3.16/whatsnew/3.11.html).)

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

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

- Добавлена новая функция [`PyType_GetName()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_GetName) для получения краткого имени типа. (Автор: Hai Shi в [bpo-42035](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлена новая функция [`PyType_GetQualName()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_GetQualName) для получения полного имени типа. (Автор: Hai Shi в [bpo-42035](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлены новые функции [`PyThreadState_EnterTracing()`](https://python-all.ru/3.16/c-api/threads.html#c.PyThreadState_EnterTracing) и [`PyThreadState_LeaveTracing()`](https://python-all.ru/3.16/c-api/threads.html#c.PyThreadState_LeaveTracing) в ограниченный C API для приостановки и возобновления трассировки и профилирования. (Автор: Victor Stinner в [bpo-43760](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлена константа [`Py_Version`](https://python-all.ru/3.16/c-api/apiabiversion.html#c.Py_Version), которая имеет то же значение, что и [`PY_VERSION_HEX`](https://python-all.ru/3.16/c-api/apiabiversion.html#c.PY_VERSION_HEX). (Автор: Gabriele N. Tornetta в [bpo-43931](https://python-all.ru/3.16/whatsnew/3.11.html).)
- [`Py_buffer`](https://python-all.ru/3.16/c-api/buffer.html#c.Py_buffer) и API теперь являются частью ограниченного API и стабильного ABI:

  - [`PyObject_CheckBuffer()`](https://python-all.ru/3.16/c-api/buffer.html#c.PyObject_CheckBuffer)
  - [`PyObject_GetBuffer()`](https://python-all.ru/3.16/c-api/buffer.html#c.PyObject_GetBuffer)
  - [`PyBuffer_GetPointer()`](https://python-all.ru/3.16/c-api/buffer.html#c.PyBuffer_GetPointer)
  - [`PyBuffer_SizeFromFormat()`](https://python-all.ru/3.16/c-api/buffer.html#c.PyBuffer_SizeFromFormat)
  - [`PyBuffer_ToContiguous()`](https://python-all.ru/3.16/c-api/buffer.html#c.PyBuffer_ToContiguous)
  - [`PyBuffer_FromContiguous()`](https://python-all.ru/3.16/c-api/buffer.html#c.PyBuffer_FromContiguous)
  - [`PyObject_CopyData()`](https://python-all.ru/3.16/c-api/buffer.html#c.PyObject_CopyData)
  - [`PyBuffer_IsContiguous()`](https://python-all.ru/3.16/c-api/buffer.html#c.PyBuffer_IsContiguous)
  - [`PyBuffer_FillContiguousStrides()`](https://python-all.ru/3.16/c-api/buffer.html#c.PyBuffer_FillContiguousStrides)
  - [`PyBuffer_FillInfo()`](https://python-all.ru/3.16/c-api/buffer.html#c.PyBuffer_FillInfo)
  - [`PyBuffer_Release()`](https://python-all.ru/3.16/c-api/buffer.html#c.PyBuffer_Release)
  - [`PyMemoryView_FromBuffer()`](https://python-all.ru/3.16/c-api/memoryview.html#c.PyMemoryView_FromBuffer)
  - слоты типов [`bf_getbuffer`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyBufferProcs.bf_getbuffer) и [`bf_releasebuffer`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyBufferProcs.bf_releasebuffer)

  (Автор: Christian Heimes в [bpo-45459](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлена функция [`PyType_GetModuleByDef()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_GetModuleByDef), используемая для получения модуля, в котором был определён метод, в тех случаях, когда эта информация недоступна напрямую (через [`PyCMethod`](https://python-all.ru/3.16/c-api/structures.html#c.PyCMethod)). (Автор: Petr Viktorin в [bpo-46613](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлены новые функции для упаковки и распаковки C double (сериализации и десериализации): [`PyFloat_Pack2()`](https://python-all.ru/3.16/c-api/float.html#c.PyFloat_Pack2), [`PyFloat_Pack4()`](https://python-all.ru/3.16/c-api/float.html#c.PyFloat_Pack4), [`PyFloat_Pack8()`](https://python-all.ru/3.16/c-api/float.html#c.PyFloat_Pack8), [`PyFloat_Unpack2()`](https://python-all.ru/3.16/c-api/float.html#c.PyFloat_Unpack2), [`PyFloat_Unpack4()`](https://python-all.ru/3.16/c-api/float.html#c.PyFloat_Unpack4) и [`PyFloat_Unpack8()`](https://python-all.ru/3.16/c-api/float.html#c.PyFloat_Unpack8). (Автор: Victor Stinner в [bpo-46906](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлены новые функции для получения атрибутов объекта фрейма: [`PyFrame_GetBuiltins()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetBuiltins), [`PyFrame_GetGenerator()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetGenerator), [`PyFrame_GetGlobals()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetGlobals), [`PyFrame_GetLasti()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetLasti).
- Добавлены две новые функции для получения и установки активного экземпляра исключения: [`PyErr_GetHandledException()`](https://python-all.ru/3.16/c-api/exceptions.html#c.PyErr_GetHandledException) и [`PyErr_SetHandledException()`](https://python-all.ru/3.16/c-api/exceptions.html#c.PyErr_SetHandledException). Это альтернативы функциям [`PyErr_SetExcInfo()`](https://python-all.ru/3.16/c-api/exceptions.html#c.PyErr_SetExcInfo) и [`PyErr_GetExcInfo()`](https://python-all.ru/3.16/c-api/exceptions.html#c.PyErr_GetExcInfo), которые работают с устаревшим представлением исключений в виде кортежа из 3 элементов. (Автор: Irit Katriel в [bpo-46343](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Добавлен элемент [`PyConfig.safe_path`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.safe_path). (Автор: Victor Stinner в [gh-57684](https://python-all.ru/3.16/whatsnew/3.11.html).)

### Переход на Python 3.11

- Некоторые макросы были преобразованы в статические встроенные функции, чтобы избежать [проблем макросов](https://python-all.ru/3.16/whatsnew/3.11.html). Изменение должно быть в основном незаметным для пользователей, поскольку функции-заменители приводят свои аргументы к ожидаемым типам, чтобы избежать предупреждений компилятора из-за статических проверок типов. Однако, когда ограниченный C API установлен на \>=3.11, эти приведения не выполняются, и вызывающим сторонам потребуется приводить аргументы к ожидаемым типам. Подробнее см. [**PEP 670**](https://python-all.ru/3.16/whatsnew/3.11.html). (Авторы: Victor Stinner и Erlend E. Aasland в [gh-89653](https://python-all.ru/3.16/whatsnew/3.11.html).)
- [`PyErr_SetExcInfo()`](https://python-all.ru/3.16/c-api/exceptions.html#c.PyErr_SetExcInfo) больше не использует аргументы `type` и `traceback`, интерпретатор теперь получает эти значения из экземпляра исключения (аргумент `value`). Функция по-прежнему похищает ссылки всех трёх аргументов. (Автор: Irit Katriel в [bpo-45711](https://python-all.ru/3.16/whatsnew/3.11.html).)
- [`PyErr_GetExcInfo()`](https://python-all.ru/3.16/c-api/exceptions.html#c.PyErr_GetExcInfo) теперь получает поля `type` и `traceback` результата из экземпляра исключения (поле `value`). (Автор: Irit Katriel в [bpo-45711](https://python-all.ru/3.16/whatsnew/3.11.html).)
- [`_frozen`](https://python-all.ru/3.16/c-api/import.html#c._frozen) имеет новое поле `is_package`, указывающее, является ли замороженный модуль пакетом. Ранее отрицательное значение в поле `size` было индикатором. Теперь для `size` используются только неотрицательные значения. (Автор: Kumar Aditya в [bpo-46608](https://python-all.ru/3.16/whatsnew/3.11.html).)
- [`_PyFrameEvalFunction()`](https://python-all.ru/3.16/c-api/subinterpreters.html#c._PyFrameEvalFunction) теперь принимает `_PyInterpreterFrame*` в качестве второго параметра вместо `PyFrameObject*`. Подробнее об использовании этого типа указателя на функцию см. в [**PEP 523**](https://python-all.ru/3.16/whatsnew/3.11.html).
- `PyCode_New()` и `PyCode_NewWithPosOnlyArgs()` теперь принимают дополнительный аргумент `exception_table`. По возможности следует избегать использования этих функций. Чтобы получить пользовательский объект кода: создайте объект кода с помощью компилятора, затем получите изменённую версию методом `replace`.
- [`PyCodeObject`](https://python-all.ru/3.16/c-api/code.html#c.PyCodeObject) больше не имеет полей `co_code`, `co_varnames`, `co_cellvars` и `co_freevars`. Вместо этого используйте [`PyCode_GetCode()`](https://python-all.ru/3.16/c-api/code.html#c.PyCode_GetCode), [`PyCode_GetVarnames()`](https://python-all.ru/3.16/c-api/code.html#c.PyCode_GetVarnames), [`PyCode_GetCellvars()`](https://python-all.ru/3.16/c-api/code.html#c.PyCode_GetCellvars) и [`PyCode_GetFreevars()`](https://python-all.ru/3.16/c-api/code.html#c.PyCode_GetFreevars) соответственно для доступа к ним через C API. (Авторы: Brandt Bucher в [bpo-46841](https://python-all.ru/3.16/whatsnew/3.11.html) и Ken Jin в [gh-92154](https://python-all.ru/3.16/whatsnew/3.11.html) и [gh-94936](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Старые макросы trashcan (`Py_TRASHCAN_SAFE_BEGIN`/`Py_TRASHCAN_SAFE_END`) теперь устарели. Их следует заменить новыми макросами `Py_TRASHCAN_BEGIN` и `Py_TRASHCAN_END`.

  Функция tp\_dealloc с использованием старых макросов, например:

  ```python
  static void
  mytype_dealloc(mytype *p)
  {
      PyObject_GC_UnTrack(p);
      Py_TRASHCAN_SAFE_BEGIN(p);
      ...
      Py_TRASHCAN_SAFE_END
  }
  ```

  следует перенести на новые макросы следующим образом:

  ```python
  static void
  mytype_dealloc(mytype *p)
  {
      PyObject_GC_UnTrack(p);
      Py_TRASHCAN_BEGIN(p, mytype_dealloc)
      ...
      Py_TRASHCAN_END
  }
  ```

  Обратите внимание, что `Py_TRASHCAN_BEGIN` принимает второй аргумент, который должен быть функцией освобождения, в которой он находится.

  Для поддержки старых версий Python в той же кодовой базе можно определить следующие макросы и использовать их по всему коду (источник: эти макросы скопированы из кодовой базы `mypy`):

  ```python
  #if PY_VERSION_HEX >= 0x03080000
  #  define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc)
  #  define CPy_TRASHCAN_END(op) Py_TRASHCAN_END
  #else
  #  define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op)
  #  define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op)
  #endif
  ```
- Функция [`PyType_Ready()`](https://python-all.ru/3.16/c-api/type.html#c.PyType_Ready) теперь вызывает ошибку, если тип определён с установленным флагом [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC), но не имеет функции обхода ([`PyTypeObject.tp_traverse`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_traverse)). (Автор: Victor Stinner в [bpo-44263](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Heap-типы с флагом [`Py_TPFLAGS_IMMUTABLETYPE`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_IMMUTABLETYPE) теперь могут наследовать протокол vectorcall [**PEP 590**](https://python-all.ru/3.16/whatsnew/3.11.html). Ранее это было возможно только для [статических типов](https://python-all.ru/3.16/c-api/typeobj.html#static-types). (Автор: Erlend E. Aasland в [bpo-43908](https://python-all.ru/3.16/whatsnew/3.11.html))
- Поскольку [`Py_TYPE()`](https://python-all.ru/3.16/c-api/structures.html#c.Py_TYPE) изменена на встроенную статическую функцию, `Py_TYPE(obj) = new_type` необходимо заменить на `Py_SET_TYPE(obj, new_type)`: см. функцию [`Py_SET_TYPE()`](https://python-all.ru/3.16/c-api/structures.html#c.Py_SET_TYPE) (доступна начиная с Python 3.9). Для обратной совместимости можно использовать этот макрос:

  ```python
  #if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE)
  static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type)
  { ob->ob_type = type; }
  #define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type)
  #endif
  ```

  (Автор: Victor Stinner в [bpo-39573](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Поскольку [`Py_SIZE()`](https://python-all.ru/3.16/c-api/structures.html#c.Py_SIZE) изменена на встроенную статическую функцию, `Py_SIZE(obj) = new_size` необходимо заменить на `Py_SET_SIZE(obj, new_size)`: см. функцию [`Py_SET_SIZE()`](https://python-all.ru/3.16/c-api/structures.html#c.Py_SET_SIZE) (доступна начиная с Python 3.9). Для обратной совместимости можно использовать этот макрос:

  ```python
  #if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE)
  static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size)
  { ob->ob_size = size; }
  #define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size)
  #endif
  ```

  (Автор: Victor Stinner в [bpo-39573](https://python-all.ru/3.16/whatsnew/3.11.html).)
- `<Python.h>` больше не включает заголовочные файлы `<stdlib.h>`, `<stdio.h>`, `<errno.h>` и `<string.h>`, когда макрос `Py_LIMITED_API` установлен в `0x030b0000` (Python 3.11) или выше. Расширения C должны явно включать эти заголовочные файлы после `#include <Python.h>`. (Автор: Victor Stinner в [bpo-45434](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Файлы неограниченного API `cellobject.h`, `classobject.h`, `code.h`, `context.h`, `funcobject.h`, `genobject.h` и `longintrepr.h` были перемещены в каталог `Include/cpython`. Кроме того, заголовочный файл `eval.h` был удалён. Эти файлы не должны включаться напрямую, так как они уже включены в `Python.h`: [Include Files](https://python-all.ru/3.16/c-api/intro.html#api-includes). Если они включались напрямую, рассмотрите возможность включения `Python.h` вместо этого. (Автор: Victor Stinner в [bpo-35134](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Макрос `PyUnicode_CHECK_INTERNED()` был исключён из ограниченного C API. Он никогда не был там пригоден к использованию, потому что использовал внутренние структуры, недоступные в ограниченном C API. (Автор: Victor Stinner в [bpo-46007](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Следующие функции и тип для работы с фреймами теперь доступны напрямую через `#include <Python.h>`, больше не нужно добавлять `#include <frameobject.h>`:

  - [`PyFrame_Check()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_Check)
  - [`PyFrame_GetBack()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetBack)
  - [`PyFrame_GetBuiltins()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetBuiltins)
  - [`PyFrame_GetGenerator()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetGenerator)
  - [`PyFrame_GetGlobals()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetGlobals)
  - [`PyFrame_GetLasti()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetLasti)
  - [`PyFrame_GetLocals()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetLocals)
  - [`PyFrame_Type`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_Type)

  (Автор: Victor Stinner в [gh-93937](https://python-all.ru/3.16/whatsnew/3.11.html).)

- Элементы структуры [`PyFrameObject`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrameObject) были удалены из публичного C API.

  Хотя в документации указано, что поля [`PyFrameObject`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrameObject) могут измениться в любой момент, они долгое время оставались стабильными и использовались в нескольких популярных расширениях.

  В Python 3.11 структура кадра была реорганизована для оптимизации производительности. Некоторые поля были полностью удалены, так как они были деталями старой реализации.

  Поля [`PyFrameObject`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrameObject):

  - `f_back`: используйте [`PyFrame_GetBack()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetBack).
  - `f_blockstack`: удалено.
  - `f_builtins`: используйте [`PyFrame_GetBuiltins()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetBuiltins).
  - `f_code`: используйте [`PyFrame_GetCode()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetCode).
  - `f_gen`: используйте [`PyFrame_GetGenerator()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetGenerator).
  - `f_globals`: используйте [`PyFrame_GetGlobals()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetGlobals).
  - `f_iblock`: удалено.
  - `f_lasti`: используйте [`PyFrame_GetLasti()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetLasti). Код, использующий `f_lasti` с `PyCode_Addr2Line()`, должен использовать [`PyFrame_GetLineNumber()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetLineNumber) вместо этого; это может быть быстрее.
  - `f_lineno`: используйте [`PyFrame_GetLineNumber()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetLineNumber)
  - `f_locals`: используйте [`PyFrame_GetLocals()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetLocals).
  - `f_stackdepth`: удалено.
  - `f_state`: нет публичного API (переименовано в `f_frame.f_state`).
  - `f_trace`: нет публичного API.
  - `f_trace_lines`: используйте `PyObject_GetAttrString((PyObject*)frame, "f_trace_lines")`.
  - `f_trace_opcodes`: используйте `PyObject_GetAttrString((PyObject*)frame, "f_trace_opcodes")`.
  - `f_localsplus`: нет публичного API (переименовано в `f_frame.localsplus`).
  - `f_valuestack`: удалено.

  Объект кадра Python теперь создаётся лениво. Побочный эффект: к элементу [`f_back`](https://python-all.ru/3.16/reference/datamodel.html#frame.f_back) нельзя обращаться напрямую, так как его значение теперь также вычисляется лениво. Вместо этого необходимо вызывать функцию [`PyFrame_GetBack()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetBack).

  Отладчики, которые обращались к [`f_locals`](https://python-all.ru/3.16/reference/datamodel.html#frame.f_locals) напрямую, *должны* вызывать [`PyFrame_GetLocals()`](https://python-all.ru/3.16/c-api/frame.html#c.PyFrame_GetLocals) вместо этого. Им больше не нужно вызывать `PyFrame_FastToLocalsWithError()` или `PyFrame_LocalsToFast()`, более того, не следует вызывать эти функции. Необходимое обновление кадра теперь управляется виртуальной машиной.

  Код, определяющий `PyFrame_GetCode()` в Python 3.8 и старше:

  ```python
  #if PY_VERSION_HEX < 0x030900B1
  static inline PyCodeObject* PyFrame_GetCode(PyFrameObject *frame)
  {
      Py_INCREF(frame->f_code);
      return frame->f_code;
  }
  #endif
  ```

  Код, определяющий `PyFrame_GetBack()` в Python 3.8 и старше:

  ```python
  #if PY_VERSION_HEX < 0x030900B1
  static inline PyFrameObject* PyFrame_GetBack(PyFrameObject *frame)
  {
      Py_XINCREF(frame->f_back);
      return frame->f_back;
  }
  #endif
  ```

  Или используйте проект [pythoncapi\_compat](https://python-all.ru/3.16/whatsnew/3.11.html), чтобы получить эти две функции в старых версиях Python.
- Изменения элементов структуры [`PyThreadState`](https://python-all.ru/3.16/c-api/threads.html#c.PyThreadState):

  - `frame`: удалено, используйте [`PyThreadState_GetFrame()`](https://python-all.ru/3.16/c-api/threads.html#c.PyThreadState_GetFrame) (функция добавлена в Python 3.9 в [bpo-40429](https://python-all.ru/3.16/whatsnew/3.11.html)). Предупреждение: функция возвращает [сильную ссылку](https://python-all.ru/3.16/glossary.html#term-strong-reference), необходимо вызвать [`Py_XDECREF()`](https://python-all.ru/3.16/c-api/refcounting.html#c.Py_XDECREF).
  - `tracing`: изменено, используйте [`PyThreadState_EnterTracing()`](https://python-all.ru/3.16/c-api/threads.html#c.PyThreadState_EnterTracing) и [`PyThreadState_LeaveTracing()`](https://python-all.ru/3.16/c-api/threads.html#c.PyThreadState_LeaveTracing) (функции добавлены в Python 3.11 в [bpo-43760](https://python-all.ru/3.16/whatsnew/3.11.html)).
  - `recursion_depth`: удалено, используйте `(tstate->recursion_limit - tstate->recursion_remaining)` вместо этого.
  - `stackcheck_counter`: удалено.

  Код, определяющий `PyThreadState_GetFrame()` в Python 3.8 и старше:

  ```python
  #if PY_VERSION_HEX < 0x030900B1
  static inline PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate)
  {
      Py_XINCREF(tstate->frame);
      return tstate->frame;
  }
  #endif
  ```

  Код, определяющий `PyThreadState_EnterTracing()` и `PyThreadState_LeaveTracing()` в Python 3.10 и старше:

  ```python
  #if PY_VERSION_HEX < 0x030B00A2
  static inline void PyThreadState_EnterTracing(PyThreadState *tstate)
  {
      tstate->tracing++;
  #if PY_VERSION_HEX >= 0x030A00A1
      tstate->cframe->use_tracing = 0;
  #else
      tstate->use_tracing = 0;
  #endif
  }

  static inline void PyThreadState_LeaveTracing(PyThreadState *tstate)
  {
      int use_tracing = (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL);
      tstate->tracing--;
  #if PY_VERSION_HEX >= 0x030A00A1
      tstate->cframe->use_tracing = use_tracing;
  #else
      tstate->use_tracing = use_tracing;
  #endif
  }
  #endif
  ```

  Или используйте [проект pythoncapi-compat](https://python-all.ru/3.16/whatsnew/3.11.html), чтобы получить эти функции в старых версиях Python.
- Распространителям рекомендуется собирать Python с оптимизированной библиотекой Blake2 [libb2](https://python-all.ru/3.16/whatsnew/3.11.html).
- Теперь для инициализации с использованием [`PyConfig.module_search_paths`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.module_search_paths) для инициализации [`sys.path`](https://python-all.ru/3.16/library/sys.html#sys.path) поле [`PyConfig.module_search_paths_set`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.module_search_paths_set) должно быть установлено в 1. В противном случае инициализация пересчитает путь и заменит любые значения, добавленные в `module_search_paths`.
- [`PyConfig_Read()`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig_Read) больше не вычисляет начальный путь поиска и не будет заполнять значения в [`PyConfig.module_search_paths`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig.module_search_paths). Чтобы вычислить пути по умолчанию и затем изменить их, завершите инициализацию и используйте [`PySys_GetObject()`](https://python-all.ru/3.16/c-api/sys.html#c.PySys_GetObject) для получения [`sys.path`](https://python-all.ru/3.16/library/sys.html#sys.path) в виде объекта списка Python и измените его напрямую.

### Устарело

- Объявить устаревшими следующие функции для настройки инициализации Python:

  - `PySys_AddWarnOptionUnicode()`
  - `PySys_AddWarnOption()`
  - `PySys_AddXOption()`
  - `PySys_HasWarnOptions()`
  - `PySys_SetArgvEx()`
  - `PySys_SetArgv()`
  - `PySys_SetPath()`
  - `Py_SetPath()`
  - `Py_SetProgramName()`
  - `Py_SetPythonHome()`
  - `Py_SetStandardStreamEncoding()`
  - `_Py_SetProgramFullPath()`

  Используйте новый API [`PyConfig`](https://python-all.ru/3.16/c-api/init_config.html#c.PyConfig) из [конфигурации инициализации Python](https://python-all.ru/3.16/c-api/init_config.html#init-config) вместо этого ([**PEP 587**](https://python-all.ru/3.16/whatsnew/3.11.html)). (Автор: Victor Stinner в [gh-88279](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Устарел элемент `ob_shash` из [`PyBytesObject`](https://python-all.ru/3.16/c-api/bytes.html#c.PyBytesObject). Вместо него используйте [`PyObject_Hash()`](https://python-all.ru/3.16/c-api/object.html#c.PyObject_Hash). (Автор: Inada Naoki в [bpo-46864](https://python-all.ru/3.16/whatsnew/3.11.html).)

### Запланировано к удалению в Python 3.12

Следующие C API были объявлены устаревшими в предыдущих версиях Python и будут удалены в Python 3.12.

- `PyUnicode_AS_DATA()`
- `PyUnicode_AS_UNICODE()`
- `PyUnicode_AsUnicodeAndSize()`
- `PyUnicode_AsUnicode()`
- `PyUnicode_FromUnicode()`
- `PyUnicode_GET_DATA_SIZE()`
- `PyUnicode_GET_SIZE()`
- `PyUnicode_GetSize()`
- `PyUnicode_IS_COMPACT()`
- `PyUnicode_IS_READY()`
- [`PyUnicode_READY()`](https://python-all.ru/3.16/c-api/unicode.html#c.PyUnicode_READY)
- `PyUnicode_WSTR_LENGTH()`
- `_PyUnicode_AsUnicode()`
- `PyUnicode_WCHAR_KIND`
- [`PyUnicodeObject`](https://python-all.ru/3.16/c-api/unicode.html#c.PyUnicodeObject)
- `PyUnicode_InternImmortal()`

### Удалено

- `PyFrame_BlockSetup()` и `PyFrame_BlockPop()` были удалены. (Автор: Mark Shannon в [bpo-40222](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Удалите следующие математические макросы, использующие переменную `errno`:

  - `Py_ADJUST_ERANGE1()`
  - `Py_ADJUST_ERANGE2()`
  - `Py_OVERFLOWED()`
  - `Py_SET_ERANGE_IF_OVERFLOW()`
  - `Py_SET_ERRNO_ON_MATH_ERROR()`

  (Автор: Victor Stinner в [bpo-45412](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Удалите макросы `Py_UNICODE_COPY()` и `Py_UNICODE_FILL()`, устаревшие начиная с Python 3.3. Вместо них используйте `PyUnicode_CopyCharacters()` или `memcpy()` (строку `wchar_t*`) и функции `PyUnicode_Fill()`. (Автор: Victor Stinner в [bpo-41123](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Удалите заголовочный файл `pystrhex.h`. Он содержит только внутренние функции. Расширения C должны включать только главный заголовочный файл `<Python.h>`. (Автор: Victor Stinner в [bpo-45434](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Удалите макрос `Py_FORCE_DOUBLE()`. Он использовался макросом `Py_IS_INFINITY()`. (Автор: Victor Stinner в [bpo-45440](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Следующие элементы больше не доступны, когда определён [`Py_LIMITED_API`](https://python-all.ru/3.16/c-api/stable.html#c.Py_LIMITED_API):

  - [`PyMarshal_WriteLongToFile()`](https://python-all.ru/3.16/c-api/marshal.html#c.PyMarshal_WriteLongToFile)
  - [`PyMarshal_WriteObjectToFile()`](https://python-all.ru/3.16/c-api/marshal.html#c.PyMarshal_WriteObjectToFile)
  - [`PyMarshal_ReadObjectFromString()`](https://python-all.ru/3.16/c-api/marshal.html#c.PyMarshal_ReadObjectFromString)
  - [`PyMarshal_WriteObjectToString()`](https://python-all.ru/3.16/c-api/marshal.html#c.PyMarshal_WriteObjectToString)
  - макрос `Py_MARSHAL_VERSION`

  Они не являются частью [ограниченного API](https://python-all.ru/3.16/c-api/stable.html#limited-api-list).

  (Автор: Victor Stinner в [bpo-45474](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Исключите `PyWeakref_GET_OBJECT()` из ограниченного C API. Он никогда не работал, поскольку структура `PyWeakReference` является непрозрачной в ограниченном C API. (Автор: Victor Stinner в [bpo-35134](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Удалите макрос `PyHeapType_GET_MEMBERS()`. Он был по ошибке включён в публичный C API, этот макрос должен использоваться только внутри Python. Вместо него используйте элемент `PyTypeObject.tp_members`. (Автор: Victor Stinner в [bpo-40170](https://python-all.ru/3.16/whatsnew/3.11.html).)
- Удалите макрос `HAVE_PY_SET_53BIT_PRECISION` (перенесён во внутренний C API). (Автор: Victor Stinner в [bpo-45412](https://python-all.ru/3.16/whatsnew/3.11.html).)

- Удалите API кодировщиков [`Py_UNICODE`](https://python-all.ru/3.16/c-api/unicode.html#c.Py_UNICODE), так как они устарели начиная с Python 3.3, редко используются и неэффективны по сравнению с рекомендуемыми альтернативами.

  Удалённые функции:

  - `PyUnicode_Encode()`
  - `PyUnicode_EncodeASCII()`
  - `PyUnicode_EncodeLatin1()`
  - `PyUnicode_EncodeUTF7()`
  - `PyUnicode_EncodeUTF8()`
  - `PyUnicode_EncodeUTF16()`
  - `PyUnicode_EncodeUTF32()`
  - `PyUnicode_EncodeUnicodeEscape()`
  - `PyUnicode_EncodeRawUnicodeEscape()`
  - `PyUnicode_EncodeCharmap()`
  - `PyUnicode_TranslateCharmap()`
  - `PyUnicode_EncodeDecimal()`
  - `PyUnicode_TransformDecimalToASCII()`

  Подробнее см. [**PEP 624**](https://python-all.ru/3.16/whatsnew/3.11.html) и [**руководство по миграции**](https://python-all.ru/3.16/whatsnew/3.11.html). (Автор: Inada Naoki в [bpo-44029](https://python-all.ru/3.16/whatsnew/3.11.html).)

## Заметные изменения в 3.11.4

### tarfile

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

## Заметные изменения в 3.11.5

### OpenSSL

- Сборки для Windows и установщики для macOS с python.org теперь используют OpenSSL 3.0.
