Документация Python неофициальный перевод

3.10.md

1270 строк · 164.2 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.11/whatsnew/3.10.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Что нового в Python 3.1089**Редактор:**1011Pablo Galindo Salgado1213В этой статье описаны новые возможности Python 3.10 по сравнению с 3.9. Python 3.10 был выпущен 4 октября 2021 года. Полную информацию см. в [журнале изменений](https://python-all.ru/3.11/whatsnew/changelog.html#changelog).1415## Итоги – основные изменения1617Новые синтаксические возможности:1819- [**PEP 634**](https://python-all.ru/3.11/whatsnew/3.10.html), Структурное сопоставление с образцом: спецификация20- [**PEP 635**](https://python-all.ru/3.11/whatsnew/3.10.html), Структурное сопоставление с образцом: мотивация и обоснование21- [**PEP 636**](https://python-all.ru/3.11/whatsnew/3.10.html), Структурное сопоставление с образцом: руководство22- [bpo-12782](https://python-all.ru/3.11/whatsnew/3.10.html), теперь официально разрешены контекстные менеджеры в скобках.2324Новые возможности в стандартной библиотеке:2526- [**PEP 618**](https://python-all.ru/3.11/whatsnew/3.10.html), добавление опциональной проверки длины в zip.2728Улучшения интерпретатора:2930- [**PEP 626**](https://python-all.ru/3.11/whatsnew/3.10.html), точные номера строк для отладки и других инструментов.3132Новые возможности типизации:3334- [**PEP 604**](https://python-all.ru/3.11/whatsnew/3.10.html), разрешение записи объединённых типов как X | Y35- [**PEP 612**](https://python-all.ru/3.11/whatsnew/3.10.html), переменные спецификации параметров36- [**PEP 613**](https://python-all.ru/3.11/whatsnew/3.10.html), явные псевдонимы типов37- [**PEP 647**](https://python-all.ru/3.11/whatsnew/3.10.html), пользовательские гарды типов3839Важные устаревания, удаления и ограничения:4041- [**PEP 644**](https://python-all.ru/3.11/whatsnew/3.10.html), требуется OpenSSL 1.1.1 или новее42- [**PEP 632**](https://python-all.ru/3.11/whatsnew/3.10.html), устаревание модуля distutils.43- [**PEP 623**](https://python-all.ru/3.11/whatsnew/3.10.html), устаревание и подготовка к удалению элемента wstr в PyUnicodeObject.44- [**PEP 624**](https://python-all.ru/3.11/whatsnew/3.10.html), удаление API кодировщиков Py\_UNICODE45- [**PEP 597**](https://python-all.ru/3.11/whatsnew/3.10.html), добавление опционального EncodingWarning4647## Новые возможности4849### Контекстные менеджеры в скобках5051Теперь поддерживается использование круглых скобок для переноса на несколько строк в контекстных менеджерах. Это позволяет форматировать длинный набор контекстных менеджеров на нескольких строках аналогично тому, как это было возможно ранее с операторами import. Например, все эти примеры теперь являются допустимыми:5253```python54with (CtxManager() as example):55    ...5657with (58    CtxManager1(),59    CtxManager2()60):61    ...6263with (CtxManager1() as example,64      CtxManager2()):65    ...6667with (CtxManager1(),68      CtxManager2() as example):69    ...7071with (72    CtxManager1() as example1,73    CtxManager2() as example274):75    ...76```7778также можно использовать завершающую запятую в конце заключённой группы:7980```python81with (82    CtxManager1() as example1,83    CtxManager2() as example2,84    CtxManager3() as example3,85):86    ...87```8889Этот новый синтаксис использует не LL(1) возможности нового парсера. Подробнее см. [**PEP 617**](https://python-all.ru/3.11/whatsnew/3.10.html).9091(Авторы: Guido van Rossum, Pablo Galindo и Lysandros Nikolaou в [bpo-12782](https://python-all.ru/3.11/whatsnew/3.10.html) и [bpo-40334](https://python-all.ru/3.11/whatsnew/3.10.html).)9293### Улучшенные сообщения об ошибках9495#### SyntaxErrors9697При разборе кода, содержащего незакрытые скобки или квадратные скобки, интерпретатор теперь указывает местоположение незакрытой скобки вместо отображения *SyntaxError: unexpected EOF while parsing* или указания на некорректное местоположение. Например, рассмотрим следующий код (обратите внимание на незакрытую ‘{‘):9899```python100expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,101            38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6,102some_other_code = foo()103```104105Предыдущие версии интерпретатора сообщали о запутанных местах как о местоположении синтаксической ошибки:106107```python108File "example.py", line 3109    some_other_code = foo()110                    ^111SyntaxError: invalid syntax112```113114но в Python 3.10 выводится более информативная ошибка:115116```python117File "example.py", line 1118    expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,119               ^120SyntaxError: '{' was never closed121```122123Аналогично, ошибки, связанные с незакрытыми строковыми литералами (одинарные и тройные кавычки), теперь указывают на начало строки вместо сообщения EOF/EOL.124125Эти улучшения вдохновлены предыдущей работой в интерпретаторе PyPy.126127(Авторы: Pablo Galindo в [bpo-42864](https://python-all.ru/3.11/whatsnew/3.10.html) и Batuhan Taskaya в [bpo-40176](https://python-all.ru/3.11/whatsnew/3.10.html).)128129[`SyntaxError`](https://python-all.ru/3.11/library/exceptions.html#SyntaxError) исключения, вызываемые интерпретатором, теперь будут подсвечивать полный диапазон выражения, которое составляет саму синтаксическую ошибку, а не только место, где обнаружена проблема. Таким образом, вместо отображения (до Python 3.10):130131```python132>>> foo(x, z for z in range(10), t, w)133  File "<stdin>", line 1134    foo(x, z for z in range(10), t, w)135           ^136SyntaxError: Generator expression must be parenthesized137```138139теперь Python 3.10 будет отображать исключение как:140141```python142>>> foo(x, z for z in range(10), t, w)143  File "<stdin>", line 1144    foo(x, z for z in range(10), t, w)145           ^^^^^^^^^^^^^^^^^^^^146SyntaxError: Generator expression must be parenthesized147```148149Это улучшение было предложено Пабло Галиндо в [bpo-43914](https://python-all.ru/3.11/whatsnew/3.10.html).150151Добавлено значительное количество новых специализированных сообщений для исключений [`SyntaxError`](https://python-all.ru/3.11/library/exceptions.html#SyntaxError). Наиболее примечательные из них:152153- Пропущен `:` перед блоками:154155  ```python156  >>> if rocket.position > event_horizon157    File "<stdin>", line 1158      if rocket.position > event_horizon159                                        ^160  SyntaxError: expected ':'161  ```162163  (Предложено Пабло Галиндо в [bpo-42997](https://python-all.ru/3.11/whatsnew/3.10.html).)164- Кортежи без скобок в целях (targets) генераторов:165166  ```python167  >>> {x,y for x,y in zip('abcd', '1234')}168    File "<stdin>", line 1169      {x,y for x,y in zip('abcd', '1234')}170       ^171  SyntaxError: did you forget parentheses around the comprehension target?172  ```173174  (Предложено Пабло Галиндо в [bpo-43017](https://python-all.ru/3.11/whatsnew/3.10.html).)175- Отсутствуют запятые в литералах коллекций и между выражениями:176177  ```python178  >>> items = {179  ... x: 1,180  ... y: 2181  ... z: 3,182    File "<stdin>", line 3183      y: 2184         ^185  SyntaxError: invalid syntax. Perhaps you forgot a comma?186  ```187188  (Предложено Пабло Галиндо в [bpo-43822](https://python-all.ru/3.11/whatsnew/3.10.html).)189- Несколько типов исключений без скобок:190191  ```python192  >>> try:193  ...     build_dyson_sphere()194  ... except NotEnoughScienceError, NotEnoughResourcesError:195    File "<stdin>", line 3196      except NotEnoughScienceError, NotEnoughResourcesError:197             ^198  SyntaxError: multiple exception types must be parenthesized199  ```200201  (Предложено Пабло Галиндо в [bpo-43149](https://python-all.ru/3.11/whatsnew/3.10.html).)202- Отсутствуют `:` и значения в литералах словарей:203204  ```python205  >>> values = {206  ... x: 1,207  ... y: 2,208  ... z:209  ... }210    File "<stdin>", line 4211      z:212       ^213  SyntaxError: expression expected after dictionary key and ':'214215  >>> values = {x:1, y:2, z w:3}216    File "<stdin>", line 1217      values = {x:1, y:2, z w:3}218                          ^219  SyntaxError: ':' expected after dictionary key220  ```221222  (Предложено Пабло Галиндо в [bpo-43823](https://python-all.ru/3.11/whatsnew/3.10.html).)223- Блоки `try` без блоков `except` или `finally`:224225  ```python226  >>> try:227  ...     x = 2228  ... something = 3229    File "<stdin>", line 3230      something  = 3231      ^^^^^^^^^232  SyntaxError: expected 'except' or 'finally' block233  ```234235  (Предложено Пабло Галиндо в [bpo-44305](https://python-all.ru/3.11/whatsnew/3.10.html).)236- Использование `=` вместо `==` в сравнениях:237238  ```python239  >>> if rocket.position = event_horizon:240    File "<stdin>", line 1241      if rocket.position = event_horizon:242                         ^243  SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?244  ```245246  (Предложено Пабло Галиндо в [bpo-43797](https://python-all.ru/3.11/whatsnew/3.10.html).)247- Использование `*` в f-строках:248249  ```python250  >>> f"Black holes {*all_black_holes} and revelations"251    File "<stdin>", line 1252      (*all_black_holes)253       ^254  SyntaxError: f-string: cannot use starred expression here255  ```256257  (Предложено Пабло Галиндо в [bpo-41064](https://python-all.ru/3.11/whatsnew/3.10.html).)258259#### IndentationErrors260261Многие исключения [`IndentationError`](https://python-all.ru/3.11/library/exceptions.html#IndentationError) теперь содержат больше контекста о том, какой блок ожидал отступа, включая местоположение инструкции:262263```python264>>> def foo():265...    if lel:266...    x = 2267  File "<stdin>", line 3268    x = 2269    ^270IndentationError: expected an indented block after 'if' statement in line 2271```272273#### AttributeErrors274275При выводе [`AttributeError`](https://python-all.ru/3.11/library/exceptions.html#AttributeError), `PyErr_Display()` будет предлагать имена похожих атрибутов в объекте, в котором возникло исключение:276277```python278>>> collections.namedtoplo279Traceback (most recent call last):280  File "<stdin>", line 1, in <module>281AttributeError: module 'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?282```283284(Предложено Пабло Галиндо в [bpo-38530](https://python-all.ru/3.11/whatsnew/3.10.html).)285286> **Предупреждение**287>288> Обратите внимание: это не будет работать, если `PyErr_Display()` не вызывается для отображения ошибки что может произойти, если используется другая пользовательская функция отображения ошибок. Это обычная ситуация в некоторых интерактивных оболочках, например IPython.289290#### NameErrors291292При выводе [`NameError`](https://python-all.ru/3.11/library/exceptions.html#NameError), вызванного интерпретатором, `PyErr_Display()` будет предлагать имена похожих переменных в функции, в которой возникло исключение:293294```python295>>> schwarzschild_black_hole = None296>>> schwarschild_black_hole297Traceback (most recent call last):298  File "<stdin>", line 1, in <module>299NameError: name 'schwarschild_black_hole' is not defined. Did you mean: schwarzschild_black_hole?300```301302(Предложено Пабло Галиндо в [bpo-38530](https://python-all.ru/3.11/whatsnew/3.10.html).)303304> **Предупреждение**305>306> Обратите внимание: это не будет работать, если `PyErr_Display()` не вызывается для отображения ошибки, что может произойти, если используется другая пользовательская функция отображения ошибок. Это обычная ситуация в некоторых интерактивных оболочках, например IPython.307308### PEP 626: Точные номера строк для отладки и других инструментов309310PEP 626 привносит более точные и надёжные номера строк для инструментов отладки, профилирования и покрытия кода. События трассировки с правильным номером строки генерируются для всех выполняемых строк кода и только для выполняемых строк кода.311312Атрибут [`f_lineno`](https://python-all.ru/3.11/reference/datamodel.html#frame.f_lineno) объектов фреймов всегда будет содержать ожидаемый номер строки.313314Атрибут [`co_lnotab`](https://python-all.ru/3.11/reference/datamodel.html#codeobject.co_lnotab) [объектов кода](https://python-all.ru/3.11/reference/datamodel.html#code-objects) устарел и будет удалён в версии 3.12. Коду, которому необходимо преобразовывать смещение в номер строки, следует использовать новый метод [`co_lines()`](https://python-all.ru/3.11/reference/datamodel.html#codeobject.co_lines).315316### PEP 634: Структурное сопоставление с образцом317318Структурное сопоставление с образцом было добавлено в виде *оператора match* и *операторов case* с шаблонами и связанными с ними действиями. Шаблоны состоят из последовательностей, отображений, примитивных типов данных, а также экземпляров классов. Сопоставление с образцом позволяет программам извлекать информацию из сложных типов данных, выполнять ветвление на основе структуры данных и применять конкретные действия в зависимости от формы данных.319320#### Синтаксис и операции321322Общий синтаксис сопоставления с образцом:323324```python325match subject:326    case <pattern_1>:327        <action_1>328    case <pattern_2>:329        <action_2>330    case <pattern_3>:331        <action_3>332    case _:333        <action_wildcard>334```335336Оператор match принимает выражение и сравнивает его значение с последовательными шаблонами, заданными в виде одного или нескольких блоков case. В частности, сопоставление с образцом работает следующим образом:3373381. используя данные с типом и формой (`subject`)3392. вычисляя `subject` в операторе `match`3403. сравнивая проверяемое значение с каждым шаблоном в операторе `case` сверху вниз до подтверждения совпадения.3414. выполняя действие, связанное с шаблоном подтверждённого совпадения3425. Если точное совпадение не подтверждено, последний оператор case, универсальный шаблон `_`, если он предусмотрен, будет использован как совпадающий. Если точное совпадение не подтверждено и универсальный шаблон отсутствует, весь блок match ничего не делает (no-op).343344#### Декларативный подход345346Читатели могут быть знакомы с сопоставлением с образцом по простому примеру сопоставления выражения (объекта данных) с литералом (шаблоном) с помощью оператора switch в C, Java или JavaScript (и многих других языках). Часто оператор switch используется для сравнения объекта/выражения с операторами case, содержащими литералы.347348Более мощные примеры сопоставления с образцом можно найти в таких языках, как Scala и Elixir. При структурном сопоставлении с образцом подход является «декларативным» и явно задаёт условия (шаблоны), которым должны соответствовать данные.349350Хотя «императивный» набор инструкций с вложенными операторами «if» можно использовать для достижения чего-то похожего на структурное сопоставление с образцом, он менее понятен, чем «декларативный» подход. Вместо этого «декларативный» подход задаёт условия для совпадения и более читаем благодаря явным шаблонам. Хотя структурное сопоставление с образцом можно использовать в его простейшей форме – сравнение переменной с литералом в операторе case, его истинная ценность для Python заключается в обработке типа и формы проверяемого значения.351352#### Простой шаблон: сопоставление с литералом353354Рассмотрим этот пример как сопоставление с образцом в его простейшей форме: значение (проверяемое выражение) сопоставляется с несколькими литералами (шаблонами). В примере ниже `status` является проверяемым выражением оператора match. Шаблонами являются каждый из операторов case, где литералы представляют коды статуса запроса. Связанное с оператором case действие выполняется после совпадения:355356```python357def http_error(status):358    match status:359        case 400:360            return "Bad request"361        case 404:362            return "Not found"363        case 418:364            return "I'm a teapot"365        case _:366            return "Something's wrong with the internet"367```368369Если в указанную выше функцию передано `status` со значением 418, возвращается «I’m a teapot». Если передано `status` со значением 500, оператор case с `_` совпадёт как универсальный шаблон, и будет возвращено «Something’s wrong with the internet». Обратите внимание на последний блок: имя переменной `_` действует как *универсальный шаблон* и гарантирует, что проверяемое значение всегда совпадёт. Использование `_` необязательно.370371Можно объединить несколько литералов в одном шаблоне с помощью `|` («или»):372373```python374case 401 | 403 | 404:375    return "Not allowed"376```377378##### Поведение без универсального шаблона379380Если изменить предыдущий пример, удалив последний блок case, пример станет таким:381382```python383def http_error(status):384    match status:385        case 400:386            return "Bad request"387        case 404:388            return "Not found"389        case 418:390            return "I'm a teapot"391```392393Без использования `_` в операторе case совпадения может не быть. Если совпадения нет, поведение – пустая операция (no-op). Например, если передано `status` со значением 500, ничего не происходит.394395#### Шаблоны с литералом и переменной396397Шаблоны могут выглядеть как распаковка в присваивании, и шаблон может использоваться для связывания переменных. В этом примере точка данных может быть распакована на её x-координату и y-координату:398399```python400# point – это кортеж (x, y)401match point:402    case (0, 0):403        print("Origin")404    case (0, y):405        print(f"Y={y}")406    case (x, 0):407        print(f"X={x}")408    case (x, y):409        print(f"X={x}, Y={y}")410    case _:411        raise ValueError("Not a point")412```413414Первый шаблон содержит два литерала, `(0, 0)`, и может рассматриваться как расширение шаблона-литерала, показанного выше. Следующие два шаблона объединяют литерал и переменную, и переменная *связывает* значение из проверяемого выражения (`point`). Четвёртый шаблон захватывает два значения, что делает его концептуально похожим на распаковывающее присваивание `(x, y) = point`.415416#### Шаблоны и классы417418Если для структурирования данных используются классы, в качестве шаблона можно использовать имя класса, за которым следует список аргументов, напоминающий конструктор. Этот шаблон позволяет захватывать атрибуты класса в переменные:419420```python421class Point:422    x: int423    y: int424425def location(point):426    match point:427        case Point(x=0, y=0):428            print("Origin is the point's location.")429        case Point(x=0, y=y):430            print(f"Y={y} and the point is on the y-axis.")431        case Point(x=x, y=0):432            print(f"X={x} and the point is on the x-axis.")433        case Point():434            print("The point is located somewhere else on the plane.")435        case _:436            print("Not a point")437```438439##### Шаблоны с позиционными параметрами440441Вы можете использовать позиционные параметры с некоторыми встроенными классами, которые предоставляют упорядочивание для своих атрибутов (например, dataclasses). Вы также можете определить конкретную позицию для атрибутов в шаблонах, задав специальный атрибут `__match_args__` в своих классах. Если он установлен в (“x”, “y”), следующие шаблоны все эквивалентны (и все связывают атрибут `y` с переменной `var`):442443```python444Point(1, var)445Point(1, y=var)446Point(x=1, y=var)447Point(y=var, x=1)448```449450#### Вложенные шаблоны451452Шаблоны могут быть произвольно вложенными. Например, если наши данные – короткий список точек, их можно сопоставить следующим образом:453454```python455match points:456    case []:457        print("No points in the list.")458    case [Point(0, 0)]:459        print("The origin is the only point in the list.")460    case [Point(x, y)]:461        print(f"A single point {x}, {y} is in the list.")462    case [Point(0, y1), Point(0, y2)]:463        print(f"Two points on the Y axis at {y1}, {y2} are in the list.")464    case _:465        print("Something else is found in the list.")466```467468#### Сложные шаблоны и универсальный шаблон469470До этого момента в примерах использовался `_` отдельно в последнем операторе case. Универсальный шаблон можно использовать в более сложных шаблонах, например `('error', code, _)`. Например:471472```python473match test_variable:474    case ('warning', code, 40):475        print("A warning has been received.")476    case ('error', code, _):477        print(f"An error {code} occurred.")478```479480В приведённом выше случае `test_variable` будет соответствовать (‘error’, code, 100) и (‘error’, code, 800).481482#### Ограничитель483484К шаблону можно добавить предложение `if`, известное как «страж». Если страж ложен, `match` переходит к следующему блоку case. Обратите внимание, что захват значения происходит до вычисления стража:485486```python487match point:488    case Point(x, y) if x == y:489        print(f"The point is located on the diagonal Y=X at {x}.")490    case Point(x, y):491        print(f"Point is not on the diagonal.")492```493494#### Другие ключевые особенности495496Несколько других важных возможностей:497498- Как и при распаковке присваиваний, шаблоны кортежей и списков имеют одинаковый смысл и по сути сопоставляются с произвольными последовательностями. Технически субъект должен быть последовательностью. Поэтому важное исключение: шаблоны не сопоставляются с итераторами. Кроме того, чтобы избежать распространённой ошибки, шаблоны последовательностей не сопоставляются со строками.499- Шаблоны последовательностей поддерживают подстановочные знаки: `[x, y, *rest]` и `(x, y, *rest)` работают аналогично подстановочным знакам при распаковке присваиваний. Имя после `*` также может быть `_`, поэтому `(x, y, *_)` сопоставляется с последовательностью из не менее двух элементов без привязки остальных элементов.500- Шаблоны отображений: `{"bandwidth": b, "latency": l}` захватывает значения `"bandwidth"` и `"latency"` из словаря. В отличие от шаблонов последовательностей, лишние ключи игнорируются. Также поддерживается подстановочный знак `**rest`. (Но `**_` был бы избыточным, поэтому не допускается.)501- Подшаблоны могут быть захвачены с помощью ключевого слова `as`:502503  ```python504  case (Point(x1, y1), Point(x2, y2) as p2): ...505  ```506507  Это связывает x1, y1, x2, y2, как и ожидалось, без пункта `as`, а p2 – со всем вторым элементом субъекта.508- Большинство литералов сравниваются по равенству. Однако синглтоны `True`, `False` и `None` сравниваются по идентичности.509- Именованные константы можно использовать в шаблонах. Они должны быть точечными именами, чтобы константа не интерпретировалась как переменная захвата:510511  ```python512  from enum import Enum513  class Color(Enum):514      RED = 0515      GREEN = 1516      BLUE = 2517518  match color:519      case Color.RED:520          print("I see red!")521      case Color.GREEN:522          print("Grass is green")523      case Color.BLUE:524          print("I'm feeling the blues :(")525  ```526527Полную спецификацию см. в [**PEP 634**](https://python-all.ru/3.11/whatsnew/3.10.html). Мотивация и обоснование находятся в [**PEP 635**](https://python-all.ru/3.11/whatsnew/3.10.html), а более подробное руководство – в [**PEP 636**](https://python-all.ru/3.11/whatsnew/3.10.html).528529### Опциональные `EncodingWarning` и `encoding="locale"` параметры530531Кодировка по умолчанию для `TextIOWrapper` и [`open()`](https://python-all.ru/3.11/library/functions.html#open) зависит от платформы и локали. Поскольку UTF-8 используется на большинстве платформ Unix, опускание параметра `encoding` при открытии файлов в UTF-8 (например, JSON, YAML, TOML, Markdown) является очень распространённой ошибкой. Например:532533```python534# ОШИБКА: следует использовать режим "rb" или encoding="utf-8".535with open("data.json") as f:536    data = json.load(f)537```538539Для обнаружения такой ошибки добавлен опциональный `EncodingWarning`. Он выдаётся, когда [`sys.flags.warn_default_encoding`](https://python-all.ru/3.11/library/sys.html#sys.flags) истинно и используется кодировка по умолчанию, зависящая от локали.540541Параметр `-X warn_default_encoding` и [`PYTHONWARNDEFAULTENCODING`](https://python-all.ru/3.11/using/cmdline.html#envvar-PYTHONWARNDEFAULTENCODING) добавлены для включения предупреждения.542543См. [Кодировка текста](https://python-all.ru/3.11/library/io.html#io-text-encoding) для получения дополнительной информации.544545## Новые возможности, связанные с аннотациями типов546547Этот раздел охватывает основные изменения, затрагивающие [**PEP 484**](https://python-all.ru/3.11/whatsnew/3.10.html) подсказки типов и модуль [`typing`](https://python-all.ru/3.11/library/typing.html#module-typing).548549### PEP 604: Новый оператор объединения типов550551Был введён новый оператор объединения типов, который позволяет использовать синтаксис `X | Y`. Это даёт более чистый способ выразить «тип X или тип Y» вместо использования [`typing.Union`](https://python-all.ru/3.11/library/typing.html#typing.Union), особенно в аннотациях типов.552553В предыдущих версиях Python для аннотации типов функций, принимающих аргументы нескольких типов, использовался [`typing.Union`](https://python-all.ru/3.11/library/typing.html#typing.Union):554555```python556def square(number: Union[int, float]) -> Union[int, float]:557    return number ** 2558```559560Теперь аннотации типов можно писать более кратко:561562```python563def square(number: int | float) -> int | float:564    return number ** 2565```566567Этот новый синтаксис также принимается в качестве второго аргумента для [`isinstance()`](https://python-all.ru/3.11/library/functions.html#isinstance) и [`issubclass()`](https://python-all.ru/3.11/library/functions.html#issubclass):568569```python570>>> isinstance(1, int | str)571True572```573574См. [Union Type](https://python-all.ru/3.11/library/stdtypes.html#types-union) и [**PEP 604**](https://python-all.ru/3.11/whatsnew/3.10.html) для получения дополнительной информации.575576(Авторы: Maggie Moss и Philippe Prados в [bpo-41428](https://python-all.ru/3.11/whatsnew/3.10.html), с дополнениями от Yurii Karabas и Serhiy Storchaka в [bpo-44490](https://python-all.ru/3.11/whatsnew/3.10.html).)577578### PEP 612: Переменные спецификации параметров579580В модуль [`typing`](https://python-all.ru/3.11/library/typing.html#module-typing) добавлены два новых параметра, улучшающих информацию, предоставляемую статическим анализаторам типов для [**PEP 484**](https://python-all.ru/3.11/whatsnew/3.10.html)'s `Callable`.581582Первая – это переменная спецификации параметров. Она используется для передачи типов параметров одного вызываемого объекта другому – шаблон, часто встречающийся в функциях высшего порядка и декораторах. Примеры использования можно найти в [`typing.ParamSpec`](https://python-all.ru/3.11/library/typing.html#typing.ParamSpec). Ранее не было простого способа аннотировать зависимость типов параметров с такой точностью.583584Второй вариант – новый оператор `Concatenate`. Он используется вместе с переменными спецификации параметров для аннотации типов вызываемого объекта высшего порядка, который добавляет или удаляет параметры другого вызываемого объекта. Примеры использования можно найти в [`typing.Concatenate`](https://python-all.ru/3.11/library/typing.html#typing.Concatenate).585586См. [`typing.Callable`](https://python-all.ru/3.11/library/typing.html#typing.Callable), [`typing.ParamSpec`](https://python-all.ru/3.11/library/typing.html#typing.ParamSpec), [`typing.Concatenate`](https://python-all.ru/3.11/library/typing.html#typing.Concatenate), [`typing.ParamSpecArgs`](https://python-all.ru/3.11/library/typing.html#typing.ParamSpecArgs), [`typing.ParamSpecKwargs`](https://python-all.ru/3.11/library/typing.html#typing.ParamSpecKwargs) и [**PEP 612**](https://python-all.ru/3.11/whatsnew/3.10.html) для получения дополнительной информации.587588(Автор: Ken Jin в [bpo-41559](https://python-all.ru/3.11/whatsnew/3.10.html), с небольшими улучшениями от Jelle Zijlstra в [bpo-43783](https://python-all.ru/3.11/whatsnew/3.10.html). PEP написан Mark Mendoza.)589590### PEP 613: TypeAlias591592[**PEP 484**](https://python-all.ru/3.11/whatsnew/3.10.html) ввёл понятие псевдонимов типов, требуя лишь, чтобы они были присваиваниями верхнего уровня без аннотаций. Эта простота иногда затрудняла для анализаторов типов различие между псевдонимами типов и обычными присваиваниями, особенно когда были задействованы опережающие ссылки или недопустимые типы. Сравните:593594```python595StrCache = 'Cache[str]'  # псевдоним типа596LOG_PREFIX = 'LOG[DEBUG]'  # константа модуля597```598599Теперь в модуле [`typing`](https://python-all.ru/3.11/library/typing.html#module-typing) есть специальное значение `TypeAlias`, которое позволяет объявлять псевдонимы типов более явно:600601```python602StrCache: TypeAlias = 'Cache[str]'  # псевдоним типа603LOG_PREFIX = 'LOG[DEBUG]'  # константа модуля604```605606См. [**PEP 613**](https://python-all.ru/3.11/whatsnew/3.10.html) для получения дополнительных сведений.607608(Автор: Mikhail Golubev в [bpo-41923](https://python-all.ru/3.11/whatsnew/3.10.html).)609610### PEP 647: Определяемые пользователем стражники типов611612`TypeGuard` добавлен в модуль [`typing`](https://python-all.ru/3.11/library/typing.html#module-typing) для аннотирования функций-ограничителей типа и улучшения информации, предоставляемой статическим проверяльщикам типов при сужении типа. Дополнительную информацию см. в документации `TypeGuard` и [**PEP 647**](https://python-all.ru/3.11/whatsnew/3.10.html).613614(Авторы: Ken Jin и Guido van Rossum в [bpo-43766](https://python-all.ru/3.11/whatsnew/3.10.html). Автор PEP: Eric Traut.)615616## Прочие изменения языка617618- Тип [`int`](https://python-all.ru/3.11/library/functions.html#int) получил новый метод [`int.bit_count()`](https://python-all.ru/3.11/library/stdtypes.html#int.bit_count), который возвращает количество единиц в двоичном представлении целого числа, также известное как число единиц (population count). (Автор: Niklas Fiekas в [bpo-29882](https://python-all.ru/3.11/whatsnew/3.10.html).)619- Представления, возвращаемые [`dict.keys()`](https://python-all.ru/3.11/library/stdtypes.html#dict.keys), [`dict.values()`](https://python-all.ru/3.11/library/stdtypes.html#dict.values) и [`dict.items()`](https://python-all.ru/3.11/library/stdtypes.html#dict.items), теперь все имеют атрибут `mapping`, предоставляющий объект [`types.MappingProxyType`](https://python-all.ru/3.11/library/types.html#types.MappingProxyType), оборачивающий исходный словарь. (Автор: Dennis Sweeney в [bpo-40890](https://python-all.ru/3.11/whatsnew/3.10.html).)620- [**PEP 618**](https://python-all.ru/3.11/whatsnew/3.10.html): функция [`zip()`](https://python-all.ru/3.11/library/functions.html#zip) теперь имеет необязательный флаг `strict`, используемый для требования, чтобы все итерируемые объекты имели одинаковую длину.621- Встроенные функции и функции расширений, принимающие целочисленные аргументы, больше не принимают [`Decimal`](https://python-all.ru/3.11/library/decimal.html#decimal.Decimal), [`Fraction`](https://python-all.ru/3.11/library/fractions.html#fractions.Fraction) и другие объекты, которые могут быть преобразованы в целые числа только с потерей (например, имеющие метод [`__int__()`](https://python-all.ru/3.11/reference/datamodel.html#object.__int__), но не имеющие метода [`__index__()`](https://python-all.ru/3.11/reference/datamodel.html#object.__index__)). (Автор: Serhiy Storchaka в [bpo-37999](https://python-all.ru/3.11/whatsnew/3.10.html).)622- Если [`object.__ipow__()`](https://python-all.ru/3.11/reference/datamodel.html#object.__ipow__) возвращает [`NotImplemented`](https://python-all.ru/3.11/library/constants.html#NotImplemented), оператор будет корректно возвращаться к [`object.__pow__()`](https://python-all.ru/3.11/reference/datamodel.html#object.__pow__) и [`object.__rpow__()`](https://python-all.ru/3.11/reference/datamodel.html#object.__rpow__), как и ожидается. (Автор: Alex Shkop в [bpo-38302](https://python-all.ru/3.11/whatsnew/3.10.html).)623- Присваивающие выражения теперь можно использовать без скобок внутри литералов множеств и включений множеств, а также в индексах последовательностей (но не в срезах).624- Функции получили новый атрибут `__builtins__`, который используется для поиска встроенных символов при выполнении функции, вместо поиска в `__globals__['__builtins__']`. Атрибут инициализируется из `__globals__["__builtins__"]`, если он существует, иначе из текущих встроенных объектов. (Автор: Mark Shannon в [bpo-42990](https://python-all.ru/3.11/whatsnew/3.10.html).)625- Две новые встроенные функции – [`aiter()`](https://python-all.ru/3.11/library/functions.html#aiter) и [`anext()`](https://python-all.ru/3.11/library/functions.html#anext) были добавлены для предоставления асинхронных аналогов [`iter()`](https://python-all.ru/3.11/library/functions.html#iter) и [`next()`](https://python-all.ru/3.11/library/functions.html#next) соответственно. (Авторы: Joshua Bronson, Daniel Pope и Justin Wang в [bpo-31861](https://python-all.ru/3.11/whatsnew/3.10.html).)626- Статические методы ([`@staticmethod`](https://python-all.ru/3.11/library/functions.html#staticmethod)) и методы классов ([`@classmethod`](https://python-all.ru/3.11/library/functions.html#classmethod)) теперь наследуют атрибуты методов (`__module__`, `__name__`, `__qualname__`, `__doc__`, `__annotations__`) и имеют новый атрибут `__wrapped__`. Более того, статические методы теперь можно вызывать как обычные функции. (Автор: Victor Stinner в [bpo-43682](https://python-all.ru/3.11/whatsnew/3.10.html).)627- Аннотации для сложных целей (всё, кроме целей `simple name`, заданных [**PEP 526**](https://python-all.ru/3.11/whatsnew/3.10.html)) больше не вызывают никаких эффектов во время выполнения при `from __future__ import annotations`. (Автор: Batuhan Taskaya в [bpo-42737](https://python-all.ru/3.11/whatsnew/3.10.html).)628- Объекты классов и модулей теперь лениво создают пустые словари аннотаций по требованию. Словари аннотаций хранятся в `__dict__` объекта для обратной совместимости. Это улучшает лучшие практики работы с `__annotations__`; для получения дополнительной информации см. [Annotations Best Practices](https://python-all.ru/3.11/howto/annotations.html#annotations-howto). (Автор: Larry Hastings в [bpo-43901](https://python-all.ru/3.11/whatsnew/3.10.html).)629- Аннотации, состоящие из `yield`, `yield from`, `await` или именованных выражений, теперь запрещены при `from __future__ import annotations` из-за их побочных эффектов. (Автор: Batuhan Taskaya в [bpo-42725](https://python-all.ru/3.11/whatsnew/3.10.html).)630- Использование несвязанных переменных, `super()` и других выражений, которые могут изменить обработку таблицы символов в качестве аннотаций, теперь не имеет эффекта при `from __future__ import annotations`. (Автор: Batuhan Taskaya в [bpo-42725](https://python-all.ru/3.11/whatsnew/3.10.html).)631- Хеши значений NaN как типа [`float`](https://python-all.ru/3.11/library/functions.html#float), так и типа [`decimal.Decimal`](https://python-all.ru/3.11/library/decimal.html#decimal.Decimal) теперь зависят от идентичности объекта. Раньше они всегда хешировались в `0`, несмотря на то что значения NaN не равны друг другу. Это приводило к потенциально квадратичному поведению во время выполнения из-за чрезмерных коллизий хешей при создании словарей и множеств, содержащих несколько NaN. (Автор: Raymond Hettinger в [bpo-43475](https://python-all.ru/3.11/whatsnew/3.10.html).)632- При удалении константы [`__debug__`](https://python-all.ru/3.11/library/constants.html#debug__) будет возбуждено [`SyntaxError`](https://python-all.ru/3.11/library/exceptions.html#SyntaxError) (вместо [`NameError`](https://python-all.ru/3.11/library/exceptions.html#NameError)). (Автор: Donghee Na в [bpo-45000](https://python-all.ru/3.11/whatsnew/3.10.html).)633- Исключения [`SyntaxError`](https://python-all.ru/3.11/library/exceptions.html#SyntaxError) теперь имеют атрибуты `end_lineno` и `end_offset`. Они будут равны `None`, если не определены. (Автор: Pablo Galindo в [bpo-43914](https://python-all.ru/3.11/whatsnew/3.10.html).)634635## Новые модули636637- Нет.638639## Улучшенные модули640641### asyncio642643Добавлен отсутствующий метод `connect_accepted_socket()`. (Автор: Alex Grönholm в [bpo-41332](https://python-all.ru/3.11/whatsnew/3.10.html).)644645### argparse646647Вводящая в заблуждение фраза «optional arguments» была заменена на «options» в справке argparse. Некоторым тестам может потребоваться адаптация, если они полагаются на точное совпадение вывода. (Автор: Raymond Hettinger в [bpo-9694](https://python-all.ru/3.11/whatsnew/3.10.html).)648649### array650651Метод [`index()`](https://python-all.ru/3.11/library/array.html#array.array.index) у [`array.array`](https://python-all.ru/3.11/library/array.html#array.array) теперь имеет необязательные параметры *start* и *stop*. (Авторы: Anders Lorentsen и Zackery Spytz в [bpo-31956](https://python-all.ru/3.11/whatsnew/3.10.html).)652653### asynchat, asyncore, smtpd654655Эти модули были отмечены как устаревшие в своей документации, начиная с Python 3.6. Теперь во все три модуля добавлено [`DeprecationWarning`](https://python-all.ru/3.11/library/exceptions.html#DeprecationWarning) во время импорта.656657### base64658659Добавлены [`base64.b32hexencode()`](https://python-all.ru/3.11/library/base64.html#base64.b32hexencode) и [`base64.b32hexdecode()`](https://python-all.ru/3.11/library/base64.html#base64.b32hexdecode) для поддержки кодирования Base32 с расширенным шестнадцатеричным алфавитом.660661### bdb662663Добавлена `clearBreakpoints()` для сброса всех установленных точек останова. (Предложено Ирит Катриэлем в [bpo-24160](https://python-all.ru/3.11/whatsnew/3.10.html).)664665### bisect666667Добавлена возможность указания функции *key* в API модуля [`bisect`](https://python-all.ru/3.11/library/bisect.html#module-bisect). (Предложено Рэймондом Хеттингером в [bpo-4356](https://python-all.ru/3.11/whatsnew/3.10.html).)668669### codecs670671Добавлена функция [`codecs.unregister()`](https://python-all.ru/3.11/library/codecs.html#codecs.unregister) для отмены регистрации функции поиска кодеков. (Предложено Хай Ши в [bpo-41842](https://python-all.ru/3.11/whatsnew/3.10.html).)672673### collections.abc674675`__args__` у [параметризованных обобщённых типов](https://python-all.ru/3.11/library/stdtypes.html#types-genericalias) для [`collections.abc.Callable`](https://python-all.ru/3.11/library/collections.abc.html#collections.abc.Callable) теперь согласованы с [`typing.Callable`](https://python-all.ru/3.11/library/typing.html#typing.Callable). [`collections.abc.Callable`](https://python-all.ru/3.11/library/collections.abc.html#collections.abc.Callable) обобщённый тип теперь упрощает параметры типа, аналогично tому, что делает [`typing.Callable`](https://python-all.ru/3.11/library/typing.html#typing.Callable). Это означает, что `collections.abc.Callable[[int, str], str]` будет иметь `__args__` от `(int, str, str)`; ранее это было `([int, str], str)`. Чтобы обеспечить это изменение, [`types.GenericAlias`](https://python-all.ru/3.11/library/types.html#types.GenericAlias) теперь может быть подклассом, и при индексировании типа [`collections.abc.Callable`](https://python-all.ru/3.11/library/collections.abc.html#collections.abc.Callable) будет возвращаться подкласс. Обратите внимание, что может возникать [`TypeError`](https://python-all.ru/3.11/library/exceptions.html#TypeError) для некорректных форм параметризации [`collections.abc.Callable`](https://python-all.ru/3.11/library/collections.abc.html#collections.abc.Callable), которые в Python 3.9 могли проходить молча. (Предложено Кеном Джином в [bpo-42195](https://python-all.ru/3.11/whatsnew/3.10.html).)676677### contextlib678679Добавлен менеджер контекста [`contextlib.aclosing()`](https://python-all.ru/3.11/library/contextlib.html#contextlib.aclosing) для безопасного закрытия асинхронных генераторов и объектов, представляющих асинхронно освобождаемые ресурсы. (Предложено Джунги Кимом и Джоном Бельмонте в [bpo-41229](https://python-all.ru/3.11/whatsnew/3.10.html).)680681Добавлена поддержка асинхронного менеджера контекста для [`contextlib.nullcontext()`](https://python-all.ru/3.11/library/contextlib.html#contextlib.nullcontext). (Предложено Томом Грингаузом в [bpo-41543](https://python-all.ru/3.11/whatsnew/3.10.html).)682683Добавлен `AsyncContextDecorator` для поддержки использования асинхронных контекстных менеджеров в качестве декораторов.684685### curses686687Расширенные функции цвета, добавленные в ncurses 6.1, будут прозрачно использоваться [`curses.color_content()`](https://python-all.ru/3.11/library/curses.html#curses.color_content), [`curses.init_color()`](https://python-all.ru/3.11/library/curses.html#curses.init_color), [`curses.init_pair()`](https://python-all.ru/3.11/library/curses.html#curses.init_pair) и [`curses.pair_content()`](https://python-all.ru/3.11/library/curses.html#curses.pair_content). Новая функция [`curses.has_extended_color_support()`](https://python-all.ru/3.11/library/curses.html#curses.has_extended_color_support) указывает, поддерживаются ли расширенные цвета базовой библиотекой ncurses. (Предложено Джеффри Кинчером и Хансом Петтером Янссоном в [bpo-36982](https://python-all.ru/3.11/whatsnew/3.10.html).)688689Константы `BUTTON5_*` теперь доступны в модуле [`curses`](https://python-all.ru/3.11/library/curses.html#module-curses), если они предоставляются базовой библиотекой curses. (Предложено Закери Спайтцем в [bpo-39273](https://python-all.ru/3.11/whatsnew/3.10.html).)690691### dataclasses692693#### \_\_slots\_\_694695Добавлен параметр `slots` в декоратор [`dataclasses.dataclass()`](https://python-all.ru/3.11/library/dataclasses.html#dataclasses.dataclass). (Предложено Юрием Карабасом в [bpo-42269](https://python-all.ru/3.11/whatsnew/3.10.html))696697#### Поля только по ключу698699dataclasses теперь поддерживает поля, которые являются только по ключу в сгенерированном методе \_\_init\_\_. Существует несколько способов указания таких полей.700701Можно указать, что все поля являются только по ключу:702703```python704from dataclasses import dataclass705706@dataclass(kw_only=True)707class Birthday:708    name: str709    birthday: datetime.date710```711712Оба параметра `name` и `birthday` являются только по ключу в сгенерированном методе \_\_init\_\_.713714Можно указать «только по ключу» для каждого поля отдельно:715716```python717from dataclasses import dataclass, field718719@dataclass720class Birthday:721    name: str722    birthday: datetime.date = field(kw_only=True)723```724725Здесь только `birthday` является только по ключу. Если установить `kw_only` для отдельных полей, следует учитывать, что существуют правила переупорядочивания полей: поля только по ключу должны следовать после полей не только по ключу. Подробнее см. в полной документации dataclasses.726727Также можно указать, что все поля, следующие за маркером KW\_ONLY, являются только по ключу. Вероятно, это будет наиболее распространённый способ использования:728729```python730from dataclasses import dataclass, KW_ONLY731732@dataclass733class Point:734    x: float735    y: float736    _: KW_ONLY737    z: float = 0.0738    t: float = 0.0739```740741Здесь `z` и `t` являются параметрами только по ключу, а `x` и `y` – нет. (Предложено Эриком В. Смитом в [bpo-43532](https://python-all.ru/3.11/whatsnew/3.10.html).)742743### distutils744745Весь пакет `distutils` является устаревшим и будет удалён в Python 3.12. Его функциональность для указания сборки пакетов уже полностью заменена сторонними пакетами `setuptools` и `packaging`, а большинство других часто используемых API доступны в других местах стандартной библиотеки (например, [`platform`](https://python-all.ru/3.11/library/platform.html#module-platform), [`shutil`](https://python-all.ru/3.11/library/shutil.html#module-shutil), [`subprocess`](https://python-all.ru/3.11/library/subprocess.html#module-subprocess) или [`sysconfig`](https://python-all.ru/3.11/library/sysconfig.html#module-sysconfig)). Планов по переносу какой-либо другой функциональности из `distutils` нет, и приложения, использующие другие функции, должны рассмотреть создание частных копий кода. Обратитесь к [**PEP 632**](https://python-all.ru/3.11/whatsnew/3.10.html) для обсуждения.746747Команда `bdist_wininst`, устаревшая в Python 3.8, была удалена. Теперь для распространения двоичных пакетов в Windows рекомендуется использовать команду `bdist_wheel`. (Предложено Виктором Стиннером в [bpo-42802](https://python-all.ru/3.11/whatsnew/3.10.html).)748749### doctest750751Если модуль не определяет `__loader__`, используется `__spec__.loader`. (Автор: Brett Cannon в [bpo-42133](https://python-all.ru/3.11/whatsnew/3.10.html).)752753### encodings754755`encodings.normalize_encoding()` теперь игнорирует не-ASCII символы. (Добавлено Хай Ши в [bpo-39337](https://python-all.ru/3.11/whatsnew/3.10.html).)756757### enum758759`Enum` `__repr__()` теперь возвращает `enum_name.member_name`, а `__str__()` теперь возвращает `member_name`. Перечисления стандартной библиотеки, доступные как константы модуля, имеют [`repr()`](https://python-all.ru/3.11/library/functions.html#repr), равный `module_name.member_name`. (Добавлено Итаном Фурманом в [bpo-40066](https://python-all.ru/3.11/whatsnew/3.10.html).)760761Добавлен [`enum.StrEnum`](https://python-all.ru/3.11/library/enum.html#enum.StrEnum) для перечислений, все члены которых являются строками. (Добавлено Итаном Фурманом в [bpo-41816](https://python-all.ru/3.11/whatsnew/3.10.html).)762763### fileinput764765Добавлены параметры *encoding* и *errors* в [`fileinput.input()`](https://python-all.ru/3.11/library/fileinput.html#fileinput.input) и [`fileinput.FileInput`](https://python-all.ru/3.11/library/fileinput.html#fileinput.FileInput). (Добавлено Инадой Наоки в [bpo-43712](https://python-all.ru/3.11/whatsnew/3.10.html).)766767[`fileinput.hook_compressed()`](https://python-all.ru/3.11/library/fileinput.html#fileinput.hook_compressed) теперь возвращает объект `TextIOWrapper`, когда *mode* равен «r», а файл сжат, как и несжатые файлы. (Добавлено Инадой Наоки в [bpo-5758](https://python-all.ru/3.11/whatsnew/3.10.html).)768769### faulthandler770771Модуль [`faulthandler`](https://python-all.ru/3.11/library/faulthandler.html#module-faulthandler) теперь обнаруживает, произошла ли фатальная ошибка во время сборки мусора. (Добавлено Виктором Стиннером в [bpo-44466](https://python-all.ru/3.11/whatsnew/3.10.html).)772773### gc774775Добавлены аудит-хуки для [`gc.get_objects()`](https://python-all.ru/3.11/library/gc.html#gc.get_objects), [`gc.get_referrers()`](https://python-all.ru/3.11/library/gc.html#gc.get_referrers) и [`gc.get_referents()`](https://python-all.ru/3.11/library/gc.html#gc.get_referents). (Добавлено Пабло Галиндо в [bpo-43439](https://python-all.ru/3.11/whatsnew/3.10.html).)776777### glob778779Добавлены параметры *root\_dir* и *dir\_fd* в [`glob()`](https://python-all.ru/3.11/library/glob.html#glob.glob) и [`iglob()`](https://python-all.ru/3.11/library/glob.html#glob.iglob), которые позволяют указать корневой каталог для поиска. (Добавлено Сергеем Сторчакой в [bpo-38144](https://python-all.ru/3.11/whatsnew/3.10.html).)780781### hashlib782783Модуль hashlib требует OpenSSL 1.1.1 или новее. (Добавлено Кристианом Хаймсом в [**PEP 644**](https://python-all.ru/3.11/whatsnew/3.10.html) и [bpo-43669](https://python-all.ru/3.11/whatsnew/3.10.html).)784785Модуль hashlib имеет предварительную поддержку OpenSSL 3.0.0. (Добавлено Кристианом Хаймсом в [bpo-38820](https://python-all.ru/3.11/whatsnew/3.10.html) и других тикетах.)786787Чистая реализация на Python [`pbkdf2_hmac()`](https://python-all.ru/3.11/library/hashlib.html#hashlib.pbkdf2_hmac) объявлена устаревшей. В будущем PBKDF2-HMAC будет доступен только при сборке Python с поддержкой OpenSSL. (Добавлено Кристианом Хаймсом в [bpo-43880](https://python-all.ru/3.11/whatsnew/3.10.html).)788789### hmac790791Модуль hmac теперь использует реализацию HMAC от OpenSSL внутри. (Добавлено Кристианом Хаймсом в [bpo-40645](https://python-all.ru/3.11/whatsnew/3.10.html).)792793### IDLE и idlelib794795IDLE теперь вызывает [`sys.excepthook()`](https://python-all.ru/3.11/library/sys.html#sys.excepthook) (при запуске без «-n»). Ранее пользовательские хуки игнорировались. (Добавлено Кеном Хилтоном в [bpo-43008](https://python-all.ru/3.11/whatsnew/3.10.html).)796797Переработан диалог настроек. Вкладка General разделена на вкладки Windows и Shell/Ed. Источники справки, расширяющие меню Help, перемещены на вкладку Extensions. Освобождено место для новых опций и сокращён диалог. Последнее улучшает отображение диалога на маленьких экранах. (Добавлено Терри Джан Риди в [bpo-40468](https://python-all.ru/3.11/whatsnew/3.10.html).) Настройка отступа (indent space) перенесена с вкладки Font на новую вкладку Windows. (Добавлено Марком Роземаном и Терри Джан Риди в [bpo-33962](https://python-all.ru/3.11/whatsnew/3.10.html).)798799Эти изменения были перенесены в поддерживаемый выпуск 3.9.800801Добавлена боковая панель Shell. Основное приглашение («\>\>\>») перемещено на боковую панель. Вторичные приглашения («…») добавлены на боковую панель. Щелчок левой кнопкой мыши и перетаскивание (опционально) выделяют одну или несколько строк текста, как в боковой панели с номерами строк редактора. Щелчок правой кнопкой после выделения строк текста отображает контекстное меню с пунктом «copy with prompts». Это объединяет приглашения с боковой панели со строками выделенного текста. Этот пункт также появляется в контекстном меню текста. (Добавлено Талем Эйнатом в [bpo-37903](https://python-all.ru/3.11/whatsnew/3.10.html).)802803Используются пробелы вместо табуляции для отступа интерактивного кода. Это делает ввод интерактивного кода «выглядящим правильно». Возможность этого была основной мотивацией для добавления боковой панели Shell. (Добавлено Терри Джан Риди в [bpo-37892](https://python-all.ru/3.11/whatsnew/3.10.html).)804805Подсвечиваются новые [мягкие ключевые слова](https://python-all.ru/3.11/reference/lexical_analysis.html#soft-keywords) [`match`](https://python-all.ru/3.11/reference/compound_stmts.html#match), [`case`](https://python-all.ru/3.11/reference/compound_stmts.html#match) и [`_`](https://python-all.ru/3.11/reference/compound_stmts.html#wildcard-patterns) в операторах сопоставления с образцом. Однако эта подсветка не идеальна и может быть некорректной в некоторых редких случаях, включая некоторые `_` в образцах `case`. (Добавлено Талем Эйнатом в [bpo-44010](https://python-all.ru/3.11/whatsnew/3.10.html).)806807Новое в поддерживаемых выпусках 3.10.808809Применять подсветку синтаксиса для файлов `.pyi`. (Авторы: Alex Waygood и Terry Jan Reedy, [bpo-45447](https://python-all.ru/3.11/whatsnew/3.10.html).)810811Включение приглашений при сохранении содержимого Shell с вводом и выводом. (Автор: Terry Jan Reedy, [gh-95191](https://python-all.ru/3.11/whatsnew/3.10.html).)812813### importlib.metadata814815Функциональная совместимость с `importlib_metadata` 4.6 ([история](https://python-all.ru/3.11/whatsnew/3.10.html)).816817[importlib.metadata entry points](https://python-all.ru/3.11/library/importlib.metadata.html#entry-points) теперь предоставляют более удобную возможность выбора точек входа по группе и имени с помощью нового `importlib.metadata.EntryPoints` класса. См. примечание о совместимости в документации для получения дополнительной информации об устаревании и использовании.818819Добавлен `importlib.metadata.packages_distributions()` для преобразования модулей и пакетов Python верхнего уровня в их `importlib.metadata.Distribution`.820821### inspect822823Если модуль не определяет `__loader__`, используется `__spec__.loader`. (Автор: Brett Cannon в [bpo-42133](https://python-all.ru/3.11/whatsnew/3.10.html).)824825Добавлен [`inspect.get_annotations()`](https://python-all.ru/3.11/library/inspect.html#inspect.get_annotations), который безопасно вычисляет аннотации, определённые для объекта. Он обходит особенности доступа к аннотациям для различных типов объектов и делает очень мало предположений об объекте, который исследует. [`inspect.get_annotations()`](https://python-all.ru/3.11/library/inspect.html#inspect.get_annotations) также может корректно преобразовывать строковые аннотации обратно в объекты. [`inspect.get_annotations()`](https://python-all.ru/3.11/library/inspect.html#inspect.get_annotations) теперь считается лучшей практикой для доступа к словарю аннотаций, определённому для любого объекта Python; дополнительную информацию о лучших практиках работы с аннотациями см. в [Лучшие практики для аннотаций](https://python-all.ru/3.11/howto/annotations.html#annotations-howto). Кроме того, [`inspect.signature()`](https://python-all.ru/3.11/library/inspect.html#inspect.signature), [`inspect.Signature.from_callable()`](https://python-all.ru/3.11/library/inspect.html#inspect.Signature.from_callable) и `inspect.Signature.from_function()` теперь вызывают [`inspect.get_annotations()`](https://python-all.ru/3.11/library/inspect.html#inspect.get_annotations) для получения аннотаций. Это означает, что [`inspect.signature()`](https://python-all.ru/3.11/library/inspect.html#inspect.signature) и [`inspect.Signature.from_callable()`](https://python-all.ru/3.11/library/inspect.html#inspect.Signature.from_callable) также теперь могут преобразовывать строковые аннотации обратно в объекты. (Автор: Larry Hastings в [bpo-43817](https://python-all.ru/3.11/whatsnew/3.10.html).)826827### itertools828829Добавлен [`itertools.pairwise()`](https://python-all.ru/3.11/library/itertools.html#itertools.pairwise). (Автор: Raymond Hettinger в [bpo-38200](https://python-all.ru/3.11/whatsnew/3.10.html).)830831### linecache832833Если модуль не определяет `__loader__`, используется `__spec__.loader`. (Автор: Brett Cannon в [bpo-42133](https://python-all.ru/3.11/whatsnew/3.10.html).)834835### os836837Добавлена поддержка [`os.cpu_count()`](https://python-all.ru/3.11/library/os.html#os.cpu_count) для VxWorks RTOS. (Автор: Peixing Xin в [bpo-41440](https://python-all.ru/3.11/whatsnew/3.10.html).)838839Добавлена новая функция [`os.eventfd()`](https://python-all.ru/3.11/library/os.html#os.eventfd) и вспомогательные функции для обёртки системного вызова `eventfd2` в Linux. (Автор: Christian Heimes в [bpo-41001](https://python-all.ru/3.11/whatsnew/3.10.html).)840841Добавлен [`os.splice()`](https://python-all.ru/3.11/library/os.html#os.splice), который позволяет перемещать данные между двумя файловыми дескрипторами без копирования между адресным пространством ядра и пользовательским адресным пространством, причём один из файловых дескрипторов должен ссылаться на канал. (Автор: Pablo Galindo в [bpo-41625](https://python-all.ru/3.11/whatsnew/3.10.html).)842843Добавлены [`O_EVTONLY`](https://python-all.ru/3.11/library/os.html#os.O_EVTONLY), [`O_FSYNC`](https://python-all.ru/3.11/library/os.html#os.O_FSYNC), [`O_SYMLINK`](https://python-all.ru/3.11/library/os.html#os.O_SYMLINK) и [`O_NOFOLLOW_ANY`](https://python-all.ru/3.11/library/os.html#os.O_NOFOLLOW_ANY) для macOS. (Автор: Donghee Na в [bpo-43106](https://python-all.ru/3.11/whatsnew/3.10.html).)844845### os.path846847[`os.path.realpath()`](https://python-all.ru/3.11/library/os.path.html#os.path.realpath) теперь принимает именованный аргумент *strict*. Если установлено значение `True`, [`OSError`](https://python-all.ru/3.11/library/exceptions.html#OSError) возбуждается, если путь не существует или обнаружен цикл символической ссылки. (Автор: Barney Gale в [bpo-43757](https://python-all.ru/3.11/whatsnew/3.10.html).)848849### pathlib850851Добавлена поддержка срезов для [`PurePath.parents`](https://python-all.ru/3.11/library/pathlib.html#pathlib.PurePath.parents). (Автор: Joshua Cannon в [bpo-35498](https://python-all.ru/3.11/whatsnew/3.10.html).)852853Добавлена поддержка отрицательной индексации для [`PurePath.parents`](https://python-all.ru/3.11/library/pathlib.html#pathlib.PurePath.parents). (Автор: Yaroslav Pankovych в [bpo-21041](https://python-all.ru/3.11/whatsnew/3.10.html).)854855Добавлен метод [`Path.hardlink_to`](https://python-all.ru/3.11/library/pathlib.html#pathlib.Path.hardlink_to), который заменяет [`link_to()`](https://python-all.ru/3.11/library/pathlib.html#pathlib.Path.link_to). Новый метод имеет тот же порядок аргументов, что и [`symlink_to()`](https://python-all.ru/3.11/library/pathlib.html#pathlib.Path.symlink_to). (Автор: Barney Gale в [bpo-39950](https://python-all.ru/3.11/whatsnew/3.10.html).)856857[`pathlib.Path.stat()`](https://python-all.ru/3.11/library/pathlib.html#pathlib.Path.stat) и [`chmod()`](https://python-all.ru/3.11/library/pathlib.html#pathlib.Path.chmod) теперь принимают именованный аргумент *follow\_symlinks* для согласованности с соответствующими функциями в модуле [`os`](https://python-all.ru/3.11/library/os.html#module-os). (Автор: Barney Gale в [bpo-39906](https://python-all.ru/3.11/whatsnew/3.10.html).)858859### platform860861Добавлен [`platform.freedesktop_os_release()`](https://python-all.ru/3.11/library/platform.html#platform.freedesktop_os_release) для получения идентификации операционной системы из стандартного файла [freedesktop.org os-release](https://python-all.ru/3.11/whatsnew/3.10.html). (Автор: Christian Heimes в [bpo-28468](https://python-all.ru/3.11/whatsnew/3.10.html).)862863### pprint864865[`pprint.pprint()`](https://python-all.ru/3.11/library/pprint.html#pprint.pprint) теперь принимает новый именованный аргумент `underscore_numbers`. (Автор: sblondon в [bpo-42914](https://python-all.ru/3.11/whatsnew/3.10.html).)866867[`pprint`](https://python-all.ru/3.11/library/pprint.html#module-pprint) теперь может красиво печатать экземпляры [`dataclasses.dataclass`](https://python-all.ru/3.11/library/dataclasses.html#dataclasses.dataclass). (Автор: Lewis Gaul в [bpo-43080](https://python-all.ru/3.11/whatsnew/3.10.html).)868869### py\_compile870871Добавлена опция `--quiet` в интерфейс командной строки [`py_compile`](https://python-all.ru/3.11/library/py_compile.html#module-py_compile). (Автор: Gregory Schevchenko в [bpo-38731](https://python-all.ru/3.11/whatsnew/3.10.html).)872873### pyclbr874875Добавлен атрибут `end_lineno` в объекты `Function` и `Class` в дереве, возвращаемом [`pyclbr.readmodule()`](https://python-all.ru/3.11/library/pyclbr.html#pyclbr.readmodule) и [`pyclbr.readmodule_ex()`](https://python-all.ru/3.11/library/pyclbr.html#pyclbr.readmodule_ex). Он соответствует существующему (начальному) `lineno`. (Автор: Aviral Srivastava в [bpo-38307](https://python-all.ru/3.11/whatsnew/3.10.html).)876877### shelve878879Модуль [`shelve`](https://python-all.ru/3.11/library/shelve.html#module-shelve) теперь по умолчанию использует [`pickle.DEFAULT_PROTOCOL`](https://python-all.ru/3.11/library/pickle.html#pickle.DEFAULT_PROTOCOL) вместо протокола [`pickle`](https://python-all.ru/3.11/library/pickle.html#module-pickle) `3` при создании shelves. (Автор: Zackery Spytz в [bpo-34204](https://python-all.ru/3.11/whatsnew/3.10.html).)880881### statistics882883Добавлены функции [`covariance()`](https://python-all.ru/3.11/library/statistics.html#statistics.covariance), [`correlation()`](https://python-all.ru/3.11/library/statistics.html#statistics.correlation) Пирсона и простая [`linear_regression()`](https://python-all.ru/3.11/library/statistics.html#statistics.linear_regression). (Автор: Tymoteusz Wołodźko в [bpo-38490](https://python-all.ru/3.11/whatsnew/3.10.html).)884885### site886887Если модуль не определяет `__loader__`, используется `__spec__.loader`. (Автор: Brett Cannon в [bpo-42133](https://python-all.ru/3.11/whatsnew/3.10.html).)888889### socket890891Исключение [`socket.timeout`](https://python-all.ru/3.11/library/socket.html#socket.timeout) теперь является псевдонимом [`TimeoutError`](https://python-all.ru/3.11/library/exceptions.html#TimeoutError). (Автор: Christian Heimes в [bpo-42413](https://python-all.ru/3.11/whatsnew/3.10.html).)892893Добавлена возможность создавать MPTCP-сокеты с `IPPROTO_MPTCP` (Автор: Rui Cunha в [bpo-43571](https://python-all.ru/3.11/whatsnew/3.10.html).)894895Добавлена опция `IP_RECVTOS` для получения поля Type of Service (ToS) или DSCP/ECN (Автор: Georg Sauthoff в [bpo-44077](https://python-all.ru/3.11/whatsnew/3.10.html).)896897### ssl898899Модуль ssl требует OpenSSL 1.1.1 или новее. (Автор: Christian Heimes в [**PEP 644**](https://python-all.ru/3.11/whatsnew/3.10.html) и [bpo-43669](https://python-all.ru/3.11/whatsnew/3.10.html).)900901Модуль ssl получил предварительную поддержку OpenSSL 3.0.0 и новую опцию [`OP_IGNORE_UNEXPECTED_EOF`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_IGNORE_UNEXPECTED_EOF). (Автор: Christian Heimes в [bpo-38820](https://python-all.ru/3.11/whatsnew/3.10.html), [bpo-43794](https://python-all.ru/3.11/whatsnew/3.10.html), [bpo-43788](https://python-all.ru/3.11/whatsnew/3.10.html), [bpo-43791](https://python-all.ru/3.11/whatsnew/3.10.html), [bpo-43799](https://python-all.ru/3.11/whatsnew/3.10.html), [bpo-43920](https://python-all.ru/3.11/whatsnew/3.10.html), [bpo-43789](https://python-all.ru/3.11/whatsnew/3.10.html) и [bpo-43811](https://python-all.ru/3.11/whatsnew/3.10.html).)902903Устаревшие функции и использование устаревших констант теперь приводят к [`DeprecationWarning`](https://python-all.ru/3.11/library/exceptions.html#DeprecationWarning). У [`ssl.SSLContext.options`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.options) по умолчанию установлены [`OP_NO_SSLv2`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_NO_SSLv2) и [`OP_NO_SSLv3`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_NO_SSLv3), поэтому он не может предупредить о повторной установке флага. В [разделе об устаревших возможностях](https://python-all.ru/3.11/whatsnew/3.10.html#whatsnew310-deprecated) приведён список устаревших функций. (Автор: Christian Heimes в [bpo-43880](https://python-all.ru/3.11/whatsnew/3.10.html).)904905Модуль ssl теперь использует более безопасные настройки по умолчанию. Шифры без прямой секретности (forward secrecy) или с MAC SHA-1 отключены по умолчанию. Уровень безопасности 2 запрещает слабые ключи RSA, DH и ECC с надёжностью менее 112 бит. [`SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext) по умолчанию использует минимальную версию протокола TLS 1.2. Настройки основаны на исследовании Hynek Schlawack. (Автор: Christian Heimes в [bpo-43998](https://python-all.ru/3.11/whatsnew/3.10.html).)906907Устаревшие протоколы SSL 3.0, TLS 1.0 и TLS 1.1 больше официально не поддерживаются. Python активно их не блокирует. Однако параметры сборки OpenSSL, настройки дистрибутивов, патчи вендоров и наборы шифров могут препятствовать успешному рукопожатию.908909Добавлен параметр *timeout* в функцию [`ssl.get_server_certificate()`](https://python-all.ru/3.11/library/ssl.html#ssl.get_server_certificate). (Автор: Zackery Spytz в [bpo-31870](https://python-all.ru/3.11/whatsnew/3.10.html).)910911Модуль ssl использует heap-типы и многофазную инициализацию. (Автор: Christian Heimes в [bpo-42333](https://python-all.ru/3.11/whatsnew/3.10.html).)912913Добавлен новый флаг проверки [`VERIFY_X509_PARTIAL_CHAIN`](https://python-all.ru/3.11/library/ssl.html#ssl.VERIFY_X509_PARTIAL_CHAIN). (Автор: l0x в [bpo-40849](https://python-all.ru/3.11/whatsnew/3.10.html).)914915### sqlite3916917Добавлены события аудита для `connect/handle()`, [`enable_load_extension()`](https://python-all.ru/3.11/library/sqlite3.html#sqlite3.Connection.enable_load_extension) и [`load_extension()`](https://python-all.ru/3.11/library/sqlite3.html#sqlite3.Connection.load_extension). (Автор: Erlend E. Aasland в [bpo-43762](https://python-all.ru/3.11/whatsnew/3.10.html).)918919### sys920921Добавлен атрибут [`sys.orig_argv`](https://python-all.ru/3.11/library/sys.html#sys.orig_argv): список исходных аргументов командной строки, переданных исполняемому файлу Python. (Автор: Victor Stinner в [bpo-23427](https://python-all.ru/3.11/whatsnew/3.10.html).)922923Добавлен [`sys.stdlib_module_names`](https://python-all.ru/3.11/library/sys.html#sys.stdlib_module_names), содержащий список имён модулей стандартной библиотеки. (Автор: Victor Stinner в [bpo-42955](https://python-all.ru/3.11/whatsnew/3.10.html).)924925### \_thread926927[`_thread.interrupt_main()`](https://python-all.ru/3.11/library/_thread.html#thread.interrupt_main) теперь принимает необязательный номер сигнала для имитации (по умолчанию по-прежнему [`signal.SIGINT`](https://python-all.ru/3.11/library/signal.html#signal.SIGINT)). (Автор: Antoine Pitrou в [bpo-43356](https://python-all.ru/3.11/whatsnew/3.10.html).)928929### threading930931Добавлены [`threading.gettrace()`](https://python-all.ru/3.11/library/threading.html#threading.gettrace) и [`threading.getprofile()`](https://python-all.ru/3.11/library/threading.html#threading.getprofile) для получения функций, установленных [`threading.settrace()`](https://python-all.ru/3.11/library/threading.html#threading.settrace) и [`threading.setprofile()`](https://python-all.ru/3.11/library/threading.html#threading.setprofile) соответственно. (Автор: Mario Corchero в [bpo-42251](https://python-all.ru/3.11/whatsnew/3.10.html).)932933Добавлен [`threading.__excepthook__`](https://python-all.ru/3.11/library/threading.html#threading.__excepthook__) для получения исходного значения [`threading.excepthook()`](https://python-all.ru/3.11/library/threading.html#threading.excepthook), если оно установлено в сломанное или другое значение. (Автор: Mario Corchero в [bpo-42308](https://python-all.ru/3.11/whatsnew/3.10.html).)934935### traceback936937Функции [`format_exception()`](https://python-all.ru/3.11/library/traceback.html#traceback.format_exception), [`format_exception_only()`](https://python-all.ru/3.11/library/traceback.html#traceback.format_exception_only) и [`print_exception()`](https://python-all.ru/3.11/library/traceback.html#traceback.print_exception) теперь могут принимать объект исключения в качестве позиционного аргумента (только позиционный). (Авторы: Zackery Spytz и Matthias Bussonnier в [bpo-26389](https://python-all.ru/3.11/whatsnew/3.10.html).)938939### types940941Повторно введены классы [`types.EllipsisType`](https://python-all.ru/3.11/library/types.html#types.EllipsisType), [`types.NoneType`](https://python-all.ru/3.11/library/types.html#types.NoneType) и [`types.NotImplementedType`](https://python-all.ru/3.11/library/types.html#types.NotImplementedType), предоставляющие новый набор типов, легко интерпретируемых средствами проверки типов. (Автор: Bas van Beek в [bpo-41810](https://python-all.ru/3.11/whatsnew/3.10.html).)942943### typing944945Основные изменения см. в [новых возможностях, связанных с аннотациями типов](https://python-all.ru/3.11/whatsnew/3.10.html#new-feat-related-type-hints).946947Поведение [`typing.Literal`](https://python-all.ru/3.11/library/typing.html#typing.Literal) было изменено в соответствии с [**PEP 586**](https://python-all.ru/3.11/whatsnew/3.10.html) и для соответствия поведению статических анализаторов типов, описанному в PEP.9489491. `Literal` теперь удаляет дубликаты параметров.9502. Проверки равенства между объектами `Literal` теперь не зависят от порядка.9513. Сравнения `Literal` теперь учитывают типы. Например, `Literal[0] == Literal[False]` ранее давало `True`. Теперь это `False`. Для поддержки этого изменения внутренний кеш типов теперь поддерживает различение типов.9524. Объекты `Literal` теперь будут вызывать исключение [`TypeError`](https://python-all.ru/3.11/library/exceptions.html#TypeError) при проверке равенства, если какой-либо из их параметров не является [хешируемым](https://python-all.ru/3.11/glossary.html#term-hashable). Обратите внимание, что объявление `Literal` с нехешируемыми параметрами не вызовет ошибку:953954   ```python955   >>> from typing import Literal956   >>> Literal[{0}]957   >>> Literal[{0}] == Literal[{False}]958   Traceback (most recent call last):959     File "<stdin>", line 1, in <module>960   TypeError: unhashable type: 'set'961   ```962963(Предложено Юрием Карабасом в [bpo-42345](https://python-all.ru/3.11/whatsnew/3.10.html).)964965Добавлена новая функция [`typing.is_typeddict()`](https://python-all.ru/3.11/library/typing.html#typing.is_typeddict) для проверки, является ли аннотация типом [`typing.TypedDict`](https://python-all.ru/3.11/library/typing.html#typing.TypedDict). (Предложено Патриком Ридером в [bpo-41792](https://python-all.ru/3.11/whatsnew/3.10.html).)966967Подклассы `typing.Protocol`, которые объявляют только переменные данных, теперь будут вызывать `TypeError` при проверке с помощью `isinstance`, если они не декорированы `runtime_checkable()`. Ранее такие проверки проходили молча. Пользователям следует декорировать свои подклассы декоратором `runtime_checkable()`,\\если они хотят использовать протоколы времени выполнения. (Предложено Юрием Карабасом в [bpo-38908](https://python-all.ru/3.11/whatsnew/3.10.html).)968969Импорт из подмодулей `typing.io` и `typing.re` теперь будет вызывать [`DeprecationWarning`](https://python-all.ru/3.11/library/exceptions.html#DeprecationWarning). Эти подмодули устарели начиная с Python 3.8 и будут удалены в будущей версии Python. Все, что принадлежит этим подмодулям, следует импортировать напрямую из [`typing`](https://python-all.ru/3.11/library/typing.html#module-typing). (Предложено Sebastian Rittau в [bpo-38291](https://python-all.ru/3.11/whatsnew/3.10.html).)970971### unittest972973Добавлен новый метод [`assertNoLogs()`](https://python-all.ru/3.11/library/unittest.html#unittest.TestCase.assertNoLogs) в дополнение к существующему [`assertLogs()`](https://python-all.ru/3.11/library/unittest.html#unittest.TestCase.assertLogs). (Предложено Kit Yan Choi в [bpo-39385](https://python-all.ru/3.11/whatsnew/3.10.html).)974975### urllib.parse976977В версиях Python ниже 3.10 допускалось использование как `;`, так и `&` в качестве разделителей параметров запроса в [`urllib.parse.parse_qs()`](https://python-all.ru/3.11/library/urllib.parse.html#urllib.parse.parse_qs) и [`urllib.parse.parse_qsl()`](https://python-all.ru/3.11/library/urllib.parse.html#urllib.parse.parse_qsl). Из соображений безопасности и для соответствия новым рекомендациям W3C теперь разрешен только один разделитель, по умолчанию `&`. Это изменение также затрагивает [`cgi.parse()`](https://python-all.ru/3.11/library/cgi.html#cgi.parse) и [`cgi.parse_multipart()`](https://python-all.ru/3.11/library/cgi.html#cgi.parse_multipart), так как они внутренне используют затронутые функции. Подробнее см. в их документации. (Предложено Adam Goldschmidt, Senthil Kumaran и Ken Jin в [bpo-42967](https://python-all.ru/3.11/whatsnew/3.10.html).)978979Наличие символов новой строки или табуляции в частях URL допускает некоторые формы атак. Следуя спецификации WHATWG, обновляющей [**RFC 3986**](https://python-all.ru/3.11/whatsnew/3.10.html), символы ASCII новой строки `\n`, `\r` и табуляции `\t` удаляются из URL анализатором в [`urllib.parse`](https://python-all.ru/3.11/library/urllib.parse.html#module-urllib.parse), предотвращая такие атаки. Удаляемые символы контролируются новой переменной уровня модуля `urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE`. (См. [gh-88048](https://python-all.ru/3.11/whatsnew/3.10.html))980981### xml982983Добавлен класс [`LexicalHandler`](https://python-all.ru/3.11/library/xml.sax.handler.html#xml.sax.handler.LexicalHandler) в модуль [`xml.sax.handler`](https://python-all.ru/3.11/library/xml.sax.handler.html#module-xml.sax.handler). (Предложено Jonathan Gossage и Zackery Spytz в [bpo-35018](https://python-all.ru/3.11/whatsnew/3.10.html).)984985### zipimport986987Добавлены методы, связанные с [**PEP 451**](https://python-all.ru/3.11/whatsnew/3.10.html): [`find_spec()`](https://python-all.ru/3.11/library/zipimport.html#zipimport.zipimporter.find_spec), [`zipimport.zipimporter.create_module()`](https://python-all.ru/3.11/library/zipimport.html#zipimport.zipimporter.create_module) и [`zipimport.zipimporter.exec_module()`](https://python-all.ru/3.11/library/zipimport.html#zipimport.zipimporter.exec_module). (Предложено Brett Cannon в [bpo-42131](https://python-all.ru/3.11/whatsnew/3.10.html).)988989Добавлен метод [`invalidate_caches()`](https://python-all.ru/3.11/library/zipimport.html#zipimport.zipimporter.invalidate_caches). (Предложено Desmond Cheong в [bpo-14678](https://python-all.ru/3.11/whatsnew/3.10.html).)990991## Оптимизации992993- Конструкторы [`str()`](https://python-all.ru/3.11/library/stdtypes.html#str), [`bytes()`](https://python-all.ru/3.11/library/stdtypes.html#bytes) и [`bytearray()`](https://python-all.ru/3.11/library/stdtypes.html#bytearray) теперь работают быстрее (примерно на 30–40% для маленьких объектов). (Предложено Serhiy Storchaka в [bpo-41334](https://python-all.ru/3.11/whatsnew/3.10.html).)994- Модуль [`runpy`](https://python-all.ru/3.11/library/runpy.html#module-runpy) теперь импортирует меньше модулей. Время запуска команды `python3 -m module-name` в среднем в 1,4 раза быстрее. На Linux `python3 -I -m module-name` импортирует 69 модулей в Python 3.9, тогда как в Python 3.10 импортирует только 51 модуль (-18). (Предложено Victor Stinner в [bpo-41006](https://python-all.ru/3.11/whatsnew/3.10.html) и [bpo-41718](https://python-all.ru/3.11/whatsnew/3.10.html).)995- Инструкция `LOAD_ATTR` теперь использует новый механизм «per opcode cache». Она работает примерно на 36% быстрее для обычных атрибутов и на 44% быстрее для слотов. (Предложено Pablo Galindo и Yury Selivanov в [bpo-42093](https://python-all.ru/3.11/whatsnew/3.10.html) и Guido van Rossum в [bpo-42927](https://python-all.ru/3.11/whatsnew/3.10.html), на основе идей, первоначально реализованных в PyPy и MicroPython.)996- При сборке Python с [`--enable-optimizations`](https://python-all.ru/3.11/using/configure.html#cmdoption-enable-optimizations) теперь `-fno-semantic-interposition` добавляется как в команду компиляции, так и в команду компоновки. Это ускоряет сборку интерпретатора Python, созданного с помощью [`--enable-shared`](https://python-all.ru/3.11/using/configure.html#cmdoption-enable-shared) с `gcc`, до 30%. См. [эту статью](https://python-all.ru/3.11/whatsnew/3.10.html) для подробностей. (Предложено Victor Stinner и Pablo Galindo в [bpo-38980](https://python-all.ru/3.11/whatsnew/3.10.html).)997- Используется новый код управления выходным буфером для модулей [`bz2`](https://python-all.ru/3.11/library/bz2.html#module-bz2) / [`lzma`](https://python-all.ru/3.11/library/lzma.html#module-lzma) / [`zlib`](https://python-all.ru/3.11/library/zlib.html#module-zlib), и добавлена функция `.readall()` к классу `_compression.DecompressReader`. Распаковка bz2 теперь быстрее в 1,09x ~ 1,17x, распаковка lzma – в 1,20x ~ 1,32x, `GzipFile.read(-1)` – в 1,11x ~ 1,18x. (Предложено Ma Lin, проверено Gregory P. Smith, в [bpo-41486](https://python-all.ru/3.11/whatsnew/3.10.html))998- При использовании строковых аннотаций словари аннотаций для функций больше не создаются при создании функции. Вместо этого они хранятся в виде кортежа строк, и объект функции лениво преобразует его в словарь аннотаций по требованию. Эта оптимизация сокращает время CPU, необходимое для определения аннотированной функции, вдвое. (Предложено Yurii Karabas и Inada Naoki в [bpo-42202](https://python-all.ru/3.11/whatsnew/3.10.html).)999- Функции поиска подстроки, такие как `str1 in str2` и `str2.find(str1)`, теперь иногда используют алгоритм поиска строк «Two-Way» Крочемора и Перрина, чтобы избежать квадратичного поведения на длинных строках. (Предложено Dennis Sweeney в [bpo-41972](https://python-all.ru/3.11/whatsnew/3.10.html))1000- Добавлены микрооптимизации в `_PyType_Lookup()` для улучшения производительности поиска в кеше атрибутов типа в типичном случае попадания в кеш. Это делает интерпретатор в среднем в 1,04 раза быстрее. (Предложено Dino Viehland в [bpo-43452](https://python-all.ru/3.11/whatsnew/3.10.html).)1001- Следующие встроенные функции теперь поддерживают более быстрый соглашение вызова [**PEP 590**](https://python-all.ru/3.11/whatsnew/3.10.html) vectorcall: [`map()`](https://python-all.ru/3.11/library/functions.html#map), [`filter()`](https://python-all.ru/3.11/library/functions.html#filter), [`reversed()`](https://python-all.ru/3.11/library/functions.html#reversed), [`bool()`](https://python-all.ru/3.11/library/functions.html#bool) и [`float()`](https://python-all.ru/3.11/library/functions.html#float). (Предложено Donghee Na и Jeroen Demeyer в [bpo-43575](https://python-all.ru/3.11/whatsnew/3.10.html), [bpo-43287](https://python-all.ru/3.11/whatsnew/3.10.html), [bpo-41922](https://python-all.ru/3.11/whatsnew/3.10.html), [bpo-41873](https://python-all.ru/3.11/whatsnew/3.10.html) и [bpo-41870](https://python-all.ru/3.11/whatsnew/3.10.html).)1002- Производительность `BZ2File` улучшена за счет удаления внутренних `RLock`. Это делает `BZ2File` потоконебезопасным при наличии нескольких одновременных читателей или писателей, как и его эквивалентные классы в [`gzip`](https://python-all.ru/3.11/library/gzip.html#module-gzip) и [`lzma`](https://python-all.ru/3.11/library/lzma.html#module-lzma) всегда были. (Предложено Inada Naoki в [bpo-43785](https://python-all.ru/3.11/whatsnew/3.10.html).)10031004## Устарело10051006- В настоящее время Python допускает числовые литералы, непосредственно после которых следуют ключевые слова, например `0in x`, `1or x`, `0if 1else 2`. Это приводит к появлению сбивающих с толку и неоднозначных выражений, таких как `[0x1for x in y]` (которые можно рассматривать как `[0x1 for x in y]` или `[0x1f or x in y]`). Начиная с этого выпуска, если за числовым литералом непосредственно следует одно из ключевых слов [`and`](https://python-all.ru/3.11/reference/expressions.html#and), [`else`](https://python-all.ru/3.11/reference/compound_stmts.html#else), [`for`](https://python-all.ru/3.11/reference/compound_stmts.html#for), [`if`](https://python-all.ru/3.11/reference/compound_stmts.html#if), [`in`](https://python-all.ru/3.11/reference/expressions.html#in), [`is`](https://python-all.ru/3.11/reference/expressions.html#is) и [`or`](https://python-all.ru/3.11/reference/expressions.html#or), выдаётся предупреждение об устаревании. В будущих выпусках оно будет заменено на синтаксическое предупреждение, а затем на синтаксическую ошибку. (Предложено Сергеем Сторчакой в [bpo-43833](https://python-all.ru/3.11/whatsnew/3.10.html).)1007- Начиная с этого выпуска будет предпринята согласованная работа по очистке старой семантики импорта, которая сохранялась для совместимости с Python 2.7. В частности, [`find_loader()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.PathEntryFinder.find_loader)/[`find_module()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.Finder.find_module) (заменено на `find_spec()`), [`load_module()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.Loader.load_module) (заменено на [`exec_module()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.Loader.exec_module)), [`module_repr()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.Loader.module_repr) (о чём система импорта заботится сама), атрибут `__package__` (заменён на `__spec__.parent`), атрибут `__loader__` (заменён на `__spec__.loader`) и атрибут `__cached__` (заменён на `__spec__.cached`) будут постепенно удалены (а также другие классы и методы в [`importlib`](https://python-all.ru/3.11/library/importlib.html#module-importlib)). При необходимости будут выдаваться [`ImportWarning`](https://python-all.ru/3.11/library/exceptions.html#ImportWarning) и/или [`DeprecationWarning`](https://python-all.ru/3.11/library/exceptions.html#DeprecationWarning), чтобы помочь определить код, требующий обновления в ходе этого перехода.1008- Всё пространство имён `distutils` объявлено устаревшим и будет удалено в Python 3.12. Подробнее см. в разделе [изменения модулей](https://python-all.ru/3.11/whatsnew/3.10.html#distutils-deprecated).1009- Нецелочисленные аргументы для [`random.randrange()`](https://python-all.ru/3.11/library/random.html#random.randrange) объявлены устаревшими. [`ValueError`](https://python-all.ru/3.11/library/exceptions.html#ValueError) устарел в пользу [`TypeError`](https://python-all.ru/3.11/library/exceptions.html#TypeError). (Предложено Сергеем Сторчакой и Раймондом Хеттингером в [bpo-37319](https://python-all.ru/3.11/whatsnew/3.10.html).)1010- Различные методы `load_module()` класса [`importlib`](https://python-all.ru/3.11/library/importlib.html#module-importlib) были задокументированы как устаревшие, начиная с Python 3.6, но теперь они также будут вызывать [`DeprecationWarning`](https://python-all.ru/3.11/library/exceptions.html#DeprecationWarning). Используйте вместо них [`exec_module()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.Loader.exec_module). (Предложено Бреттом Кэнноном в [bpo-26131](https://python-all.ru/3.11/whatsnew/3.10.html).)1011- `zimport.zipimporter.load_module()` объявлен устаревшим в пользу [`exec_module()`](https://python-all.ru/3.11/library/zipimport.html#zipimport.zipimporter.exec_module). (Предложено Бреттом Кэнноном в [bpo-26131](https://python-all.ru/3.11/whatsnew/3.10.html).)1012- Использование [`load_module()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.Loader.load_module) системой импорта теперь вызывает [`ImportWarning`](https://python-all.ru/3.11/library/exceptions.html#ImportWarning), поскольку предпочтительнее использовать [`exec_module()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.Loader.exec_module). (Предложено Бреттом Кэнноном в [bpo-26131](https://python-all.ru/3.11/whatsnew/3.10.html).)1013- Использование [`importlib.abc.MetaPathFinder.find_module()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.MetaPathFinder.find_module) и [`importlib.abc.PathEntryFinder.find_module()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.PathEntryFinder.find_module) системой импорта теперь вызывает [`ImportWarning`](https://python-all.ru/3.11/library/exceptions.html#ImportWarning), поскольку предпочтительнее использовать [`importlib.abc.MetaPathFinder.find_spec()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.MetaPathFinder.find_spec) и [`importlib.abc.PathEntryFinder.find_spec()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.PathEntryFinder.find_spec) соответственно. Для помощи в переносе можно использовать [`importlib.util.spec_from_loader()`](https://python-all.ru/3.11/library/importlib.html#importlib.util.spec_from_loader). (Предложено Бреттом Кэнноном в [bpo-42134](https://python-all.ru/3.11/whatsnew/3.10.html).)1014- Использование [`importlib.abc.PathEntryFinder.find_loader()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.PathEntryFinder.find_loader) системой импорта теперь вызывает [`ImportWarning`](https://python-all.ru/3.11/library/exceptions.html#ImportWarning), поскольку предпочтительнее использовать [`importlib.abc.PathEntryFinder.find_spec()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.PathEntryFinder.find_spec). Для помощи в переносе можно использовать [`importlib.util.spec_from_loader()`](https://python-all.ru/3.11/library/importlib.html#importlib.util.spec_from_loader). (Предложено Бреттом Кэнноном в [bpo-43672](https://python-all.ru/3.11/whatsnew/3.10.html).)1015- Различные реализации [`importlib.abc.MetaPathFinder.find_module()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.MetaPathFinder.find_module) ( `importlib.machinery.BuiltinImporter.find_module()`, `importlib.machinery.FrozenImporter.find_module()`, `importlib.machinery.WindowsRegistryFinder.find_module()`, [`importlib.machinery.PathFinder.find_module()`](https://python-all.ru/3.11/library/importlib.html#importlib.machinery.PathFinder.find_module), [`importlib.abc.MetaPathFinder.find_module()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.MetaPathFinder.find_module) ), [`importlib.abc.PathEntryFinder.find_module()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.PathEntryFinder.find_module) ( `importlib.machinery.FileFinder.find_module()` ) и [`importlib.abc.PathEntryFinder.find_loader()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.PathEntryFinder.find_loader) ( [`importlib.machinery.FileFinder.find_loader()`](https://python-all.ru/3.11/library/importlib.html#importlib.machinery.FileFinder.find_loader) ) теперь вызывают [`DeprecationWarning`](https://python-all.ru/3.11/library/exceptions.html#DeprecationWarning) и планируются к удалению в Python 3.12 (ранее они были задокументированы как устаревшие в Python 3.4). (Предложено Бреттом Кэнноном в [bpo-42135](https://python-all.ru/3.11/whatsnew/3.10.html).)1016- [`importlib.abc.Finder`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.Finder) объявлен устаревшим (включая его единственный метод [`find_module()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.Finder.find_module)). Оба класса [`importlib.abc.MetaPathFinder`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.MetaPathFinder) и [`importlib.abc.PathEntryFinder`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.PathEntryFinder) больше не наследуются от этого класса. Вместо этого следует наследовать от одного из этих двух классов по ситуации. (Предложено Бреттом Кэнноном в [bpo-42135](https://python-all.ru/3.11/whatsnew/3.10.html).)1017- Уведомления об устаревании для [`imp`](https://python-all.ru/3.11/library/imp.html#module-imp), [`importlib.find_loader()`](https://python-all.ru/3.11/library/importlib.html#importlib.find_loader), `importlib.util.set_package_wrapper()`, `importlib.util.set_loader_wrapper()`, [`importlib.util.module_for_loader()`](https://python-all.ru/3.11/library/importlib.html#importlib.util.module_for_loader), [`pkgutil.ImpImporter`](https://python-all.ru/3.11/library/pkgutil.html#pkgutil.ImpImporter) и [`pkgutil.ImpLoader`](https://python-all.ru/3.11/library/pkgutil.html#pkgutil.ImpLoader) были обновлены: теперь в качестве планируемой версии удаления указан Python 3.12 (в предыдущих версиях Python они начали вызывать [`DeprecationWarning`](https://python-all.ru/3.11/library/exceptions.html#DeprecationWarning)). (Предложено Бреттом Кэнноном в [bpo-43720](https://python-all.ru/3.11/whatsnew/3.10.html).)1018- Система импорта теперь использует атрибут `__spec__` у модулей, прежде чем обратиться к [`module_repr()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.Loader.module_repr) для метода `__repr__()` модуля. Удаление использования `module_repr()` запланировано на Python 3.12. (Предложено Бреттом Кэнноном в [bpo-42137](https://python-all.ru/3.11/whatsnew/3.10.html).)1019- [`importlib.abc.Loader.module_repr()`](https://python-all.ru/3.11/library/importlib.html#importlib.abc.Loader.module_repr), `importlib.machinery.FrozenLoader.module_repr()` и `importlib.machinery.BuiltinLoader.module_repr()` объявлены устаревшими и планируются к удалению в Python 3.12. (Предложено Бреттом Кэнноном в [bpo-42136](https://python-all.ru/3.11/whatsnew/3.10.html).)1020- `sqlite3.OptimizedUnicode` не документирован и считается устаревшим начиная с Python 3.3, когда он стал псевдонимом для [`str`](https://python-all.ru/3.11/library/stdtypes.html#str). Теперь он объявлен устаревшим и запланирован к удалению в Python 3.12. (Предложено Эрлендом Э. Осландом в [bpo-42264](https://python-all.ru/3.11/whatsnew/3.10.html).)1021- Не документированная встроенная функция `sqlite3.enable_shared_cache` теперь объявлена устаревшей и запланирована к удалению в Python 3.12. Документация SQLite3 настоятельно не рекомендует её использовать. Подробнее см. в [документации SQLite3](https://python-all.ru/3.11/whatsnew/3.10.html). Если необходимо использовать общий кеш, откройте базу данных в режиме URI с помощью параметра запроса `cache=shared`. (Предложено Эрлендом Э. Осландом в [bpo-24464](https://python-all.ru/3.11/whatsnew/3.10.html).)1022- Следующие методы `threading` теперь объявлены устаревшими:10231024  - `threading.currentThread` =\> [`threading.current_thread()`](https://python-all.ru/3.11/library/threading.html#threading.current_thread)1025  - `threading.activeCount` =\> [`threading.active_count()`](https://python-all.ru/3.11/library/threading.html#threading.active_count)1026  - `threading.Condition.notifyAll` =\> [`threading.Condition.notify_all()`](https://python-all.ru/3.11/library/threading.html#threading.Condition.notify_all)1027  - `threading.Event.isSet` =\> [`threading.Event.is_set()`](https://python-all.ru/3.11/library/threading.html#threading.Event.is_set)1028  - `threading.Thread.setName` =\> [`threading.Thread.name`](https://python-all.ru/3.11/library/threading.html#threading.Thread.name)1029  - `threading.thread.getName` =\> [`threading.Thread.name`](https://python-all.ru/3.11/library/threading.html#threading.Thread.name)1030  - `threading.Thread.isDaemon` =\> [`threading.Thread.daemon`](https://python-all.ru/3.11/library/threading.html#threading.Thread.daemon)1031  - `threading.Thread.setDaemon` =\> [`threading.Thread.daemon`](https://python-all.ru/3.11/library/threading.html#threading.Thread.daemon)10321033  (Предложено Йелле Зейлстрой в [gh-87889](https://python-all.ru/3.11/whatsnew/3.10.html).)1034- [`pathlib.Path.link_to()`](https://python-all.ru/3.11/library/pathlib.html#pathlib.Path.link_to) объявлен устаревшим и запланирован к удалению в Python 3.12. Вместо него используйте [`pathlib.Path.hardlink_to()`](https://python-all.ru/3.11/library/pathlib.html#pathlib.Path.hardlink_to). (Предложено Барни Гейлом в [bpo-39950](https://python-all.ru/3.11/whatsnew/3.10.html).)1035- `cgi.log()` объявлен устаревшим и запланирован к удалению в Python 3.12. (Предложено Инадой Наоки в [bpo-41139](https://python-all.ru/3.11/whatsnew/3.10.html).)1036- Следующие возможности [`ssl`](https://python-all.ru/3.11/library/ssl.html#module-ssl) объявлены устаревшими начиная с Python 3.6, Python 3.7 или OpenSSL 1.1.0 и будут удалены в 3.11:10371038  - [`OP_NO_SSLv2`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_NO_SSLv2), [`OP_NO_SSLv3`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_NO_SSLv3), [`OP_NO_TLSv1`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_NO_TLSv1), [`OP_NO_TLSv1_1`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_NO_TLSv1_1), [`OP_NO_TLSv1_2`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_NO_TLSv1_2) и [`OP_NO_TLSv1_3`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_NO_TLSv1_3) заменяются на `sslSSLContext.minimum_version` и `sslSSLContext.maximum_version`.1039  - [`PROTOCOL_SSLv2`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_SSLv2), [`PROTOCOL_SSLv3`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_SSLv3), [`PROTOCOL_SSLv23`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_SSLv23), [`PROTOCOL_TLSv1`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLSv1), [`PROTOCOL_TLSv1_1`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLSv1_1), [`PROTOCOL_TLSv1_2`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLSv1_2) и [`PROTOCOL_TLS`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS) объявлены устаревшими в пользу [`PROTOCOL_TLS_CLIENT`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_CLIENT) и [`PROTOCOL_TLS_SERVER`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_SERVER)1040  - [`wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.wrap_socket) заменяется на [`ssl.SSLContext.wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.wrap_socket)1041  - [`match_hostname()`](https://python-all.ru/3.11/library/ssl.html#ssl.match_hostname)1042  - [`RAND_pseudo_bytes()`](https://python-all.ru/3.11/library/ssl.html#ssl.RAND_pseudo_bytes), `RAND_egd()`1043  - Возможности NPN, такие как [`ssl.SSLSocket.selected_npn_protocol()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.selected_npn_protocol) и [`ssl.SSLContext.set_npn_protocols()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.set_npn_protocols), заменяются на ALPN.1044- Отладка threading ([`PYTHONTHREADDEBUG`](https://python-all.ru/3.11/using/cmdline.html#envvar-PYTHONTHREADDEBUG) переменная окружения) устарела в Python 3.10 и будет удалена в Python 3.12. Эта функция требует [отладочной сборки Python](https://python-all.ru/3.11/using/configure.html#debug-build). (Автор: Victor Stinner в [bpo-44584](https://python-all.ru/3.11/whatsnew/3.10.html).)1045- Импорт из подмодулей `typing.io` и `typing.re` теперь будет вызывать [`DeprecationWarning`](https://python-all.ru/3.11/library/exceptions.html#DeprecationWarning). Эти подмодули будут удалены в будущей версии Python. Всё, что относится к этим подмодулям, следует импортировать напрямую из [`typing`](https://python-all.ru/3.11/library/typing.html#module-typing). (Предложено Себастьяном Риттау в [bpo-38291](https://python-all.ru/3.11/whatsnew/3.10.html).)10461047## Удалено10481049- Удалены специальные методы `__int__`, `__float__`, `__floordiv__`, `__mod__`, `__divmod__`, `__rfloordiv__`, `__rmod__` и `__rdivmod__` класса [`complex`](https://python-all.ru/3.11/library/functions.html#complex). Они всегда вызывали [`TypeError`](https://python-all.ru/3.11/library/exceptions.html#TypeError). (Предложено Сергеем Сторчакой в [bpo-41974](https://python-all.ru/3.11/whatsnew/3.10.html).)1050- Метод `ParserBase.error()` из приватного и недокументированного модуля `_markupbase` был удалён. [`html.parser.HTMLParser`](https://python-all.ru/3.11/library/html.parser.html#html.parser.HTMLParser) – единственный подкласс `ParserBase`, и его реализация `error()` уже была удалена в Python 3.5. (Предложено Беркером Пексагом в [bpo-31844](https://python-all.ru/3.11/whatsnew/3.10.html).)1051- Удалён атрибут `unicodedata.ucnhash_CAPI`, который был внутренним объектом PyCapsule. Соответствующая приватная структура `_PyUnicode_Name_CAPI` была перемещена во внутренний C API. (Предложено Виктором Стиннером в [bpo-42157](https://python-all.ru/3.11/whatsnew/3.10.html).)1052- Удалён модуль `parser`, который был объявлен устаревшим в версии 3.9 из-за перехода на новый PEG-парсер, а также все исходные C-файлы и заголовочные файлы, которые использовались только старым парсером, включая `node.h`, `parser.h`, `graminit.h` и `grammar.h`.1053- Удалены функции публичного C API `PyParser_SimpleParseStringFlags`, `PyParser_SimpleParseStringFlagsFilename`, `PyParser_SimpleParseFileFlags` и `PyNode_Compile`, которые были объявлены устаревшими в версии 3.9 из-за перехода на новый PEG-парсер.1054- Удалён модуль `formatter`, который был объявлен устаревшим в Python 3.4. Он несколько устарел, мало используется и не тестируется. Изначально его планировали удалить в Python 3.6, но такие удаления были отложены до окончания поддержки Python 2.7. Существующим пользователям следует скопировать используемые ими классы в свой код. (Авторы: Donghee Na и Terry J. Reedy в [bpo-42299](https://python-all.ru/3.11/whatsnew/3.10.html).)1055- Удалена функция `PyModule_GetWarningsModule()`, которая стала бесполезной после того, как модуль `_warnings` был преобразован во встроенный модуль в версии 2.6. (Автор: Hai Shi в [bpo-42599](https://python-all.ru/3.11/whatsnew/3.10.html).)1056- Удалены устаревшие псевдонимы для [абстрактных базовых классов коллекций](https://python-all.ru/3.11/library/collections.abc.html#collections-abstract-base-classes) из модуля [`collections`](https://python-all.ru/3.11/library/collections.html#module-collections). (Автор: Victor Stinner в [bpo-37324](https://python-all.ru/3.11/whatsnew/3.10.html).)1057- Параметр `loop` был удалён из большинства [высокоуровневого API](https://python-all.ru/3.11/library/asyncio-api-index.html) [`asyncio`](https://python-all.ru/3.11/library/asyncio.html#module-asyncio) после объявления устаревшим в Python 3.8. Причины этого изменения многообразны:10581059  1. Это упрощает высокоуровневый API.1060  2. Функции высокоуровневого API неявно получают работающий цикл событий текущего потока, начиная с Python 3.7. В большинстве обычных случаев нет необходимости передавать цикл событий в API.1061  3. Передача цикла событий чревата ошибками, особенно при работе с циклами, выполняющимися в разных потоках.10621063  Обратите внимание: низкоуровневый API по-прежнему принимает `loop`. Примеры замены существующего кода см. в разделе [Изменения в Python API](https://python-all.ru/3.11/whatsnew/3.10.html#changes-python-api).10641065  (Авторы: Yurii Karabas, Andrew Svetlov, Yury Selivanov и Kyle Stanley в [bpo-42392](https://python-all.ru/3.11/whatsnew/3.10.html).)10661067## Перенос на Python 3.1010681069В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.10701071### Изменения в синтаксисе Python10721073- Теперь выдаётся предупреждение об устаревании при компиляции ранее допустимого синтаксиса, если числовой литерал непосредственно предшествует ключевому слову (как в `0in x`). В будущих версиях это станет синтаксическим предупреждением, а затем синтаксической ошибкой. Чтобы избавиться от предупреждения и обеспечить совместимость с будущими версиями, просто добавьте пробел между числовым литералом и следующим ключевым словом. (Автор: Serhiy Storchaka в [bpo-43833](https://python-all.ru/3.11/whatsnew/3.10.html).)10741075### Изменения в Python API10761077- Параметры *etype* функций [`format_exception()`](https://python-all.ru/3.11/library/traceback.html#traceback.format_exception), [`format_exception_only()`](https://python-all.ru/3.11/library/traceback.html#traceback.format_exception_only) и [`print_exception()`](https://python-all.ru/3.11/library/traceback.html#traceback.print_exception) в модуле [`traceback`](https://python-all.ru/3.11/library/traceback.html#module-traceback) переименованы в *exc*. (Авторы: Zackery Spytz и Matthias Bussonnier в [bpo-26389](https://python-all.ru/3.11/whatsnew/3.10.html).)1078- [`atexit`](https://python-all.ru/3.11/library/atexit.html#module-atexit): При завершении Python, если колбэк, зарегистрированный с помощью [`atexit.register()`](https://python-all.ru/3.11/library/atexit.html#atexit.register), завершается ошибкой, его исключение теперь записывается в журнал. Ранее регистрировались только некоторые исключения, а последнее исключение всегда молча игнорировалось. (Автор: Victor Stinner в [bpo-42639](https://python-all.ru/3.11/whatsnew/3.10.html).)1079- Обобщённый тип [`collections.abc.Callable`](https://python-all.ru/3.11/library/collections.abc.html#collections.abc.Callable) теперь уплощает параметры типа, аналогично тому, что делает [`typing.Callable`](https://python-all.ru/3.11/library/typing.html#typing.Callable). Это означает, что `collections.abc.Callable[[int, str], str]` будет иметь `__args__` из `(int, str, str)`; ранее это было `([int, str], str)`. Код, обращающийся к аргументам через [`typing.get_args()`](https://python-all.ru/3.11/library/typing.html#typing.get_args) или `__args__`, должен учитывать это изменение. Кроме того, [`TypeError`](https://python-all.ru/3.11/library/exceptions.html#TypeError) может быть возбуждено для некорректных форм параметризации [`collections.abc.Callable`](https://python-all.ru/3.11/library/collections.abc.html#collections.abc.Callable), которые в Python 3.9 могли проходить незамеченными. (Автор: Ken Jin в [bpo-42195](https://python-all.ru/3.11/whatsnew/3.10.html).)1080- [`socket.htons()`](https://python-all.ru/3.11/library/socket.html#socket.htons) и [`socket.ntohs()`](https://python-all.ru/3.11/library/socket.html#socket.ntohs) теперь возбуждают [`OverflowError`](https://python-all.ru/3.11/library/exceptions.html#OverflowError) вместо [`DeprecationWarning`](https://python-all.ru/3.11/library/exceptions.html#DeprecationWarning), если заданный параметр не помещается в 16-битное целое без знака. (Автор: Erlend E. Aasland в [bpo-42393](https://python-all.ru/3.11/whatsnew/3.10.html).)1081- Параметр `loop` был удалён из большинства [высокоуровневого API](https://python-all.ru/3.11/library/asyncio-api-index.html) [`asyncio`](https://python-all.ru/3.11/library/asyncio.html#module-asyncio) после объявления устаревшим в Python 3.8.10821083  Корутина, которая сейчас выглядит так:10841085  ```python1086  async def foo(loop):1087      await asyncio.sleep(1, loop=loop)1088  ```10891090  Должна быть заменена на:10911092  ```python1093  async def foo():1094      await asyncio.sleep(1)1095  ```10961097  Если `foo()` была специально спроектирована *не* для работы в работающем цикле событий текущего потока (например, для работы в цикле событий другого потока), рассмотрите возможность использования [`asyncio.run_coroutine_threadsafe()`](https://python-all.ru/3.11/library/asyncio-task.html#asyncio.run_coroutine_threadsafe) вместо этого.10981099  (Авторы: Yurii Karabas, Andrew Svetlov, Yury Selivanov и Kyle Stanley в [bpo-42392](https://python-all.ru/3.11/whatsnew/3.10.html).)1100- Конструктор [`types.FunctionType`](https://python-all.ru/3.11/library/types.html#types.FunctionType) теперь наследует текущие встроенные функции, если словарь *globals* не содержит ключа `"__builtins__"`, вместо использования `{"None": None}` в качестве встроенных функций: такое же поведение, как у функций [`eval()`](https://python-all.ru/3.11/library/functions.html#eval) и [`exec()`](https://python-all.ru/3.11/library/functions.html#exec). Определение функции с помощью `def function(...): ...` в Python не затрагивается, глобальные переменные не могут быть переопределены этим синтаксисом: он также наследует текущие встроенные функции. (Автор: Victor Stinner в [bpo-42990](https://python-all.ru/3.11/whatsnew/3.10.html).)11011102### Изменения в C API11031104- Функции C API `PyParser_SimpleParseStringFlags`, `PyParser_SimpleParseStringFlagsFilename`, `PyParser_SimpleParseFileFlags`, `PyNode_Compile` и тип, используемый этими функциями, `struct _node`, были удалены из-за перехода на новый PEG-парсер.11051106  Исходный код теперь следует компилировать непосредственно в объект кода, например, с помощью [`Py_CompileString()`](https://python-all.ru/3.11/c-api/veryhigh.html#c.Py_CompileString). Полученный объект кода затем можно выполнить, например, с помощью [`PyEval_EvalCode()`](https://python-all.ru/3.11/c-api/veryhigh.html#c.PyEval_EvalCode).11071108  В частности:11091110  - Вызов `PyParser_SimpleParseStringFlags` с последующим `PyNode_Compile` можно заменить вызовом [`Py_CompileString()`](https://python-all.ru/3.11/c-api/veryhigh.html#c.Py_CompileString).1111  - Прямой замены для `PyParser_SimpleParseFileFlags` не существует. Чтобы скомпилировать код из аргумента `FILE *`, вам нужно будет прочитать файл на C и передать полученный буфер в [`Py_CompileString()`](https://python-all.ru/3.11/c-api/veryhigh.html#c.Py_CompileString).1112  - Чтобы скомпилировать файл по заданному имени файла `char *`, необходимо явно открыть файл, прочитать его и скомпилировать результат. Один из способов – использовать модуль [`io`](https://python-all.ru/3.11/library/io.html#module-io) с функциями [`PyImport_ImportModule()`](https://python-all.ru/3.11/c-api/import.html#c.PyImport_ImportModule), [`PyObject_CallMethod()`](https://python-all.ru/3.11/c-api/call.html#c.PyObject_CallMethod), [`PyBytes_AsString()`](https://python-all.ru/3.11/c-api/bytes.html#c.PyBytes_AsString) и [`Py_CompileString()`](https://python-all.ru/3.11/c-api/veryhigh.html#c.Py_CompileString), как показано ниже. (Объявления и обработка ошибок опущены.)11131114    ```python1115    io_module = Import_ImportModule("io");1116    fileobject = PyObject_CallMethod(io_module, "open", "ss", filename, "rb");1117    source_bytes_object = PyObject_CallMethod(fileobject, "read", "");1118    result = PyObject_CallMethod(fileobject, "close", "");1119    source_buf = PyBytes_AsString(source_bytes_object);1120    code = Py_CompileString(source_buf, filename, Py_file_input);1121    ```1122  - Для объектов `FrameObject` член [`f_lasti`](https://python-all.ru/3.11/reference/datamodel.html#frame.f_lasti) теперь представляет смещение в wordcode, а не просто смещение в строке байткода. Это означает, что это число необходимо умножить на 2 для использования с API, которые ожидают смещение в байтах (например, [`PyCode_Addr2Line()`](https://python-all.ru/3.11/c-api/code.html#c.PyCode_Addr2Line)). Также обратите внимание, что член `f_lasti` объектов `FrameObject` не считается стабильным: используйте вместо него [`PyFrame_GetLineNumber()`](https://python-all.ru/3.11/c-api/frame.html#c.PyFrame_GetLineNumber).11231124## Изменения байткода CPython11251126- Инструкция `MAKE_FUNCTION` теперь принимает в качестве аннотаций функции либо словарь, либо кортеж строк. (Предложено Юрием Карабасом и Инадой Наоки в [bpo-42202](https://python-all.ru/3.11/whatsnew/3.10.html).)11271128## Изменения сборки11291130- [**PEP 644**](https://python-all.ru/3.11/whatsnew/3.10.html): Python теперь требует OpenSSL 1.1.1 или новее. OpenSSL 1.0.2 больше не поддерживается. (Предложено Кристианом Хаймсом в [bpo-43669](https://python-all.ru/3.11/whatsnew/3.10.html).)1131- Для сборки Python теперь требуются функции C99 `snprintf()` и `vsnprintf()`. (Предложено Виктором Штиннером в [bpo-36020](https://python-all.ru/3.11/whatsnew/3.10.html).)1132- [`sqlite3`](https://python-all.ru/3.11/library/sqlite3.html#module-sqlite3) требует SQLite 3.7.15 или выше. (Предложено Сергеем Федосеевым и Эрлендом Э. Аасландом в [bpo-40744](https://python-all.ru/3.11/whatsnew/3.10.html) и [bpo-40810](https://python-all.ru/3.11/whatsnew/3.10.html).)1133- Модуль [`atexit`](https://python-all.ru/3.11/library/atexit.html#module-atexit) теперь всегда должен быть встроенным модулем. (Предложено Виктором Штиннером в [bpo-42639](https://python-all.ru/3.11/whatsnew/3.10.html).)1134- Добавлена опция [`--disable-test-modules`](https://python-all.ru/3.11/using/configure.html#cmdoption-disable-test-modules) в скрипт `configure`: не собирать и не устанавливать тестовые модули. (Предложено Ксавье де Гаем, Томасом Петаззони и Пейсином Сином в [bpo-27640](https://python-all.ru/3.11/whatsnew/3.10.html).)1135- Добавлен [`--with-wheel-pkg-dir=PATH option`](https://python-all.ru/3.11/using/configure.html#cmdoption-with-wheel-pkg-dir) в скрипт `./configure`. Если указано, модуль [`ensurepip`](https://python-all.ru/3.11/library/ensurepip.html#module-ensurepip) ищет колесные пакеты `setuptools` и `pip` в этом каталоге: если оба присутствуют, эти колесные пакеты используются вместо встроенных колесных пакетов ensurepip.11361137  Некоторые политики упаковки дистрибутивов Linux рекомендуют не включать зависимости. Например, Fedora устанавливает пакеты wheel в каталог `/usr/share/python-wheels/` и не устанавливает пакет `ensurepip._bundled`.11381139  (Предложено Виктором Штиннером в [bpo-42856](https://python-all.ru/3.11/whatsnew/3.10.html).)1140- Добавлена новая [`configure --without-static-libpython option`](https://python-all.ru/3.11/using/configure.html#cmdoption-without-static-libpython), чтобы не собирать статическую библиотеку `libpythonMAJOR.MINOR.a` и не устанавливать объектный файл `python.o`.11411142  (Предложено Виктором Штиннером в [bpo-43103](https://python-all.ru/3.11/whatsnew/3.10.html).)1143- Скрипт `configure` теперь использует утилиту `pkg-config`, если она доступна, для определения местоположения заголовков и библиотек Tcl/Tk. Как и раньше, эти местоположения можно указать явно с помощью опций конфигурации `--with-tcltk-includes` и `--with-tcltk-libs`. (Предложено Манолисом Стаматогианнакисом в [bpo-42603](https://python-all.ru/3.11/whatsnew/3.10.html).)1144- Добавлена опция [`--with-openssl-rpath`](https://python-all.ru/3.11/using/configure.html#cmdoption-with-openssl-rpath) в скрипт `configure`. Эта опция упрощает сборку Python с пользовательской установкой OpenSSL, например `./configure --with-openssl=/path/to/openssl --with-openssl-rpath=auto`. (Предложено Кристианом Хаймсом в [bpo-43466](https://python-all.ru/3.11/whatsnew/3.10.html).)11451146## Изменения C API11471148### PEP 652: Поддержание стабильного ABI11491150Стабильный ABI (интерфейс двоичного кода приложений) для модулей расширения или встраивания Python теперь явно определён. [Стабильность C API](https://python-all.ru/3.11/c-api/stable.html#stable) описывает гарантии стабильности C API и ABI, а также лучшие практики использования стабильного ABI.11511152(Предложено Петром Викториным в [**PEP 652**](https://python-all.ru/3.11/whatsnew/3.10.html) и [bpo-43795](https://python-all.ru/3.11/whatsnew/3.10.html).)11531154### Новые возможности11551156- Результат [`PyNumber_Index()`](https://python-all.ru/3.11/c-api/number.html#c.PyNumber_Index) теперь всегда имеет точный тип [`int`](https://python-all.ru/3.11/library/functions.html#int). Ранее результатом мог быть экземпляр подкласса `int`. (Предложено Сергеем Сторчакой в [bpo-40792](https://python-all.ru/3.11/whatsnew/3.10.html).)1157- Добавлен новый член [`orig_argv`](https://python-all.ru/3.11/c-api/init_config.html#c.PyConfig.orig_argv) в структуру [`PyConfig`](https://python-all.ru/3.11/c-api/init_config.html#c.PyConfig): список исходных аргументов командной строки, переданных исполняемому файлу Python. (Предложено Виктором Штиннером в [bpo-23427](https://python-all.ru/3.11/whatsnew/3.10.html).)1158- Добавлены макросы [`PyDateTime_DATE_GET_TZINFO()`](https://python-all.ru/3.11/c-api/datetime.html#c.PyDateTime_DATE_GET_TZINFO) и [`PyDateTime_TIME_GET_TZINFO()`](https://python-all.ru/3.11/c-api/datetime.html#c.PyDateTime_TIME_GET_TZINFO) для доступа к атрибутам `tzinfo` объектов [`datetime.datetime`](https://python-all.ru/3.11/library/datetime.html#datetime.datetime) и [`datetime.time`](https://python-all.ru/3.11/library/datetime.html#datetime.time). (Предложено Закери Спайтцем в [bpo-30155](https://python-all.ru/3.11/whatsnew/3.10.html).)1159- Добавлена функция [`PyCodec_Unregister()`](https://python-all.ru/3.11/c-api/codec.html#c.PyCodec_Unregister) для отмены регистрации функции поиска кодеков. (Предложено Хай Ши в [bpo-41842](https://python-all.ru/3.11/whatsnew/3.10.html).)1160- Добавлена функция [`PyIter_Send()`](https://python-all.ru/3.11/c-api/iter.html#c.PyIter_Send), позволяющая отправить значение в итератор без возбуждения исключения `StopIteration`. (Предложено Владимиром Матвеевым в [bpo-41756](https://python-all.ru/3.11/whatsnew/3.10.html).)1161- Добавлен [`PyUnicode_AsUTF8AndSize()`](https://python-all.ru/3.11/c-api/unicode.html#c.PyUnicode_AsUTF8AndSize) в ограниченный C API. (Предложено Алексом Гейнором в [bpo-41784](https://python-all.ru/3.11/whatsnew/3.10.html).)1162- Добавлена функция [`PyModule_AddObjectRef()`](https://python-all.ru/3.11/c-api/module.html#c.PyModule_AddObjectRef): похожа на [`PyModule_AddObject()`](https://python-all.ru/3.11/c-api/module.html#c.PyModule_AddObject), но не крадёт ссылку на значение при успехе. (Предложено Виктором Штиннером в [bpo-1635741](https://python-all.ru/3.11/whatsnew/3.10.html).)1163- Добавлены функции [`Py_NewRef()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_NewRef) и [`Py_XNewRef()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_XNewRef) для увеличения счётчика ссылок объекта и возврата объекта. (Предложено Виктором Штиннером в [bpo-42262](https://python-all.ru/3.11/whatsnew/3.10.html).)1164- Функции [`PyType_FromSpecWithBases()`](https://python-all.ru/3.11/c-api/type.html#c.PyType_FromSpecWithBases) и [`PyType_FromModuleAndSpec()`](https://python-all.ru/3.11/c-api/type.html#c.PyType_FromModuleAndSpec) теперь принимают один класс в качестве аргумента *bases*. (Предложено Сергеем Сторчакой в [bpo-42423](https://python-all.ru/3.11/whatsnew/3.10.html).)1165- Функция [`PyType_FromModuleAndSpec()`](https://python-all.ru/3.11/c-api/type.html#c.PyType_FromModuleAndSpec) теперь принимает NULL-слот `tp_doc`. (Предложено Хай Ши в [bpo-41832](https://python-all.ru/3.11/whatsnew/3.10.html).)1166- Функция [`PyType_GetSlot()`](https://python-all.ru/3.11/c-api/type.html#c.PyType_GetSlot) может принимать [статические типы](https://python-all.ru/3.11/c-api/typeobj.html#static-types). (Предложено Хай Ши и Петром Викториным в [bpo-41073](https://python-all.ru/3.11/whatsnew/3.10.html).)1167- Добавлена новая функция [`PySet_CheckExact()`](https://python-all.ru/3.11/c-api/set.html#c.PySet_CheckExact) в C-API, проверяющая, является ли объект экземпляром [`set`](https://python-all.ru/3.11/library/stdtypes.html#set), но не экземпляром подтипа. (Автор: Pablo Galindo в [bpo-43277](https://python-all.ru/3.11/whatsnew/3.10.html).)1168- Добавлена функция [`PyErr_SetInterruptEx()`](https://python-all.ru/3.11/c-api/exceptions.html#c.PyErr_SetInterruptEx), позволяющая передавать номер сигнала для имитации. (Автор: Antoine Pitrou в [bpo-43356](https://python-all.ru/3.11/whatsnew/3.10.html).)1169- Ограниченный C-API теперь поддерживается, если [Python собран в режиме отладки](https://python-all.ru/3.11/using/configure.html#debug-build) (если определён макрос `Py_DEBUG`). В ограниченном C-API функции [`Py_INCREF()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_INCREF) и [`Py_DECREF()`](https://python-all.ru/3.11/c-api/refcounting.html#c.Py_DECREF) теперь реализованы как вызовы непрозрачных функций, а не как прямой доступ к члену [`PyObject.ob_refcnt`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyObject.ob_refcnt), если Python собран в режиме отладки и макрос `Py_LIMITED_API` нацелен на Python 3.10 или новее. Поддержка ограниченного C-API в режиме отладки стала возможна благодаря тому, что структура [`PyObject`](https://python-all.ru/3.11/c-api/structures.html#c.PyObject) одинакова в релизном и отладочном режимах начиная с Python 3.8 (см. [bpo-36465](https://python-all.ru/3.11/whatsnew/3.10.html)).11701171  Ограниченный C-API по-прежнему не поддерживается в специальной сборке [`--with-trace-refs`](https://python-all.ru/3.11/using/configure.html#cmdoption-with-trace-refs) (макрос `Py_TRACE_REFS`). (Автор: Victor Stinner в [bpo-43688](https://python-all.ru/3.11/whatsnew/3.10.html).)1172- Добавлена функция [`Py_Is(x, y)`](https://python-all.ru/3.11/c-api/structures.html#c.Py_Is) для проверки, является ли объект *x* тем же объектом *y*, что аналогично `x is y` в Python. Также добавлены функции [`Py_IsNone()`](https://python-all.ru/3.11/c-api/structures.html#c.Py_IsNone), [`Py_IsTrue()`](https://python-all.ru/3.11/c-api/structures.html#c.Py_IsTrue), [`Py_IsFalse()`](https://python-all.ru/3.11/c-api/structures.html#c.Py_IsFalse) для проверки, является ли объект соответственно синглтоном `None`, синглтоном `True` или синглтоном `False`. (Автор: Victor Stinner в [bpo-43753](https://python-all.ru/3.11/whatsnew/3.10.html).)1173- Добавлены новые функции для управления сборщиком мусора из C-кода: [`PyGC_Enable()`](https://python-all.ru/3.11/c-api/gcsupport.html#c.PyGC_Enable), [`PyGC_Disable()`](https://python-all.ru/3.11/c-api/gcsupport.html#c.PyGC_Disable), [`PyGC_IsEnabled()`](https://python-all.ru/3.11/c-api/gcsupport.html#c.PyGC_IsEnabled). Эти функции позволяют активировать, деактивировать и запрашивать состояние сборщика мусора из C-кода без необходимости импорта модуля [`gc`](https://python-all.ru/3.11/library/gc.html#module-gc).1174- Добавлен новый флаг типа [`Py_TPFLAGS_DISALLOW_INSTANTIATION`](https://python-all.ru/3.11/c-api/typeobj.html#c.Py_TPFLAGS_DISALLOW_INSTANTIATION) для запрета создания экземпляров типа. (Автор: Victor Stinner в [bpo-43916](https://python-all.ru/3.11/whatsnew/3.10.html).)1175- Добавлен новый флаг типа [`Py_TPFLAGS_IMMUTABLETYPE`](https://python-all.ru/3.11/c-api/typeobj.html#c.Py_TPFLAGS_IMMUTABLETYPE) для создания неизменяемых объектов типа: атрибуты типа нельзя ни установить, ни удалить. (Авторы: Victor Stinner и Erlend E. Aasland в [bpo-43908](https://python-all.ru/3.11/whatsnew/3.10.html).)11761177### Перенос на Python 3.1011781179- Теперь для использования форматов [`PyArg_ParseTuple()`](https://python-all.ru/3.11/c-api/arg.html#c.PyArg_ParseTuple) и [`Py_BuildValue()`](https://python-all.ru/3.11/c-api/arg.html#c.Py_BuildValue), которые используют `#`, должен быть определён макрос `PY_SSIZE_T_CLEAN`: `es#`, `et#`, `s#`, `u#`, `y#`, `z#`, `U#` и `Z#`. См. [Разбор аргументов и формирование значений](https://python-all.ru/3.11/c-api/arg.html#arg-parsing) и [**PEP 353**](https://python-all.ru/3.11/whatsnew/3.10.html). (Автор: Victor Stinner в [bpo-40943](https://python-all.ru/3.11/whatsnew/3.10.html).)1180- Поскольку [`Py_REFCNT()`](https://python-all.ru/3.11/c-api/structures.html#c.Py_REFCNT) изменена на встраиваемую статическую функцию, `Py_REFCNT(obj) = new_refcnt` должна быть заменена на `Py_SET_REFCNT(obj, new_refcnt)`: см. [`Py_SET_REFCNT()`](https://python-all.ru/3.11/c-api/structures.html#c.Py_SET_REFCNT) (доступно начиная с Python 3.9). Для обратной совместимости может использоваться этот макрос:11811182  ```python1183  #if PY_VERSION_HEX < 0x030900A41184  #  define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0)1185  #endif1186  ```11871188  (Автор: Victor Stinner в [bpo-39573](https://python-all.ru/3.11/whatsnew/3.10.html).)1189- Вызов [`PyDict_GetItem()`](https://python-all.ru/3.11/c-api/dict.html#c.PyDict_GetItem) без удержания [GIL](https://python-all.ru/3.11/glossary.html#term-GIL) ранее допускался по историческим причинам. Теперь это запрещено. (Автор: Victor Stinner в [bpo-40839](https://python-all.ru/3.11/whatsnew/3.10.html).)1190- `PyUnicode_FromUnicode(NULL, size)` и `PyUnicode_FromStringAndSize(NULL, size)` теперь возбуждают `DeprecationWarning`. Для выделения объекта Unicode без начальных данных используйте [`PyUnicode_New()`](https://python-all.ru/3.11/c-api/unicode.html#c.PyUnicode_New). (Автор: Inada Naoki в [bpo-36346](https://python-all.ru/3.11/whatsnew/3.10.html).)1191- Приватная структура `_PyUnicode_Name_CAPI` `unicodedata.ucnhash_CAPI` API PyCapsule перемещена во внутренний C-API. (Автор: Victor Stinner в [bpo-42157](https://python-all.ru/3.11/whatsnew/3.10.html).)1192- Функции [`Py_GetPath()`](https://python-all.ru/3.11/c-api/init.html#c.Py_GetPath), [`Py_GetPrefix()`](https://python-all.ru/3.11/c-api/init.html#c.Py_GetPrefix), [`Py_GetExecPrefix()`](https://python-all.ru/3.11/c-api/init.html#c.Py_GetExecPrefix), [`Py_GetProgramFullPath()`](https://python-all.ru/3.11/c-api/init.html#c.Py_GetProgramFullPath), [`Py_GetPythonHome()`](https://python-all.ru/3.11/c-api/init.html#c.Py_GetPythonHome) и [`Py_GetProgramName()`](https://python-all.ru/3.11/c-api/init.html#c.Py_GetProgramName) теперь возвращают `NULL`, если они вызваны до [`Py_Initialize()`](https://python-all.ru/3.11/c-api/init.html#c.Py_Initialize) (до инициализации Python). Используйте новый API [Начальная конфигурация Python](https://python-all.ru/3.11/c-api/init_config.html#init-config) для получения [Конфигурации путей Python](https://python-all.ru/3.11/c-api/init_config.html#init-path-config). (Автор: Victor Stinner в [bpo-42260](https://python-all.ru/3.11/whatsnew/3.10.html).)1193- Макросы [`PyList_SET_ITEM()`](https://python-all.ru/3.11/c-api/list.html#c.PyList_SET_ITEM), [`PyTuple_SET_ITEM()`](https://python-all.ru/3.11/c-api/tuple.html#c.PyTuple_SET_ITEM) и [`PyCell_SET()`](https://python-all.ru/3.11/c-api/cell.html#c.PyCell_SET) больше нельзя использовать в качестве l-value или r-value. Например, `x = PyList_SET_ITEM(a, b, c)` и `PyList_SET_ITEM(a, b, c) = x` теперь приводят к ошибке компиляции. Это предотвращает ошибки наподобие теста `if (PyList_SET_ITEM (a, b, c) < 0) ...`. (Авторы: Zackery Spytz и Victor Stinner в [bpo-30459](https://python-all.ru/3.11/whatsnew/3.10.html).)1194- Файлы `odictobject.h`, `parser_interface.h`, `picklebufobject.h`, `pyarena.h`, `pyctype.h`, `pydebug.h`, `pyfpe.h` и `pytime.h` (не входящие в ограниченный API) перемещены в каталог `Include/cpython`. Эти файлы не следует включать напрямую, поскольку они уже включены в `Python.h`; см. [Файлы для включения](https://python-all.ru/3.11/c-api/intro.html#api-includes). Если они были включены напрямую, рассмотрите включение `Python.h` вместо этого. (Автор: Nicholas Sim в [bpo-35134](https://python-all.ru/3.11/whatsnew/3.10.html).)1195- Используйте флаг типа [`Py_TPFLAGS_IMMUTABLETYPE`](https://python-all.ru/3.11/c-api/typeobj.html#c.Py_TPFLAGS_IMMUTABLETYPE) для создания неизменяемых объектов типа. Не полагайтесь на [`Py_TPFLAGS_HEAPTYPE`](https://python-all.ru/3.11/c-api/typeobj.html#c.Py_TPFLAGS_HEAPTYPE), чтобы определить, является ли объект типа изменяемым; вместо этого проверяйте, установлен ли [`Py_TPFLAGS_IMMUTABLETYPE`](https://python-all.ru/3.11/c-api/typeobj.html#c.Py_TPFLAGS_IMMUTABLETYPE). (Авторы: Victor Stinner и Erlend E. Aasland в [bpo-43908](https://python-all.ru/3.11/whatsnew/3.10.html).)1196- Незадокументированная функция `Py_FrozenMain` удалена из ограниченного API. Эта функция в основном полезна для пользовательских сборок Python. (Автор: Petr Viktorin в [bpo-26241](https://python-all.ru/3.11/whatsnew/3.10.html).)11971198### Устарело11991200- Функция `PyUnicode_InternImmortal()` теперь устарела и будет удалена в Python 3.12; используйте [`PyUnicode_InternInPlace()`](https://python-all.ru/3.11/c-api/unicode.html#c.PyUnicode_InternInPlace) вместо неё. (Автор: Victor Stinner в [bpo-41692](https://python-all.ru/3.11/whatsnew/3.10.html).)12011202### Удалено12031204- Удалены функции `Py_UNICODE_str*`, работающие со строками `Py_UNICODE*`. (Автор: Inada Naoki в [bpo-41123](https://python-all.ru/3.11/whatsnew/3.10.html).)12051206  - `Py_UNICODE_strlen`: используйте [`PyUnicode_GetLength()`](https://python-all.ru/3.11/c-api/unicode.html#c.PyUnicode_GetLength) или [`PyUnicode_GET_LENGTH`](https://python-all.ru/3.11/c-api/unicode.html#c.PyUnicode_GET_LENGTH)1207  - `Py_UNICODE_strcat`: используйте [`PyUnicode_CopyCharacters()`](https://python-all.ru/3.11/c-api/unicode.html#c.PyUnicode_CopyCharacters) или [`PyUnicode_FromFormat()`](https://python-all.ru/3.11/c-api/unicode.html#c.PyUnicode_FromFormat)1208  - `Py_UNICODE_strcpy`, `Py_UNICODE_strncpy`: используйте [`PyUnicode_CopyCharacters()`](https://python-all.ru/3.11/c-api/unicode.html#c.PyUnicode_CopyCharacters) или [`PyUnicode_Substring()`](https://python-all.ru/3.11/c-api/unicode.html#c.PyUnicode_Substring)1209  - `Py_UNICODE_strcmp`: используйте [`PyUnicode_Compare()`](https://python-all.ru/3.11/c-api/unicode.html#c.PyUnicode_Compare)1210  - `Py_UNICODE_strncmp`: используйте [`PyUnicode_Tailmatch()`](https://python-all.ru/3.11/c-api/unicode.html#c.PyUnicode_Tailmatch)1211  - `Py_UNICODE_strchr`, `Py_UNICODE_strrchr`: используйте [`PyUnicode_FindChar()`](https://python-all.ru/3.11/c-api/unicode.html#c.PyUnicode_FindChar)1212- Удалена `PyUnicode_GetMax()`. Переходите на новые API ([**PEP 393**](https://python-all.ru/3.11/whatsnew/3.10.html)). (Автор: Inada Naoki в [bpo-41103](https://python-all.ru/3.11/whatsnew/3.10.html).)1213- Удалена `PyLong_FromUnicode()`. Переходите на [`PyLong_FromUnicodeObject()`](https://python-all.ru/3.11/c-api/long.html#c.PyLong_FromUnicodeObject). (Автор: Inada Naoki в [bpo-41103](https://python-all.ru/3.11/whatsnew/3.10.html).)1214- Удалено `PyUnicode_AsUnicodeCopy()`. Используйте [`PyUnicode_AsUCS4Copy()`](https://python-all.ru/3.11/c-api/unicode.html#c.PyUnicode_AsUCS4Copy) или [`PyUnicode_AsWideCharString()`](https://python-all.ru/3.11/c-api/unicode.html#c.PyUnicode_AsWideCharString) (Автор: Inada Naoki, [bpo-41103](https://python-all.ru/3.11/whatsnew/3.10.html).)1215- Удалена переменная `_Py_CheckRecursionLimit`: она заменена на `ceval.recursion_limit` структуры [`PyInterpreterState`](https://python-all.ru/3.11/c-api/init.html#c.PyInterpreterState). (Автор: Victor Stinner, [bpo-41834](https://python-all.ru/3.11/whatsnew/3.10.html).)1216- Удалены недокументированные макросы `Py_ALLOW_RECURSION` и `Py_END_ALLOW_RECURSION`, а также поле `recursion_critical` структуры [`PyInterpreterState`](https://python-all.ru/3.11/c-api/init.html#c.PyInterpreterState). (Автор: Serhiy Storchaka, [bpo-41936](https://python-all.ru/3.11/whatsnew/3.10.html).)1217- Удалена недокументированная функция `PyOS_InitInterrupts()`. При инициализации Python уже неявно устанавливает обработчики сигналов: см. [`PyConfig.install_signal_handlers`](https://python-all.ru/3.11/c-api/init_config.html#c.PyConfig.install_signal_handlers). (Автор: Victor Stinner, [bpo-41713](https://python-all.ru/3.11/whatsnew/3.10.html).)1218- Remove the `PyAST_Validate()` function. It is no longer possible to build a AST object (`mod_ty` type) with the public C API. The function was already excluded from the limited C API ([**PEP 384**](https://python-all.ru/3.11/whatsnew/3.10.html)). (Contributed by Victor Stinner in [bpo-43244](https://python-all.ru/3.11/whatsnew/3.10.html).)1219- Удалены заголовочный файл `symtable.h` и недокументированные функции:12201221  - `PyST_GetScope()`1222  - `PySymtable_Build()`1223  - `PySymtable_BuildObject()`1224  - `PySymtable_Free()`1225  - `Py_SymtableString()`1226  - `Py_SymtableStringObject()`12271228  Функция `Py_SymtableString()` по ошибке была частью стабильного ABI, но не могла использоваться, так как заголовочный файл `symtable.h` был исключён из ограниченного C API.12291230  Вместо этого используйте модуль Python [`symtable`](https://python-all.ru/3.11/library/symtable.html#module-symtable). (Автор: Victor Stinner, [bpo-43244](https://python-all.ru/3.11/whatsnew/3.10.html).)1231- Удалён [`PyOS_ReadlineFunctionPointer()`](https://python-all.ru/3.11/c-api/veryhigh.html#c.PyOS_ReadlineFunctionPointer) из заголовков ограниченного C API и из `python3.dll` (библиотеки, предоставляющей стабильный ABI в Windows). Поскольку функция принимает аргумент `FILE*`, её стабильность ABI не может быть гарантирована. (Автор: Petr Viktorin, [bpo-43868](https://python-all.ru/3.11/whatsnew/3.10.html).)1232- Удалены заголовочные файлы `ast.h`, `asdl.h` и `Python-ast.h`. Эти функции были недокументированы и исключены из ограниченного C API. Большинство имён, определённых в этих заголовочных файлах, не имели префикса `Py` и поэтому могли создавать конфликты имён. Например, `Python-ast.h` определял макрос `Yield`, который конфликтовал с именем `Yield`, используемым заголовком Windows `<winbase.h>`. Вместо этого используйте модуль Python [`ast`](https://python-all.ru/3.11/library/ast.html#module-ast). (Автор: Victor Stinner, [bpo-43244](https://python-all.ru/3.11/whatsnew/3.10.html).)1233- Удалены функции компилятора и парсера, использующие тип `struct _mod`, так как публичный C API для AST был удалён:12341235  - `PyAST_Compile()`1236  - `PyAST_CompileEx()`1237  - `PyAST_CompileObject()`1238  - `PyFuture_FromAST()`1239  - `PyFuture_FromASTObject()`1240  - `PyParser_ASTFromFile()`1241  - `PyParser_ASTFromFileObject()`1242  - `PyParser_ASTFromFilename()`1243  - `PyParser_ASTFromString()`1244  - `PyParser_ASTFromStringObject()`12451246  Эти функции были недокументированы и исключены из ограниченного C API. (Автор: Victor Stinner, [bpo-43244](https://python-all.ru/3.11/whatsnew/3.10.html).)1247- Удалён заголовочный файл `pyarena.h` с функциями:12481249  - `PyArena_New()`1250  - `PyArena_Free()`1251  - `PyArena_Malloc()`1252  - `PyArena_AddPyObject()`12531254  Эти функции были недокументированы, исключены из ограниченного C API и использовались только внутри компилятора. (Автор: Victor Stinner, [bpo-43244](https://python-all.ru/3.11/whatsnew/3.10.html).)1255- Элемент `PyThreadState.use_tracing` удалён для оптимизации Python. (Автор: Mark Shannon, [bpo-43760](https://python-all.ru/3.11/whatsnew/3.10.html).)12561257## Важная функция безопасности в 3.10.712581259Преобразование между [`int`](https://python-all.ru/3.11/library/functions.html#int) и [`str`](https://python-all.ru/3.11/library/stdtypes.html#str) в системах счисления, отличных от 2 (двоичной), 4, 8 (восьмеричной), 16 (шестнадцатеричной) или 32, например, по основанию 10 (десятичной), теперь вызывает [`ValueError`](https://python-all.ru/3.11/library/exceptions.html#ValueError), если количество цифр в строковом представлении превышает ограничение для предотвращения потенциальных атак типа «отказ в обслуживании» из-за алгоритмической сложности. Это смягчение для [CVE-2020-10735](https://python-all.ru/3.11/whatsnew/3.10.html). Это ограничение можно настроить или отключить с помощью переменной окружения, флага командной строки или API [`sys`](https://python-all.ru/3.11/library/sys.html#module-sys). См. документацию [«Ограничение длины преобразования целого числа в строку»](https://python-all.ru/3.11/library/stdtypes.html#int-max-str-digits). По умолчанию лимит составляет 4300 цифр в строковом представлении.12601261## Важная функция безопасности в 3.10.812621263Устаревший модуль `mailcap` теперь отказывается внедрять небезопасный текст (имена файлов, MIME-типы, параметры) в команды оболочки. Вместо использования такого текста он выдаст предупреждение и будет действовать так, как если бы совпадение не было найдено (или для тестовых команд, как если бы тест провалился). (Автор: Petr Viktorin, [gh-98966](https://python-all.ru/3.11/whatsnew/3.10.html).)12641265## Важные изменения в 3.10.1212661267### tarfile12681269- Методы извлечения в [`tarfile`](https://python-all.ru/3.11/library/tarfile.html#module-tarfile) и [`shutil.unpack_archive()`](https://python-all.ru/3.11/library/shutil.html#shutil.unpack_archive) получили новый аргумент *filter*, позволяющий ограничивать возможности tar, которые могут быть неожиданными или опасными, например создание файлов за пределами целевого каталога. Подробнее см. [Extraction filters](https://python-all.ru/3.11/library/tarfile.html#tarfile-extraction-filter). В Python 3.12 использование без аргумента *filter* вызовет [`DeprecationWarning`](https://python-all.ru/3.11/library/exceptions.html#DeprecationWarning). В Python 3.14 значение по умолчанию будет изменено на `'data'`. (Автор: Petr Viktorin в [**PEP 706**](https://python-all.ru/3.11/whatsnew/3.10.html).)1270