3.10.md
1> **Источник:** https://python-all.ru/3.10/whatsnew/3.10.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Что нового в Python 3.1089**Версия**10113.10.201213**Дата**141511 марта 20261617**Редактор**1819Pablo Galindo Salgado2021В этой статье описаны новые возможности Python 3.10 по сравнению с 3.9. Python 3.10 был выпущен 4 октября 2021 года. Полную информацию см. в [журнале изменений](https://python-all.ru/3.10/whatsnew/changelog.html#changelog).2223## Итоги – основные изменения2425Новые синтаксические возможности:2627- [**PEP 634**](https://python-all.ru/3.10/whatsnew/3.10.html), Структурное сопоставление с образцом: спецификация28- [**PEP 635**](https://python-all.ru/3.10/whatsnew/3.10.html), Структурное сопоставление с образцом: мотивация и обоснование29- [**PEP 636**](https://python-all.ru/3.10/whatsnew/3.10.html), Структурное сопоставление с образцом: руководство30- [bpo-12782](https://python-all.ru/3.10/whatsnew/3.10.html), теперь официально разрешены контекстные менеджеры в скобках.3132Новые возможности в стандартной библиотеке:3334- [**PEP 618**](https://python-all.ru/3.10/whatsnew/3.10.html), добавление опциональной проверки длины в zip.3536Улучшения интерпретатора:3738- [**PEP 626**](https://python-all.ru/3.10/whatsnew/3.10.html), точные номера строк для отладки и других инструментов.3940Новые возможности типизации:4142- [**PEP 604**](https://python-all.ru/3.10/whatsnew/3.10.html), разрешение записи объединённых типов как X | Y43- [**PEP 612**](https://python-all.ru/3.10/whatsnew/3.10.html), переменные спецификации параметров44- [**PEP 613**](https://python-all.ru/3.10/whatsnew/3.10.html), явные псевдонимы типов45- [**PEP 647**](https://python-all.ru/3.10/whatsnew/3.10.html), пользовательские гарды типов4647Важные устаревания, удаления и ограничения:4849- [**PEP 644**](https://python-all.ru/3.10/whatsnew/3.10.html), требуется OpenSSL 1.1.1 или новее50- [**PEP 632**](https://python-all.ru/3.10/whatsnew/3.10.html), устаревание модуля distutils.51- [**PEP 623**](https://python-all.ru/3.10/whatsnew/3.10.html), устаревание и подготовка к удалению элемента wstr в PyUnicodeObject.52- [**PEP 624**](https://python-all.ru/3.10/whatsnew/3.10.html), удаление API кодировщиков Py\_UNICODE53- [**PEP 597**](https://python-all.ru/3.10/whatsnew/3.10.html), добавление опционального EncodingWarning5455## Новые возможности5657### Контекстные менеджеры в скобках5859Теперь поддерживается использование круглых скобок для переноса на несколько строк в контекстных менеджерах. Это позволяет форматировать длинный набор контекстных менеджеров на нескольких строках аналогично тому, как это было возможно ранее с операторами import. Например, все эти примеры теперь являются допустимыми:6061```python62with (CtxManager() as example):63 ...6465with (66 CtxManager1(),67 CtxManager2()68):69 ...7071with (CtxManager1() as example,72 CtxManager2()):73 ...7475with (CtxManager1(),76 CtxManager2() as example):77 ...7879with (80 CtxManager1() as example1,81 CtxManager2() as example282):83 ...84```8586также можно использовать завершающую запятую в конце заключённой группы:8788```python89with (90 CtxManager1() as example1,91 CtxManager2() as example2,92 CtxManager3() as example3,93):94 ...95```9697Этот новый синтаксис использует не LL(1) возможности нового парсера. Подробнее см. [**PEP 617**](https://python-all.ru/3.10/whatsnew/3.10.html).9899(Авторы: Guido van Rossum, Pablo Galindo и Lysandros Nikolaou в [bpo-12782](https://python-all.ru/3.10/whatsnew/3.10.html) и [bpo-40334](https://python-all.ru/3.10/whatsnew/3.10.html).)100101### Улучшенные сообщения об ошибках102103#### SyntaxErrors104105При разборе кода, содержащего незакрытые скобки или квадратные скобки, интерпретатор теперь указывает местоположение незакрытой скобки вместо отображения *SyntaxError: unexpected EOF while parsing* или указания на некорректное местоположение. Например, рассмотрим следующий код (обратите внимание на незакрытую ‘{‘):106107```python108expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,109 38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6,110some_other_code = foo()111```112113Предыдущие версии интерпретатора сообщали о запутанных местах как о местоположении синтаксической ошибки:114115```python116File "example.py", line 3117 some_other_code = foo()118 ^119SyntaxError: invalid syntax120```121122но в Python 3.10 выводится более информативная ошибка:123124```python125File "example.py", line 1126 expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,127 ^128SyntaxError: '{' was never closed129```130131Аналогично, ошибки, связанные с незакрытыми строковыми литералами (одинарные и тройные кавычки), теперь указывают на начало строки вместо сообщения EOF/EOL.132133Эти улучшения вдохновлены предыдущей работой в интерпретаторе PyPy.134135(Авторы: Pablo Galindo в [bpo-42864](https://python-all.ru/3.10/whatsnew/3.10.html) и Batuhan Taskaya в [bpo-40176](https://python-all.ru/3.10/whatsnew/3.10.html).)136137[`SyntaxError`](https://python-all.ru/3.10/library/exceptions.html#SyntaxError) исключения, вызываемые интерпретатором, теперь будут подсвечивать полный диапазон выражения, которое составляет саму синтаксическую ошибку, а не только место, где обнаружена проблема. Таким образом, вместо отображения (до Python 3.10):138139```python140>>> foo(x, z for z in range(10), t, w)141 File "<stdin>", line 1142 foo(x, z for z in range(10), t, w)143 ^144SyntaxError: Generator expression must be parenthesized145```146147теперь Python 3.10 будет отображать исключение как:148149```python150>>> foo(x, z for z in range(10), t, w)151 File "<stdin>", line 1152 foo(x, z for z in range(10), t, w)153 ^^^^^^^^^^^^^^^^^^^^154SyntaxError: Generator expression must be parenthesized155```156157Это улучшение было предложено Пабло Галиндо в [bpo-43914](https://python-all.ru/3.10/whatsnew/3.10.html).158159Добавлено значительное количество новых специализированных сообщений для исключений [`SyntaxError`](https://python-all.ru/3.10/library/exceptions.html#SyntaxError). Наиболее примечательные из них:160161- Пропущен `:` перед блоками:162163 > ```python164 > >>> if rocket.position > event_horizon165 > File "<stdin>", line 1166 > if rocket.position > event_horizon167 > ^168 > SyntaxError: expected ':'169 > ```170 >171 > (Предложено Пабло Галиндо в [bpo-42997](https://python-all.ru/3.10/whatsnew/3.10.html).)172- Кортежи без скобок в целях (targets) генераторов:173174 > ```python175 > >>> {x,y for x,y in zip('abcd', '1234')}176 > File "<stdin>", line 1177 > {x,y for x,y in zip('abcd', '1234')}178 > ^179 > SyntaxError: did you forget parentheses around the comprehension target?180 > ```181 >182 > (Предложено Пабло Галиндо в [bpo-43017](https://python-all.ru/3.10/whatsnew/3.10.html).)183- Отсутствуют запятые в литералах коллекций и между выражениями:184185 > ```python186 > >>> items = {187 > ... x: 1,188 > ... y: 2189 > ... z: 3,190 > File "<stdin>", line 3191 > y: 2192 > ^193 > SyntaxError: invalid syntax. Perhaps you forgot a comma?194 > ```195 >196 > (Предложено Пабло Галиндо в [bpo-43822](https://python-all.ru/3.10/whatsnew/3.10.html).)197- Несколько типов исключений без скобок:198199 > ```python200 > >>> try:201 > ... build_dyson_sphere()202 > ... except NotEnoughScienceError, NotEnoughResourcesError:203 > File "<stdin>", line 3204 > except NotEnoughScienceError, NotEnoughResourcesError:205 > ^206 > SyntaxError: multiple exception types must be parenthesized207 > ```208 >209 > (Предложено Пабло Галиндо в [bpo-43149](https://python-all.ru/3.10/whatsnew/3.10.html).)210- Отсутствуют `:` и значения в литералах словарей:211212 > ```python213 > >>> values = {214 > ... x: 1,215 > ... y: 2,216 > ... z:217 > ... }218 > File "<stdin>", line 4219 > z:220 > ^221 > SyntaxError: expression expected after dictionary key and ':'222 >223 > >>> values = {x:1, y:2, z w:3}224 > File "<stdin>", line 1225 > values = {x:1, y:2, z w:3}226 > ^227 > SyntaxError: ':' expected after dictionary key228 > ```229 >230 > (Предложено Пабло Галиндо в [bpo-43823](https://python-all.ru/3.10/whatsnew/3.10.html).)231- Блоки `try` без блоков `except` или `finally`:232233 > ```python234 > >>> try:235 > ... x = 2236 > ... something = 3237 > File "<stdin>", line 3238 > something = 3239 > ^^^^^^^^^240 > SyntaxError: expected 'except' or 'finally' block241 > ```242 >243 > (Предложено Пабло Галиндо в [bpo-44305](https://python-all.ru/3.10/whatsnew/3.10.html).)244- Использование `=` вместо `==` в сравнениях:245246 > ```python247 > >>> if rocket.position = event_horizon:248 > File "<stdin>", line 1249 > if rocket.position = event_horizon:250 > ^251 > SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?252 > ```253 >254 > (Предложено Пабло Галиндо в [bpo-43797](https://python-all.ru/3.10/whatsnew/3.10.html).)255- Использование `*` в f-строках:256257 > ```python258 > >>> f"Black holes {*all_black_holes} and revelations"259 > File "<stdin>", line 1260 > (*all_black_holes)261 > ^262 > SyntaxError: f-string: cannot use starred expression here263 > ```264 >265 > (Предложено Пабло Галиндо в [bpo-41064](https://python-all.ru/3.10/whatsnew/3.10.html).)266267#### IndentationErrors268269Многие исключения [`IndentationError`](https://python-all.ru/3.10/library/exceptions.html#IndentationError) теперь содержат больше контекста о том, какой блок ожидал отступа, включая местоположение инструкции:270271```python272>>> def foo():273... if lel:274... x = 2275 File "<stdin>", line 3276 x = 2277 ^278IndentationError: expected an indented block after 'if' statement in line 2279```280281#### AttributeErrors282283При выводе [`AttributeError`](https://python-all.ru/3.10/library/exceptions.html#AttributeError), `PyErr_Display()` будет предлагать имена похожих атрибутов в объекте, в котором возникло исключение:284285```python286>>> collections.namedtoplo287Traceback (most recent call last):288 File "<stdin>", line 1, in <module>289AttributeError: module 'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?290```291292(Предложено Пабло Галиндо в [bpo-38530](https://python-all.ru/3.10/whatsnew/3.10.html).)293294> > **Предупреждение**295> >296> > Обратите внимание: это не будет работать, если `PyErr_Display()` не вызывается для отображения ошибки что может произойти, если используется другая пользовательская функция отображения ошибок. Это обычная ситуация в некоторых интерактивных оболочках, например IPython.297298#### NameErrors299300При выводе [`NameError`](https://python-all.ru/3.10/library/exceptions.html#NameError), вызванного интерпретатором, `PyErr_Display()` будет предлагать имена похожих переменных в функции, в которой возникло исключение:301302```python303>>> schwarzschild_black_hole = None304>>> schwarschild_black_hole305Traceback (most recent call last):306 File "<stdin>", line 1, in <module>307NameError: name 'schwarschild_black_hole' is not defined. Did you mean: schwarzschild_black_hole?308```309310(Предложено Пабло Галиндо в [bpo-38530](https://python-all.ru/3.10/whatsnew/3.10.html).)311312> > **Предупреждение**313> >314> > Обратите внимание: это не будет работать, если `PyErr_Display()` не вызывается для отображения ошибки, что может произойти, если используется другая пользовательская функция отображения ошибок. Это обычная ситуация в некоторых интерактивных оболочках, например IPython.315316### PEP 626: Точные номера строк для отладки и других инструментов317318PEP 626 привносит более точные и надёжные номера строк для инструментов отладки, профилирования и покрытия кода. События трассировки с правильным номером строки генерируются для всех выполняемых строк кода и только для выполняемых строк кода.319320Атрибут `f_lineno` объектов фреймов всегда будет содержать ожидаемый номер строки.321322Атрибут `co_lnotab` объектов кода устарел и будет удалён в 3.12. Коду, которому нужно преобразовывать смещение в номер строки, следует вместо этого использовать новый метод `co_lines()`.323324### PEP 634: Структурное сопоставление с образцом325326Структурное сопоставление с образцом было добавлено в виде *оператора match* и *операторов case* с шаблонами и связанными с ними действиями. Шаблоны состоят из последовательностей, отображений, примитивных типов данных, а также экземпляров классов. Сопоставление с образцом позволяет программам извлекать информацию из сложных типов данных, выполнять ветвление на основе структуры данных и применять конкретные действия в зависимости от формы данных.327328#### Синтаксис и операции329330Общий синтаксис сопоставления с образцом:331332```python333match subject:334 case <pattern_1>:335 <action_1>336 case <pattern_2>:337 <action_2>338 case <pattern_3>:339 <action_3>340 case _:341 <action_wildcard>342```343344Оператор match принимает выражение и сравнивает его значение с последовательными шаблонами, заданными в виде одного или нескольких блоков case. В частности, сопоставление с образцом работает следующим образом:345346> 1. используя данные с типом и формой (`subject`)347> 2. вычисляя `subject` в операторе `match`348> 3. сравнивая проверяемое значение с каждым шаблоном в операторе `case` сверху вниз до подтверждения совпадения.349> 4. выполняя действие, связанное с шаблоном подтверждённого совпадения350> 5. Если точное совпадение не подтверждено, последний оператор case, универсальный шаблон `_`, если он предусмотрен, будет использован как совпадающий. Если точное совпадение не подтверждено и универсальный шаблон отсутствует, весь блок match ничего не делает (no-op).351352#### Декларативный подход353354Читатели могут быть знакомы с сопоставлением с образцом по простому примеру сопоставления выражения (объекта данных) с литералом (шаблоном) с помощью оператора switch в C, Java или JavaScript (и многих других языках). Часто оператор switch используется для сравнения объекта/выражения с операторами case, содержащими литералы.355356Более мощные примеры сопоставления с образцом можно найти в таких языках, как Scala и Elixir. При структурном сопоставлении с образцом подход является «декларативным» и явно задаёт условия (шаблоны), которым должны соответствовать данные.357358Хотя «императивный» набор инструкций с вложенными операторами «if» можно использовать для достижения чего-то похожего на структурное сопоставление с образцом, он менее понятен, чем «декларативный» подход. Вместо этого «декларативный» подход задаёт условия для совпадения и более читаем благодаря явным шаблонам. Хотя структурное сопоставление с образцом можно использовать в его простейшей форме – сравнение переменной с литералом в операторе case, его истинная ценность для Python заключается в обработке типа и формы проверяемого значения.359360#### Простой шаблон: сопоставление с литералом361362Рассмотрим этот пример как сопоставление с образцом в его простейшей форме: значение (проверяемое выражение) сопоставляется с несколькими литералами (шаблонами). В примере ниже `status` является проверяемым выражением оператора match. Шаблонами являются каждый из операторов case, где литералы представляют коды статуса запроса. Связанное с оператором case действие выполняется после совпадения:363364```python365def http_error(status):366 match status:367 case 400:368 return "Bad request"369 case 404:370 return "Not found"371 case 418:372 return "I'm a teapot"373 case _:374 return "Something's wrong with the internet"375```376377Если в указанную выше функцию передано `status` со значением 418, возвращается «I’m a teapot». Если передано `status` со значением 500, оператор case с `_` совпадёт как универсальный шаблон, и будет возвращено «Something’s wrong with the internet». Обратите внимание на последний блок: имя переменной `_` действует как *универсальный шаблон* и гарантирует, что проверяемое значение всегда совпадёт. Использование `_` необязательно.378379Можно объединить несколько литералов в одном шаблоне с помощью `|` («или»):380381```python382case 401 | 403 | 404:383 return "Not allowed"384```385386##### Поведение без универсального шаблона387388Если изменить предыдущий пример, удалив последний блок case, пример станет таким:389390```python391def http_error(status):392 match status:393 case 400:394 return "Bad request"395 case 404:396 return "Not found"397 case 418:398 return "I'm a teapot"399```400401Без использования `_` в операторе case совпадения может не быть. Если совпадения нет, поведение – пустая операция (no-op). Например, если передано `status` со значением 500, ничего не происходит.402403#### Шаблоны с литералом и переменной404405Шаблоны могут выглядеть как распаковка в присваивании, и шаблон может использоваться для связывания переменных. В этом примере точка данных может быть распакована на её x-координату и y-координату:406407```python408# point – это кортеж (x, y)409match point:410 case (0, 0):411 print("Origin")412 case (0, y):413 print(f"Y={y}")414 case (x, 0):415 print(f"X={x}")416 case (x, y):417 print(f"X={x}, Y={y}")418 case _:419 raise ValueError("Not a point")420```421422Первый шаблон содержит два литерала, `(0, 0)`, и может рассматриваться как расширение шаблона-литерала, показанного выше. Следующие два шаблона объединяют литерал и переменную, и переменная *связывает* значение из проверяемого выражения (`point`). Четвёртый шаблон захватывает два значения, что делает его концептуально похожим на распаковывающее присваивание `(x, y) = point`.423424#### Шаблоны и классы425426Если для структурирования данных используются классы, в качестве шаблона можно использовать имя класса, за которым следует список аргументов, напоминающий конструктор. Этот шаблон позволяет захватывать атрибуты класса в переменные:427428```python429class Point:430 x: int431 y: int432433def location(point):434 match point:435 case Point(x=0, y=0):436 print("Origin is the point's location.")437 case Point(x=0, y=y):438 print(f"Y={y} and the point is on the y-axis.")439 case Point(x=x, y=0):440 print(f"X={x} and the point is on the x-axis.")441 case Point():442 print("The point is located somewhere else on the plane.")443 case _:444 print("Not a point")445```446447##### Шаблоны с позиционными параметрами448449Вы можете использовать позиционные параметры с некоторыми встроенными классами, которые предоставляют упорядочивание для своих атрибутов (например, dataclasses). Вы также можете определить конкретную позицию для атрибутов в шаблонах, задав специальный атрибут `__match_args__` в своих классах. Если он установлен в (“x”, “y”), следующие шаблоны все эквивалентны (и все связывают атрибут `y` с переменной `var`):450451```python452Point(1, var)453Point(1, y=var)454Point(x=1, y=var)455Point(y=var, x=1)456```457458#### Вложенные шаблоны459460Шаблоны могут быть произвольно вложенными. Например, если наши данные – короткий список точек, их можно сопоставить следующим образом:461462```python463match points:464 case []:465 print("No points in the list.")466 case [Point(0, 0)]:467 print("The origin is the only point in the list.")468 case [Point(x, y)]:469 print(f"A single point {x}, {y} is in the list.")470 case [Point(0, y1), Point(0, y2)]:471 print(f"Two points on the Y axis at {y1}, {y2} are in the list.")472 case _:473 print("Something else is found in the list.")474```475476#### Сложные шаблоны и универсальный шаблон477478До этого момента в примерах использовался `_` отдельно в последнем операторе case. Универсальный шаблон можно использовать в более сложных шаблонах, например `('error', code, _)`. Например:479480```python481match test_variable:482 case ('warning', code, 40):483 print("A warning has been received.")484 case ('error', code, _):485 print(f"An error {code} occurred.")486```487488В приведённом выше случае `test_variable` будет соответствовать (‘error’, code, 100) и (‘error’, code, 800).489490#### Ограничитель491492К шаблону можно добавить предложение `if`, известное как «страж». Если страж ложен, `match` переходит к следующему блоку case. Обратите внимание, что захват значения происходит до вычисления стража:493494```python495match point:496 case Point(x, y) if x == y:497 print(f"The point is located on the diagonal Y=X at {x}.")498 case Point(x, y):499 print(f"Point is not on the diagonal.")500```501502#### Другие ключевые особенности503504Несколько других важных возможностей:505506- Как и при распаковке присваиваний, шаблоны кортежей и списков имеют одинаковый смысл и по сути сопоставляются с произвольными последовательностями. Технически субъект должен быть последовательностью. Поэтому важное исключение: шаблоны не сопоставляются с итераторами. Кроме того, чтобы избежать распространённой ошибки, шаблоны последовательностей не сопоставляются со строками.507- Шаблоны последовательностей поддерживают подстановочные знаки: `[x, y, *rest]` и `(x, y, *rest)` работают аналогично подстановочным знакам при распаковке присваиваний. Имя после `*` также может быть `_`, поэтому `(x, y, *_)` сопоставляется с последовательностью из не менее двух элементов без привязки остальных элементов.508- Шаблоны отображений: `{"bandwidth": b, "latency": l}` захватывает значения `"bandwidth"` и `"latency"` из словаря. В отличие от шаблонов последовательностей, лишние ключи игнорируются. Также поддерживается подстановочный знак `**rest`. (Но `**_` был бы избыточным, поэтому не допускается.)509- Подшаблоны могут быть захвачены с помощью ключевого слова `as`:510511 ```python512 case (Point(x1, y1), Point(x2, y2) as p2): ...513 ```514515 Это связывает x1, y1, x2, y2, как и ожидалось, без пункта `as`, а p2 – со всем вторым элементом субъекта.516- Большинство литералов сравниваются по равенству. Однако синглтоны `True`, `False` и `None` сравниваются по идентичности.517- Именованные константы можно использовать в шаблонах. Они должны быть точечными именами, чтобы константа не интерпретировалась как переменная захвата:518519 ```python520 from enum import Enum521 class Color(Enum):522 RED = 0523 GREEN = 1524 BLUE = 2525526 match color:527 case Color.RED:528 print("I see red!")529 case Color.GREEN:530 print("Grass is green")531 case Color.BLUE:532 print("I'm feeling the blues :(")533 ```534535Полную спецификацию см. в [**PEP 634**](https://python-all.ru/3.10/whatsnew/3.10.html). Мотивация и обоснование находятся в [**PEP 635**](https://python-all.ru/3.10/whatsnew/3.10.html), а более подробное руководство – в [**PEP 636**](https://python-all.ru/3.10/whatsnew/3.10.html).536537### Опциональные `EncodingWarning` и `encoding="locale"` параметры538539Кодировка по умолчанию для `TextIOWrapper` и [`open()`](https://python-all.ru/3.10/library/functions.html#open) зависит от платформы и локали. Поскольку UTF-8 используется на большинстве платформ Unix, опускание параметра `encoding` при открытии файлов в UTF-8 (например, JSON, YAML, TOML, Markdown) является очень распространённой ошибкой. Например:540541```python542# ОШИБКА: следует использовать режим "rb" или encoding="utf-8".543with open("data.json") as f:544 data = json.load(f)545```546547Для обнаружения такой ошибки добавлен опциональный `EncodingWarning`. Он выдаётся, когда [`sys.flags.warn_default_encoding`](https://python-all.ru/3.10/library/sys.html#sys.flags) истинно и используется кодировка по умолчанию, зависящая от локали.548549Параметр `-X warn_default_encoding` и [`PYTHONWARNDEFAULTENCODING`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONWARNDEFAULTENCODING) добавлены для включения предупреждения.550551См. [Кодировка текста](https://python-all.ru/3.10/library/io.html#io-text-encoding) для получения дополнительной информации.552553## Новые возможности, связанные с аннотациями типов554555Этот раздел охватывает основные изменения, затрагивающие [**PEP 484**](https://python-all.ru/3.10/whatsnew/3.10.html) подсказки типов и модуль [`typing`](https://python-all.ru/3.10/library/typing.html#module-typing).556557### PEP 604: Новый оператор объединения типов558559Был введён новый оператор объединения типов, который позволяет использовать синтаксис `X | Y`. Это даёт более чистый способ выразить «тип X или тип Y» вместо использования [`typing.Union`](https://python-all.ru/3.10/library/typing.html#typing.Union), особенно в аннотациях типов.560561В предыдущих версиях Python для аннотации типов функций, принимающих аргументы нескольких типов, использовался [`typing.Union`](https://python-all.ru/3.10/library/typing.html#typing.Union):562563```python564def square(number: Union[int, float]) -> Union[int, float]:565 return number ** 2566```567568Теперь аннотации типов можно писать более кратко:569570```python571def square(number: int | float) -> int | float:572 return number ** 2573```574575Этот новый синтаксис также принимается в качестве второго аргумента для [`isinstance()`](https://python-all.ru/3.10/library/functions.html#isinstance) и [`issubclass()`](https://python-all.ru/3.10/library/functions.html#issubclass):576577```python578>>> isinstance(1, int | str)579True580```581582См. [Union Type](https://python-all.ru/3.10/library/stdtypes.html#types-union) и [**PEP 604**](https://python-all.ru/3.10/whatsnew/3.10.html) для получения дополнительной информации.583584(Авторы: Maggie Moss и Philippe Prados в [bpo-41428](https://python-all.ru/3.10/whatsnew/3.10.html), с дополнениями от Yurii Karabas и Serhiy Storchaka в [bpo-44490](https://python-all.ru/3.10/whatsnew/3.10.html).)585586### PEP 612: Переменные спецификации параметров587588В модуль [`typing`](https://python-all.ru/3.10/library/typing.html#module-typing) добавлены два новых параметра, улучшающих информацию, предоставляемую статическим анализаторам типов для [**PEP 484**](https://python-all.ru/3.10/whatsnew/3.10.html)'s `Callable`.589590Первая – это переменная спецификации параметров. Она используется для передачи типов параметров одного вызываемого объекта другому – шаблон, часто встречающийся в функциях высшего порядка и декораторах. Примеры использования можно найти в [`typing.ParamSpec`](https://python-all.ru/3.10/library/typing.html#typing.ParamSpec). Ранее не было простого способа аннотировать зависимость типов параметров с такой точностью.591592Второй вариант – новый оператор `Concatenate`. Он используется вместе с переменными спецификации параметров для аннотации типов вызываемого объекта высшего порядка, который добавляет или удаляет параметры другого вызываемого объекта. Примеры использования можно найти в [`typing.Concatenate`](https://python-all.ru/3.10/library/typing.html#typing.Concatenate).593594См. [`typing.Callable`](https://python-all.ru/3.10/library/typing.html#typing.Callable), [`typing.ParamSpec`](https://python-all.ru/3.10/library/typing.html#typing.ParamSpec), [`typing.Concatenate`](https://python-all.ru/3.10/library/typing.html#typing.Concatenate), [`typing.ParamSpecArgs`](https://python-all.ru/3.10/library/typing.html#typing.ParamSpecArgs), [`typing.ParamSpecKwargs`](https://python-all.ru/3.10/library/typing.html#typing.ParamSpecKwargs) и [**PEP 612**](https://python-all.ru/3.10/whatsnew/3.10.html) для получения дополнительной информации.595596(Автор: Ken Jin в [bpo-41559](https://python-all.ru/3.10/whatsnew/3.10.html), с небольшими улучшениями от Jelle Zijlstra в [bpo-43783](https://python-all.ru/3.10/whatsnew/3.10.html). PEP написан Mark Mendoza.)597598### PEP 613: TypeAlias599600[**PEP 484**](https://python-all.ru/3.10/whatsnew/3.10.html) ввёл понятие псевдонимов типов, требуя лишь, чтобы они были присваиваниями верхнего уровня без аннотаций. Эта простота иногда затрудняла для анализаторов типов различие между псевдонимами типов и обычными присваиваниями, особенно когда были задействованы опережающие ссылки или недопустимые типы. Сравните:601602```python603StrCache = 'Cache[str]' # псевдоним типа604LOG_PREFIX = 'LOG[DEBUG]' # константа модуля605```606607Теперь в модуле [`typing`](https://python-all.ru/3.10/library/typing.html#module-typing) есть специальное значение `TypeAlias`, которое позволяет объявлять псевдонимы типов более явно:608609```python610StrCache: TypeAlias = 'Cache[str]' # псевдоним типа611LOG_PREFIX = 'LOG[DEBUG]' # константа модуля612```613614См. [**PEP 613**](https://python-all.ru/3.10/whatsnew/3.10.html) для получения дополнительных сведений.615616(Автор: Mikhail Golubev в [bpo-41923](https://python-all.ru/3.10/whatsnew/3.10.html).)617618### PEP 647: Определяемые пользователем стражники типов619620`TypeGuard` добавлен в модуль [`typing`](https://python-all.ru/3.10/library/typing.html#module-typing) для аннотирования функций-ограничителей типа и улучшения информации, предоставляемой статическим проверяльщикам типов при сужении типа. Дополнительную информацию см. в документации `TypeGuard` и [**PEP 647**](https://python-all.ru/3.10/whatsnew/3.10.html).621622(Авторы: Ken Jin и Guido van Rossum в [bpo-43766](https://python-all.ru/3.10/whatsnew/3.10.html). Автор PEP: Eric Traut.)623624## Прочие изменения языка625626- Тип [`int`](https://python-all.ru/3.10/library/functions.html#int) получил новый метод [`int.bit_count()`](https://python-all.ru/3.10/library/stdtypes.html#int.bit_count), который возвращает количество единиц в двоичном представлении целого числа, также известное как число единиц (population count). (Автор: Niklas Fiekas в [bpo-29882](https://python-all.ru/3.10/whatsnew/3.10.html).)627- Представления, возвращаемые [`dict.keys()`](https://python-all.ru/3.10/library/stdtypes.html#dict.keys), [`dict.values()`](https://python-all.ru/3.10/library/stdtypes.html#dict.values) и [`dict.items()`](https://python-all.ru/3.10/library/stdtypes.html#dict.items), теперь все имеют атрибут `mapping`, предоставляющий объект [`types.MappingProxyType`](https://python-all.ru/3.10/library/types.html#types.MappingProxyType), оборачивающий исходный словарь. (Автор: Dennis Sweeney в [bpo-40890](https://python-all.ru/3.10/whatsnew/3.10.html).)628- [**PEP 618**](https://python-all.ru/3.10/whatsnew/3.10.html): функция [`zip()`](https://python-all.ru/3.10/library/functions.html#zip) теперь имеет необязательный флаг `strict`, используемый для требования, чтобы все итерируемые объекты имели одинаковую длину.629- Встроенные функции и функции расширений, принимающие целочисленные аргументы, больше не принимают [`Decimal`](https://python-all.ru/3.10/library/decimal.html#decimal.Decimal), [`Fraction`](https://python-all.ru/3.10/library/fractions.html#fractions.Fraction) и другие объекты, которые могут быть преобразованы в целые числа только с потерей (например, имеющие метод [`__int__()`](https://python-all.ru/3.10/reference/datamodel.html#object.__int__), но не имеющие метода [`__index__()`](https://python-all.ru/3.10/reference/datamodel.html#object.__index__)). (Автор: Serhiy Storchaka в [bpo-37999](https://python-all.ru/3.10/whatsnew/3.10.html).)630- Если [`object.__ipow__()`](https://python-all.ru/3.10/reference/datamodel.html#object.__ipow__) возвращает [`NotImplemented`](https://python-all.ru/3.10/library/constants.html#NotImplemented), оператор будет корректно возвращаться к [`object.__pow__()`](https://python-all.ru/3.10/reference/datamodel.html#object.__pow__) и [`object.__rpow__()`](https://python-all.ru/3.10/reference/datamodel.html#object.__rpow__), как и ожидается. (Автор: Alex Shkop в [bpo-38302](https://python-all.ru/3.10/whatsnew/3.10.html).)631- Присваивающие выражения теперь можно использовать без скобок внутри литералов множеств и включений множеств, а также в индексах последовательностей (но не в срезах).632- Функции получили новый атрибут `__builtins__`, который используется для поиска встроенных символов при выполнении функции, вместо поиска в `__globals__['__builtins__']`. Атрибут инициализируется из `__globals__["__builtins__"]`, если он существует, иначе из текущих встроенных объектов. (Автор: Mark Shannon в [bpo-42990](https://python-all.ru/3.10/whatsnew/3.10.html).)633- Две новые встроенные функции – [`aiter()`](https://python-all.ru/3.10/library/functions.html#aiter) и [`anext()`](https://python-all.ru/3.10/library/functions.html#anext) были добавлены для предоставления асинхронных аналогов [`iter()`](https://python-all.ru/3.10/library/functions.html#iter) и [`next()`](https://python-all.ru/3.10/library/functions.html#next) соответственно. (Авторы: Joshua Bronson, Daniel Pope и Justin Wang в [bpo-31861](https://python-all.ru/3.10/whatsnew/3.10.html).)634- Статические методы ([`@staticmethod`](https://python-all.ru/3.10/library/functions.html#staticmethod)) и методы классов ([`@classmethod`](https://python-all.ru/3.10/library/functions.html#classmethod)) теперь наследуют атрибуты методов (`__module__`, `__name__`, `__qualname__`, `__doc__`, `__annotations__`) и имеют новый атрибут `__wrapped__`. Более того, статические методы теперь можно вызывать как обычные функции. (Автор: Victor Stinner в [bpo-43682](https://python-all.ru/3.10/whatsnew/3.10.html).)635- Аннотации для сложных целей (всё, кроме целей `simple name`, заданных [**PEP 526**](https://python-all.ru/3.10/whatsnew/3.10.html)) больше не вызывают никаких эффектов во время выполнения при `from __future__ import annotations`. (Автор: Batuhan Taskaya в [bpo-42737](https://python-all.ru/3.10/whatsnew/3.10.html).)636- Объекты классов и модулей теперь лениво создают пустые словари аннотаций по требованию. Словари аннотаций хранятся в `__dict__` объекта для обратной совместимости. Это улучшает лучшие практики работы с `__annotations__`; для получения дополнительной информации см. [Annotations Best Practices](https://python-all.ru/3.10/howto/annotations.html#annotations-howto). (Автор: Larry Hastings в [bpo-43901](https://python-all.ru/3.10/whatsnew/3.10.html).)637- Аннотации, состоящие из `yield`, `yield from`, `await` или именованных выражений, теперь запрещены при `from __future__ import annotations` из-за их побочных эффектов. (Автор: Batuhan Taskaya в [bpo-42725](https://python-all.ru/3.10/whatsnew/3.10.html).)638- Использование несвязанных переменных, `super()` и других выражений, которые могут изменить обработку таблицы символов в качестве аннотаций, теперь не имеет эффекта при `from __future__ import annotations`. (Автор: Batuhan Taskaya в [bpo-42725](https://python-all.ru/3.10/whatsnew/3.10.html).)639- Хеши значений NaN как типа [`float`](https://python-all.ru/3.10/library/functions.html#float), так и типа [`decimal.Decimal`](https://python-all.ru/3.10/library/decimal.html#decimal.Decimal) теперь зависят от идентичности объекта. Раньше они всегда хешировались в `0`, несмотря на то что значения NaN не равны друг другу. Это приводило к потенциально квадратичному поведению во время выполнения из-за чрезмерных коллизий хешей при создании словарей и множеств, содержащих несколько NaN. (Автор: Raymond Hettinger в [bpo-43475](https://python-all.ru/3.10/whatsnew/3.10.html).)640- При удалении константы [`__debug__`](https://python-all.ru/3.10/library/constants.html#debug__) будет возбуждаться [`SyntaxError`](https://python-all.ru/3.10/library/exceptions.html#SyntaxError) (вместо [`NameError`](https://python-all.ru/3.10/library/exceptions.html#NameError)). (Автор: Dong-hee Na, [bpo-45000](https://python-all.ru/3.10/whatsnew/3.10.html).)641- Исключения [`SyntaxError`](https://python-all.ru/3.10/library/exceptions.html#SyntaxError) теперь имеют атрибуты `end_lineno` и `end_offset`. Они будут равны `None`, если не определены. (Автор: Pablo Galindo в [bpo-43914](https://python-all.ru/3.10/whatsnew/3.10.html).)642643## Новые модули644645- Пока нет.646647## Улучшенные модули648649### asyncio650651Добавлен отсутствующий метод `connect_accepted_socket()`. (Автор: Alex Grönholm в [bpo-41332](https://python-all.ru/3.10/whatsnew/3.10.html).)652653### argparse654655Вводящая в заблуждение фраза «optional arguments» была заменена на «options» в справке argparse. Некоторым тестам может потребоваться адаптация, если они полагаются на точное совпадение вывода. (Автор: Raymond Hettinger в [bpo-9694](https://python-all.ru/3.10/whatsnew/3.10.html).)656657### array658659Метод [`index()`](https://python-all.ru/3.10/library/array.html#array.array.index) у [`array.array`](https://python-all.ru/3.10/library/array.html#array.array) теперь имеет необязательные параметры *start* и *stop*. (Авторы: Anders Lorentsen и Zackery Spytz в [bpo-31956](https://python-all.ru/3.10/whatsnew/3.10.html).)660661### asynchat, asyncore, smtpd662663Эти модули были отмечены как устаревшие в своей документации, начиная с Python 3.6. Теперь во все три модуля добавлено [`DeprecationWarning`](https://python-all.ru/3.10/library/exceptions.html#DeprecationWarning) во время импорта.664665### base64666667Добавлены [`base64.b32hexencode()`](https://python-all.ru/3.10/library/base64.html#base64.b32hexencode) и [`base64.b32hexdecode()`](https://python-all.ru/3.10/library/base64.html#base64.b32hexdecode) для поддержки кодирования Base32 с расширенным шестнадцатеричным алфавитом.668669### bdb670671Добавлена `clearBreakpoints()` для сброса всех установленных точек останова. (Предложено Ирит Катриэлем в [bpo-24160](https://python-all.ru/3.10/whatsnew/3.10.html).)672673### bisect674675Добавлена возможность указания функции *key* в API модуля [`bisect`](https://python-all.ru/3.10/library/bisect.html#module-bisect). (Предложено Рэймондом Хеттингером в [bpo-4356](https://python-all.ru/3.10/whatsnew/3.10.html).)676677### codecs678679Добавлена функция [`codecs.unregister()`](https://python-all.ru/3.10/library/codecs.html#codecs.unregister) для отмены регистрации функции поиска кодеков. (Предложено Хай Ши в [bpo-41842](https://python-all.ru/3.10/whatsnew/3.10.html).)680681### collections.abc682683`__args__` у [параметризованных обобщённых типов](https://python-all.ru/3.10/library/stdtypes.html#types-genericalias) для [`collections.abc.Callable`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Callable) теперь согласованы с [`typing.Callable`](https://python-all.ru/3.10/library/typing.html#typing.Callable). [`collections.abc.Callable`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Callable) обобщённый тип теперь упрощает параметры типа, аналогично tому, что делает [`typing.Callable`](https://python-all.ru/3.10/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.10/library/types.html#types.GenericAlias) теперь может быть подклассом, и при индексировании типа [`collections.abc.Callable`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Callable) будет возвращаться подкласс. Обратите внимание, что может возникать [`TypeError`](https://python-all.ru/3.10/library/exceptions.html#TypeError) для некорректных форм параметризации [`collections.abc.Callable`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Callable), которые в Python 3.9 могли проходить молча. (Предложено Кеном Джином в [bpo-42195](https://python-all.ru/3.10/whatsnew/3.10.html).)684685### contextlib686687Добавлен менеджер контекста [`contextlib.aclosing()`](https://python-all.ru/3.10/library/contextlib.html#contextlib.aclosing) для безопасного закрытия асинхронных генераторов и объектов, представляющих асинхронно освобождаемые ресурсы. (Предложено Джунги Кимом и Джоном Бельмонте в [bpo-41229](https://python-all.ru/3.10/whatsnew/3.10.html).)688689Добавлена поддержка асинхронного менеджера контекста для [`contextlib.nullcontext()`](https://python-all.ru/3.10/library/contextlib.html#contextlib.nullcontext). (Предложено Томом Грингаузом в [bpo-41543](https://python-all.ru/3.10/whatsnew/3.10.html).)690691Добавлен `AsyncContextDecorator` для поддержки использования асинхронных контекстных менеджеров в качестве декораторов.692693### curses694695Расширенные функции цвета, добавленные в ncurses 6.1, будут прозрачно использоваться [`curses.color_content()`](https://python-all.ru/3.10/library/curses.html#curses.color_content), [`curses.init_color()`](https://python-all.ru/3.10/library/curses.html#curses.init_color), [`curses.init_pair()`](https://python-all.ru/3.10/library/curses.html#curses.init_pair) и [`curses.pair_content()`](https://python-all.ru/3.10/library/curses.html#curses.pair_content). Новая функция [`curses.has_extended_color_support()`](https://python-all.ru/3.10/library/curses.html#curses.has_extended_color_support) указывает, поддерживаются ли расширенные цвета базовой библиотекой ncurses. (Предложено Джеффри Кинчером и Хансом Петтером Янссоном в [bpo-36982](https://python-all.ru/3.10/whatsnew/3.10.html).)696697Константы `BUTTON5_*` теперь доступны в модуле [`curses`](https://python-all.ru/3.10/library/curses.html#module-curses), если они предоставляются базовой библиотекой curses. (Предложено Закери Спайтцем в [bpo-39273](https://python-all.ru/3.10/whatsnew/3.10.html).)698699### dataclasses700701#### \_\_slots\_\_702703Добавлен параметр `slots` в декоратор [`dataclasses.dataclass()`](https://python-all.ru/3.10/library/dataclasses.html#dataclasses.dataclass). (Предложено Юрием Карабасом в [bpo-42269](https://python-all.ru/3.10/whatsnew/3.10.html))704705#### Поля только по ключу706707dataclasses теперь поддерживает поля, которые являются только по ключу в сгенерированном методе \_\_init\_\_. Существует несколько способов указания таких полей.708709Можно указать, что все поля являются только по ключу:710711```python712from dataclasses import dataclass713714@dataclass(kw_only=True)715class Birthday:716 name: str717 birthday: datetime.date718```719720Оба параметра `name` и `birthday` являются только по ключу в сгенерированном методе \_\_init\_\_.721722Можно указать «только по ключу» для каждого поля отдельно:723724```python725from dataclasses import dataclass726727@dataclass728class Birthday:729 name: str730 birthday: datetime.date = field(kw_only=True)731```732733Здесь только `birthday` является только по ключу. Если установить `kw_only` для отдельных полей, следует учитывать, что существуют правила переупорядочивания полей: поля только по ключу должны следовать после полей не только по ключу. Подробнее см. в полной документации dataclasses.734735Также можно указать, что все поля, следующие за маркером KW\_ONLY, являются только по ключу. Вероятно, это будет наиболее распространённый способ использования:736737```python738from dataclasses import dataclass, KW_ONLY739740@dataclass741class Point:742 x: float743 y: float744 _: KW_ONLY745 z: float = 0.0746 t: float = 0.0747```748749Здесь `z` и `t` являются параметрами только по ключу, а `x` и `y` – нет. (Предложено Эриком В. Смитом в [bpo-43532](https://python-all.ru/3.10/whatsnew/3.10.html).)750751### distutils752753Весь пакет `distutils` является устаревшим и будет удалён в Python 3.12. Его функциональность для указания сборки пакетов уже полностью заменена сторонними пакетами `setuptools` и `packaging`, а большинство других часто используемых API доступны в других местах стандартной библиотеки (например, [`platform`](https://python-all.ru/3.10/library/platform.html#module-platform), [`shutil`](https://python-all.ru/3.10/library/shutil.html#module-shutil), [`subprocess`](https://python-all.ru/3.10/library/subprocess.html#module-subprocess) или [`sysconfig`](https://python-all.ru/3.10/library/sysconfig.html#module-sysconfig)). Планов по переносу какой-либо другой функциональности из `distutils` нет, и приложения, использующие другие функции, должны рассмотреть создание частных копий кода. Обратитесь к [**PEP 632**](https://python-all.ru/3.10/whatsnew/3.10.html) для обсуждения.754755Команда `bdist_wininst`, устаревшая в Python 3.8, была удалена. Теперь для распространения двоичных пакетов в Windows рекомендуется использовать команду `bdist_wheel`. (Предложено Виктором Стиннером в [bpo-42802](https://python-all.ru/3.10/whatsnew/3.10.html).)756757### doctest758759Если модуль не определяет `__loader__`, используется `__spec__.loader`. (Автор: Brett Cannon в [bpo-42133](https://python-all.ru/3.10/whatsnew/3.10.html).)760761### encodings762763`encodings.normalize_encoding()` теперь игнорирует не-ASCII символы. (Добавлено Хай Ши в [bpo-39337](https://python-all.ru/3.10/whatsnew/3.10.html).)764765### fileinput766767Добавлены параметры *encoding* и *errors* в [`fileinput.input()`](https://python-all.ru/3.10/library/fileinput.html#fileinput.input) и [`fileinput.FileInput`](https://python-all.ru/3.10/library/fileinput.html#fileinput.FileInput). (Добавлено Инадой Наоки в [bpo-43712](https://python-all.ru/3.10/whatsnew/3.10.html).)768769[`fileinput.hook_compressed()`](https://python-all.ru/3.10/library/fileinput.html#fileinput.hook_compressed) теперь возвращает объект `TextIOWrapper`, когда *mode* равен «r», а файл сжат, как и несжатые файлы. (Добавлено Инадой Наоки в [bpo-5758](https://python-all.ru/3.10/whatsnew/3.10.html).)770771### faulthandler772773Модуль [`faulthandler`](https://python-all.ru/3.10/library/faulthandler.html#module-faulthandler) теперь обнаруживает, произошла ли фатальная ошибка во время сборки мусора. (Добавлено Виктором Стиннером в [bpo-44466](https://python-all.ru/3.10/whatsnew/3.10.html).)774775### gc776777Добавлены аудит-хуки для [`gc.get_objects()`](https://python-all.ru/3.10/library/gc.html#gc.get_objects), [`gc.get_referrers()`](https://python-all.ru/3.10/library/gc.html#gc.get_referrers) и [`gc.get_referents()`](https://python-all.ru/3.10/library/gc.html#gc.get_referents). (Добавлено Пабло Галиндо в [bpo-43439](https://python-all.ru/3.10/whatsnew/3.10.html).)778779### glob780781Добавлены параметры *root\_dir* и *dir\_fd* в [`glob()`](https://python-all.ru/3.10/library/glob.html#glob.glob) и [`iglob()`](https://python-all.ru/3.10/library/glob.html#glob.iglob), которые позволяют указать корневой каталог для поиска. (Добавлено Сергеем Сторчакой в [bpo-38144](https://python-all.ru/3.10/whatsnew/3.10.html).)782783### hashlib784785Модуль hashlib требует OpenSSL 1.1.1 или новее. (Добавлено Кристианом Хаймсом в [**PEP 644**](https://python-all.ru/3.10/whatsnew/3.10.html) и [bpo-43669](https://python-all.ru/3.10/whatsnew/3.10.html).)786787Модуль hashlib имеет предварительную поддержку OpenSSL 3.0.0. (Добавлено Кристианом Хаймсом в [bpo-38820](https://python-all.ru/3.10/whatsnew/3.10.html) и других тикетах.)788789Чистая реализация на Python [`pbkdf2_hmac()`](https://python-all.ru/3.10/library/hashlib.html#hashlib.pbkdf2_hmac) объявлена устаревшей. В будущем PBKDF2-HMAC будет доступен только при сборке Python с поддержкой OpenSSL. (Добавлено Кристианом Хаймсом в [bpo-43880](https://python-all.ru/3.10/whatsnew/3.10.html).)790791### hmac792793Модуль hmac теперь использует реализацию HMAC от OpenSSL внутри. (Добавлено Кристианом Хаймсом в [bpo-40645](https://python-all.ru/3.10/whatsnew/3.10.html).)794795### IDLE и idlelib796797IDLE теперь вызывает [`sys.excepthook()`](https://python-all.ru/3.10/library/sys.html#sys.excepthook) (при запуске без «-n»). Ранее пользовательские хуки игнорировались. (Добавлено Кеном Хилтоном в [bpo-43008](https://python-all.ru/3.10/whatsnew/3.10.html).)798799Переработан диалог настроек. Вкладка General разделена на вкладки Windows и Shell/Ed. Источники справки, расширяющие меню Help, перемещены на вкладку Extensions. Освобождено место для новых опций и сокращён диалог. Последнее улучшает отображение диалога на маленьких экранах. (Добавлено Терри Джан Риди в [bpo-40468](https://python-all.ru/3.10/whatsnew/3.10.html).) Настройка отступа (indent space) перенесена с вкладки Font на новую вкладку Windows. (Добавлено Марком Роземаном и Терри Джан Риди в [bpo-33962](https://python-all.ru/3.10/whatsnew/3.10.html).)800801Эти изменения были перенесены в поддерживаемый выпуск 3.9.802803Добавлена боковая панель Shell. Основное приглашение («\>\>\>») перемещено на боковую панель. Вторичные приглашения («…») добавлены на боковую панель. Щелчок левой кнопкой мыши и перетаскивание (опционально) выделяют одну или несколько строк текста, как в боковой панели с номерами строк редактора. Щелчок правой кнопкой после выделения строк текста отображает контекстное меню с пунктом «copy with prompts». Это объединяет приглашения с боковой панели со строками выделенного текста. Этот пункт также появляется в контекстном меню текста. (Добавлено Талем Эйнатом в [bpo-37903](https://python-all.ru/3.10/whatsnew/3.10.html).)804805Используются пробелы вместо табуляции для отступа интерактивного кода. Это делает ввод интерактивного кода «выглядящим правильно». Возможность этого была основной мотивацией для добавления боковой панели Shell. (Добавлено Терри Джан Риди в [bpo-37892](https://python-all.ru/3.10/whatsnew/3.10.html).)806807Подсвечиваются новые [мягкие ключевые слова](https://python-all.ru/3.10/reference/lexical_analysis.html#soft-keywords) [`match`](https://python-all.ru/3.10/reference/compound_stmts.html#match), [`case`](https://python-all.ru/3.10/reference/compound_stmts.html#match) и [`_`](https://python-all.ru/3.10/reference/compound_stmts.html#wildcard-patterns) в операторах сопоставления с образцом. Однако эта подсветка не идеальна и может быть некорректной в некоторых редких случаях, включая некоторые `_` в образцах `case`. (Добавлено Талем Эйнатом в [bpo-44010](https://python-all.ru/3.10/whatsnew/3.10.html).)808809Новое в поддерживаемых выпусках 3.10.810811Применять подсветку синтаксиса для файлов `.pyi`. (Авторы: Alex Waygood и Terry Jan Reedy, [bpo-45447](https://python-all.ru/3.10/whatsnew/3.10.html).)812813Включение приглашений при сохранении содержимого Shell с вводом и выводом. (Автор: Terry Jan Reedy, [gh-95191](https://python-all.ru/3.10/whatsnew/3.10.html).)814815### importlib.metadata816817Функциональная совместимость с `importlib_metadata` 4.6 ([история](https://python-all.ru/3.10/whatsnew/3.10.html)).818819[importlib.metadata entry points](https://python-all.ru/3.10/library/importlib.metadata.html#entry-points) теперь предоставляют более удобную возможность выбора точек входа по группе и имени с помощью нового `importlib.metadata.EntryPoints` класса. См. примечание о совместимости в документации для получения дополнительной информации об устаревании и использовании.820821Добавлен `importlib.metadata.packages_distributions()` для преобразования модулей и пакетов Python верхнего уровня в их `importlib.metadata.Distribution`.822823### inspect824825Если модуль не определяет `__loader__`, используется `__spec__.loader`. (Автор: Brett Cannon в [bpo-42133](https://python-all.ru/3.10/whatsnew/3.10.html).)826827Добавлен [`inspect.get_annotations()`](https://python-all.ru/3.10/library/inspect.html#inspect.get_annotations), который безопасно вычисляет аннотации, определённые для объекта. Он обходит особенности доступа к аннотациям для различных типов объектов и делает очень мало предположений об объекте, который исследует. [`inspect.get_annotations()`](https://python-all.ru/3.10/library/inspect.html#inspect.get_annotations) также может корректно преобразовывать строковые аннотации обратно в объекты. [`inspect.get_annotations()`](https://python-all.ru/3.10/library/inspect.html#inspect.get_annotations) теперь считается лучшей практикой для доступа к словарю аннотаций, определённому для любого объекта Python; дополнительную информацию о лучших практиках работы с аннотациями см. в [Лучшие практики для аннотаций](https://python-all.ru/3.10/howto/annotations.html#annotations-howto). Кроме того, [`inspect.signature()`](https://python-all.ru/3.10/library/inspect.html#inspect.signature), [`inspect.Signature.from_callable()`](https://python-all.ru/3.10/library/inspect.html#inspect.Signature.from_callable) и `inspect.Signature.from_function()` теперь вызывают [`inspect.get_annotations()`](https://python-all.ru/3.10/library/inspect.html#inspect.get_annotations) для получения аннотаций. Это означает, что [`inspect.signature()`](https://python-all.ru/3.10/library/inspect.html#inspect.signature) и [`inspect.Signature.from_callable()`](https://python-all.ru/3.10/library/inspect.html#inspect.Signature.from_callable) также теперь могут преобразовывать строковые аннотации обратно в объекты. (Автор: Larry Hastings в [bpo-43817](https://python-all.ru/3.10/whatsnew/3.10.html).)828829### itertools830831Добавлен [`itertools.pairwise()`](https://python-all.ru/3.10/library/itertools.html#itertools.pairwise). (Автор: Raymond Hettinger в [bpo-38200](https://python-all.ru/3.10/whatsnew/3.10.html).)832833### linecache834835Если модуль не определяет `__loader__`, используется `__spec__.loader`. (Автор: Brett Cannon в [bpo-42133](https://python-all.ru/3.10/whatsnew/3.10.html).)836837### os838839Добавлена поддержка [`os.cpu_count()`](https://python-all.ru/3.10/library/os.html#os.cpu_count) для VxWorks RTOS. (Автор: Peixing Xin в [bpo-41440](https://python-all.ru/3.10/whatsnew/3.10.html).)840841Добавлена новая функция [`os.eventfd()`](https://python-all.ru/3.10/library/os.html#os.eventfd) и вспомогательные функции для обёртки системного вызова `eventfd2` в Linux. (Автор: Christian Heimes в [bpo-41001](https://python-all.ru/3.10/whatsnew/3.10.html).)842843Добавлен [`os.splice()`](https://python-all.ru/3.10/library/os.html#os.splice), который позволяет перемещать данные между двумя файловыми дескрипторами без копирования между адресным пространством ядра и пользовательским адресным пространством, причём один из файловых дескрипторов должен ссылаться на канал. (Автор: Pablo Galindo в [bpo-41625](https://python-all.ru/3.10/whatsnew/3.10.html).)844845Добавлены [`O_EVTONLY`](https://python-all.ru/3.10/library/os.html#os.O_EVTONLY), [`O_FSYNC`](https://python-all.ru/3.10/library/os.html#os.O_FSYNC), [`O_SYMLINK`](https://python-all.ru/3.10/library/os.html#os.O_SYMLINK) и [`O_NOFOLLOW_ANY`](https://python-all.ru/3.10/library/os.html#os.O_NOFOLLOW_ANY) для macOS. (Автор: Dong-hee Na, [bpo-43106](https://python-all.ru/3.10/whatsnew/3.10.html).)846847Начиная с версии 3.10.15, [`os.mkdir()`](https://python-all.ru/3.10/library/os.html#os.mkdir) и [`os.makedirs()`](https://python-all.ru/3.10/library/os.html#os.makedirs) в Windows теперь поддерживают передачу значения *mode* равным `0o700` для применения контроля доступа к новому каталогу. Это неявно влияет на [`tempfile.mkdtemp()`](https://python-all.ru/3.10/library/tempfile.html#tempfile.mkdtemp) и является смягчением для CVE-2024-4030. Другие значения *mode* по-прежнему игнорируются. (Предложено Стивом Дауэром в [gh-118486](https://python-all.ru/3.10/whatsnew/3.10.html).)848849### os.path850851[`os.path.realpath()`](https://python-all.ru/3.10/library/os.path.html#os.path.realpath) теперь принимает именованный аргумент *strict*. Если установлено значение `True`, [`OSError`](https://python-all.ru/3.10/library/exceptions.html#OSError) возбуждается, если путь не существует или обнаружен цикл символической ссылки. (Автор: Barney Gale в [bpo-43757](https://python-all.ru/3.10/whatsnew/3.10.html).)852853### pathlib854855Добавлена поддержка срезов для [`PurePath.parents`](https://python-all.ru/3.10/library/pathlib.html#pathlib.PurePath.parents). (Автор: Joshua Cannon в [bpo-35498](https://python-all.ru/3.10/whatsnew/3.10.html).)856857Добавлена поддержка отрицательной индексации для [`PurePath.parents`](https://python-all.ru/3.10/library/pathlib.html#pathlib.PurePath.parents). (Автор: Yaroslav Pankovych в [bpo-21041](https://python-all.ru/3.10/whatsnew/3.10.html).)858859Добавлен метод [`Path.hardlink_to`](https://python-all.ru/3.10/library/pathlib.html#pathlib.Path.hardlink_to), который заменяет [`link_to()`](https://python-all.ru/3.10/library/pathlib.html#pathlib.Path.link_to). Новый метод имеет тот же порядок аргументов, что и [`symlink_to()`](https://python-all.ru/3.10/library/pathlib.html#pathlib.Path.symlink_to). (Автор: Barney Gale в [bpo-39950](https://python-all.ru/3.10/whatsnew/3.10.html).)860861[`pathlib.Path.stat()`](https://python-all.ru/3.10/library/pathlib.html#pathlib.Path.stat) и [`chmod()`](https://python-all.ru/3.10/library/pathlib.html#pathlib.Path.chmod) теперь принимают именованный аргумент *follow\_symlinks* для согласованности с соответствующими функциями в модуле [`os`](https://python-all.ru/3.10/library/os.html#module-os). (Автор: Barney Gale в [bpo-39906](https://python-all.ru/3.10/whatsnew/3.10.html).)862863### platform864865Добавлен [`platform.freedesktop_os_release()`](https://python-all.ru/3.10/library/platform.html#platform.freedesktop_os_release) для получения идентификации операционной системы из стандартного файла [freedesktop.org os-release](https://python-all.ru/3.10/whatsnew/3.10.html). (Автор: Christian Heimes в [bpo-28468](https://python-all.ru/3.10/whatsnew/3.10.html).)866867### pprint868869[`pprint.pprint()`](https://python-all.ru/3.10/library/pprint.html#pprint.pprint) теперь принимает новый именованный аргумент `underscore_numbers`. (Автор: sblondon в [bpo-42914](https://python-all.ru/3.10/whatsnew/3.10.html).)870871[`pprint`](https://python-all.ru/3.10/library/pprint.html#module-pprint) теперь может красиво печатать экземпляры [`dataclasses.dataclass`](https://python-all.ru/3.10/library/dataclasses.html#dataclasses.dataclass). (Автор: Lewis Gaul в [bpo-43080](https://python-all.ru/3.10/whatsnew/3.10.html).)872873### py\_compile874875Добавлена опция `--quiet` в интерфейс командной строки [`py_compile`](https://python-all.ru/3.10/library/py_compile.html#module-py_compile). (Автор: Gregory Schevchenko в [bpo-38731](https://python-all.ru/3.10/whatsnew/3.10.html).)876877### pyclbr878879Добавлен атрибут `end_lineno` в объекты `Function` и `Class` в дереве, возвращаемом `pyclbr.readline()` и `pyclbr.readline_ex()`. Он соответствует существующему (начальному) `lineno`. (Автор: Aviral Srivastava в [bpo-38307](https://python-all.ru/3.10/whatsnew/3.10.html).)880881### shelve882883Модуль [`shelve`](https://python-all.ru/3.10/library/shelve.html#module-shelve) теперь по умолчанию использует [`pickle.DEFAULT_PROTOCOL`](https://python-all.ru/3.10/library/pickle.html#pickle.DEFAULT_PROTOCOL) вместо протокола [`pickle`](https://python-all.ru/3.10/library/pickle.html#module-pickle) `3` при создании shelves. (Автор: Zackery Spytz в [bpo-34204](https://python-all.ru/3.10/whatsnew/3.10.html).)884885### statistics886887Добавлены функции [`covariance()`](https://python-all.ru/3.10/library/statistics.html#statistics.covariance), [`correlation()`](https://python-all.ru/3.10/library/statistics.html#statistics.correlation) Пирсона и простая [`linear_regression()`](https://python-all.ru/3.10/library/statistics.html#statistics.linear_regression). (Автор: Tymoteusz Wołodźko в [bpo-38490](https://python-all.ru/3.10/whatsnew/3.10.html).)888889### site890891Если модуль не определяет `__loader__`, используется `__spec__.loader`. (Автор: Brett Cannon в [bpo-42133](https://python-all.ru/3.10/whatsnew/3.10.html).)892893### socket894895Исключение [`socket.timeout`](https://python-all.ru/3.10/library/socket.html#socket.timeout) теперь является псевдонимом [`TimeoutError`](https://python-all.ru/3.10/library/exceptions.html#TimeoutError). (Автор: Christian Heimes в [bpo-42413](https://python-all.ru/3.10/whatsnew/3.10.html).)896897Добавлена возможность создавать MPTCP-сокеты с `IPPROTO_MPTCP` (Автор: Rui Cunha в [bpo-43571](https://python-all.ru/3.10/whatsnew/3.10.html).)898899Добавлена опция `IP_RECVTOS` для получения поля Type of Service (ToS) или DSCP/ECN (Автор: Georg Sauthoff в [bpo-44077](https://python-all.ru/3.10/whatsnew/3.10.html).)900901### ssl902903Модуль ssl требует OpenSSL 1.1.1 или новее. (Автор: Christian Heimes в [**PEP 644**](https://python-all.ru/3.10/whatsnew/3.10.html) и [bpo-43669](https://python-all.ru/3.10/whatsnew/3.10.html).)904905Модуль ssl получил предварительную поддержку OpenSSL 3.0.0 и новую опцию [`OP_IGNORE_UNEXPECTED_EOF`](https://python-all.ru/3.10/library/ssl.html#ssl.OP_IGNORE_UNEXPECTED_EOF). (Автор: Christian Heimes в [bpo-38820](https://python-all.ru/3.10/whatsnew/3.10.html), [bpo-43794](https://python-all.ru/3.10/whatsnew/3.10.html), [bpo-43788](https://python-all.ru/3.10/whatsnew/3.10.html), [bpo-43791](https://python-all.ru/3.10/whatsnew/3.10.html), [bpo-43799](https://python-all.ru/3.10/whatsnew/3.10.html), [bpo-43920](https://python-all.ru/3.10/whatsnew/3.10.html), [bpo-43789](https://python-all.ru/3.10/whatsnew/3.10.html) и [bpo-43811](https://python-all.ru/3.10/whatsnew/3.10.html).)906907Устаревшие функции и использование устаревших констант теперь приводят к [`DeprecationWarning`](https://python-all.ru/3.10/library/exceptions.html#DeprecationWarning). У [`ssl.SSLContext.options`](https://python-all.ru/3.10/library/ssl.html#ssl.SSLContext.options) по умолчанию установлены [`OP_NO_SSLv2`](https://python-all.ru/3.10/library/ssl.html#ssl.OP_NO_SSLv2) и [`OP_NO_SSLv3`](https://python-all.ru/3.10/library/ssl.html#ssl.OP_NO_SSLv3), поэтому он не может предупредить о повторной установке флага. В [разделе об устаревших возможностях](https://python-all.ru/3.10/whatsnew/3.10.html#whatsnew310-deprecated) приведён список устаревших функций. (Автор: Christian Heimes в [bpo-43880](https://python-all.ru/3.10/whatsnew/3.10.html).)908909Модуль ssl теперь использует более безопасные настройки по умолчанию. Шифры без прямой секретности (forward secrecy) или с MAC SHA-1 отключены по умолчанию. Уровень безопасности 2 запрещает слабые ключи RSA, DH и ECC с надёжностью менее 112 бит. [`SSLContext`](https://python-all.ru/3.10/library/ssl.html#ssl.SSLContext) по умолчанию использует минимальную версию протокола TLS 1.2. Настройки основаны на исследовании Hynek Schlawack. (Автор: Christian Heimes в [bpo-43998](https://python-all.ru/3.10/whatsnew/3.10.html).)910911Устаревшие протоколы SSL 3.0, TLS 1.0 и TLS 1.1 больше официально не поддерживаются. Python активно их не блокирует. Однако параметры сборки OpenSSL, настройки дистрибутивов, патчи вендоров и наборы шифров могут препятствовать успешному рукопожатию.912913Добавлен параметр *timeout* в функцию [`ssl.get_server_certificate()`](https://python-all.ru/3.10/library/ssl.html#ssl.get_server_certificate). (Автор: Zackery Spytz в [bpo-31870](https://python-all.ru/3.10/whatsnew/3.10.html).)914915Модуль ssl использует heap-типы и многофазную инициализацию. (Автор: Christian Heimes в [bpo-42333](https://python-all.ru/3.10/whatsnew/3.10.html).)916917Добавлен новый флаг проверки [`VERIFY_X509_PARTIAL_CHAIN`](https://python-all.ru/3.10/library/ssl.html#ssl.VERIFY_X509_PARTIAL_CHAIN). (Автор: l0x в [bpo-40849](https://python-all.ru/3.10/whatsnew/3.10.html).)918919### sqlite3920921Добавлены события аудита для `connect/handle()`, [`enable_load_extension()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.enable_load_extension) и [`load_extension()`](https://python-all.ru/3.10/library/sqlite3.html#sqlite3.Connection.load_extension). (Автор: Erlend E. Aasland в [bpo-43762](https://python-all.ru/3.10/whatsnew/3.10.html).)922923### sys924925Добавлен атрибут [`sys.orig_argv`](https://python-all.ru/3.10/library/sys.html#sys.orig_argv): список исходных аргументов командной строки, переданных исполняемому файлу Python. (Автор: Victor Stinner в [bpo-23427](https://python-all.ru/3.10/whatsnew/3.10.html).)926927Добавлен [`sys.stdlib_module_names`](https://python-all.ru/3.10/library/sys.html#sys.stdlib_module_names), содержащий список имён модулей стандартной библиотеки. (Автор: Victor Stinner в [bpo-42955](https://python-all.ru/3.10/whatsnew/3.10.html).)928929### tempfile930931Начиная с версии 3.10.15 в Windows, режим по умолчанию `0o700`, используемый [`tempfile.mkdtemp()`](https://python-all.ru/3.10/library/tempfile.html#tempfile.mkdtemp), теперь ограничивает доступ к новому каталогу из-за изменений в [`os.mkdir()`](https://python-all.ru/3.10/library/os.html#os.mkdir). Это смягчение для CVE-2024-4030. (Предложено Стивом Дауэром в [gh-118486](https://python-all.ru/3.10/whatsnew/3.10.html).)932933### \_thread934935[`_thread.interrupt_main()`](https://python-all.ru/3.10/library/_thread.html#thread.interrupt_main) теперь принимает необязательный номер сигнала для имитации (по умолчанию по-прежнему [`signal.SIGINT`](https://python-all.ru/3.10/library/signal.html#signal.SIGINT)). (Автор: Antoine Pitrou в [bpo-43356](https://python-all.ru/3.10/whatsnew/3.10.html).)936937### threading938939Добавлены [`threading.gettrace()`](https://python-all.ru/3.10/library/threading.html#threading.gettrace) и [`threading.getprofile()`](https://python-all.ru/3.10/library/threading.html#threading.getprofile) для получения функций, установленных [`threading.settrace()`](https://python-all.ru/3.10/library/threading.html#threading.settrace) и [`threading.setprofile()`](https://python-all.ru/3.10/library/threading.html#threading.setprofile) соответственно. (Автор: Mario Corchero в [bpo-42251](https://python-all.ru/3.10/whatsnew/3.10.html).)940941Добавлен [`threading.__excepthook__`](https://python-all.ru/3.10/library/threading.html#threading.__excepthook__) для получения исходного значения [`threading.excepthook()`](https://python-all.ru/3.10/library/threading.html#threading.excepthook), если оно установлено в сломанное или другое значение. (Автор: Mario Corchero в [bpo-42308](https://python-all.ru/3.10/whatsnew/3.10.html).)942943### traceback944945Функции [`format_exception()`](https://python-all.ru/3.10/library/traceback.html#traceback.format_exception), [`format_exception_only()`](https://python-all.ru/3.10/library/traceback.html#traceback.format_exception_only) и [`print_exception()`](https://python-all.ru/3.10/library/traceback.html#traceback.print_exception) теперь могут принимать объект исключения в качестве позиционного аргумента (только позиционный). (Авторы: Zackery Spytz и Matthias Bussonnier в [bpo-26389](https://python-all.ru/3.10/whatsnew/3.10.html).)946947### types948949Повторно введены классы [`types.EllipsisType`](https://python-all.ru/3.10/library/types.html#types.EllipsisType), [`types.NoneType`](https://python-all.ru/3.10/library/types.html#types.NoneType) и [`types.NotImplementedType`](https://python-all.ru/3.10/library/types.html#types.NotImplementedType), предоставляющие новый набор типов, легко интерпретируемых средствами проверки типов. (Автор: Bas van Beek в [bpo-41810](https://python-all.ru/3.10/whatsnew/3.10.html).)950951### typing952953Основные изменения см. в [новых возможностях, связанных с аннотациями типов](https://python-all.ru/3.10/whatsnew/3.10.html#new-feat-related-type-hints).954955Поведение [`typing.Literal`](https://python-all.ru/3.10/library/typing.html#typing.Literal) было изменено в соответствии с [**PEP 586**](https://python-all.ru/3.10/whatsnew/3.10.html) и для соответствия поведению статических анализаторов типов, описанному в PEP.9569571. `Literal` теперь удаляет дубликаты параметров.9582. Проверки равенства между объектами `Literal` теперь не зависят от порядка.9593. Сравнения `Literal` теперь учитывают типы. Например, `Literal[0] == Literal[False]` ранее давало `True`. Теперь это `False`. Для поддержки этого изменения внутренний кеш типов теперь поддерживает различение типов.9604. Объекты `Literal` теперь будут вызывать исключение [`TypeError`](https://python-all.ru/3.10/library/exceptions.html#TypeError) при проверке равенства, если какой-либо из их параметров не является [хешируемым](https://python-all.ru/3.10/glossary.html#term-hashable). Обратите внимание, что объявление `Literal` с нехешируемыми параметрами не вызовет ошибку:961962 ```python963 >>> from typing import Literal964 >>> Literal[{0}]965 >>> Literal[{0}] == Literal[{False}]966 Traceback (most recent call last):967 File "<stdin>", line 1, in <module>968 TypeError: unhashable type: 'set'969 ```970971(Предложено Юрием Карабасом в [bpo-42345](https://python-all.ru/3.10/whatsnew/3.10.html).)972973Добавлена новая функция [`typing.is_typeddict()`](https://python-all.ru/3.10/library/typing.html#typing.is_typeddict) для проверки, является ли аннотация типом [`typing.TypedDict`](https://python-all.ru/3.10/library/typing.html#typing.TypedDict). (Предложено Патриком Ридером в [bpo-41792](https://python-all.ru/3.10/whatsnew/3.10.html).)974975Подклассы `typing.Protocol`, которые объявляют только переменные данных, теперь будут вызывать `TypeError` при проверке с помощью `isinstance`, если они не декорированы `runtime_checkable()`. Ранее такие проверки проходили молча. Пользователям следует декорировать свои подклассы декоратором `runtime_checkable()`,\\если они хотят использовать протоколы времени выполнения. (Предложено Юрием Карабасом в [bpo-38908](https://python-all.ru/3.10/whatsnew/3.10.html).)976977Импорт из подмодулей `typing.io` и `typing.re` теперь будет вызывать [`DeprecationWarning`](https://python-all.ru/3.10/library/exceptions.html#DeprecationWarning). Эти подмодули устарели начиная с Python 3.8 и будут удалены в будущей версии Python. Все, что принадлежит этим подмодулям, следует импортировать напрямую из [`typing`](https://python-all.ru/3.10/library/typing.html#module-typing). (Предложено Sebastian Rittau в [bpo-38291](https://python-all.ru/3.10/whatsnew/3.10.html).)978979### unittest980981Добавлен новый метод [`assertNoLogs()`](https://python-all.ru/3.10/library/unittest.html#unittest.TestCase.assertNoLogs) в дополнение к существующему [`assertLogs()`](https://python-all.ru/3.10/library/unittest.html#unittest.TestCase.assertLogs). (Предложено Kit Yan Choi в [bpo-39385](https://python-all.ru/3.10/whatsnew/3.10.html).)982983### urllib.parse984985В версиях Python ниже 3.10 допускалось использование как `;`, так и `&` в качестве разделителей параметров запроса в [`urllib.parse.parse_qs()`](https://python-all.ru/3.10/library/urllib.parse.html#urllib.parse.parse_qs) и [`urllib.parse.parse_qsl()`](https://python-all.ru/3.10/library/urllib.parse.html#urllib.parse.parse_qsl). Из соображений безопасности и для соответствия новым рекомендациям W3C теперь разрешен только один разделитель, по умолчанию `&`. Это изменение также затрагивает [`cgi.parse()`](https://python-all.ru/3.10/library/cgi.html#cgi.parse) и [`cgi.parse_multipart()`](https://python-all.ru/3.10/library/cgi.html#cgi.parse_multipart), так как они внутренне используют затронутые функции. Подробнее см. в их документации. (Предложено Adam Goldschmidt, Senthil Kumaran и Ken Jin в [bpo-42967](https://python-all.ru/3.10/whatsnew/3.10.html).)986987The presence of newline or tab characters in parts of a URL allows for some forms of attacks. Following the WHATWG specification that updates [**RFC 3986**](https://python-all.ru/3.10/whatsnew/3.10.html), ASCII newline `\n`, `\r` and tab `\t` characters are stripped from the URL by the parser in [`urllib.parse`](https://python-all.ru/3.10/library/urllib.parse.html#module-urllib.parse) preventing such attacks. The removal characters are controlled by a new module level variable `urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE`. (See [bpo-43882](https://python-all.ru/3.10/whatsnew/3.10.html))988989### xml990991Добавлен класс [`LexicalHandler`](https://python-all.ru/3.10/library/xml.sax.handler.html#xml.sax.handler.LexicalHandler) в модуль [`xml.sax.handler`](https://python-all.ru/3.10/library/xml.sax.handler.html#module-xml.sax.handler). (Предложено Jonathan Gossage и Zackery Spytz в [bpo-35018](https://python-all.ru/3.10/whatsnew/3.10.html).)992993### zipimport994995Добавлены методы, связанные с [**PEP 451**](https://python-all.ru/3.10/whatsnew/3.10.html): [`find_spec()`](https://python-all.ru/3.10/library/zipimport.html#zipimport.zipimporter.find_spec), [`zipimport.zipimporter.create_module()`](https://python-all.ru/3.10/library/zipimport.html#zipimport.zipimporter.create_module) и [`zipimport.zipimporter.exec_module()`](https://python-all.ru/3.10/library/zipimport.html#zipimport.zipimporter.exec_module). (Предложено Brett Cannon в [bpo-42131](https://python-all.ru/3.10/whatsnew/3.10.html).)996997Добавлен метод [`invalidate_caches()`](https://python-all.ru/3.10/library/zipimport.html#zipimport.zipimporter.invalidate_caches). (Предложено Desmond Cheong в [bpo-14678](https://python-all.ru/3.10/whatsnew/3.10.html).)998999## Оптимизации10001001- Конструкторы [`str()`](https://python-all.ru/3.10/library/stdtypes.html#str), [`bytes()`](https://python-all.ru/3.10/library/stdtypes.html#bytes) и [`bytearray()`](https://python-all.ru/3.10/library/stdtypes.html#bytearray) теперь работают быстрее (примерно на 30–40% для маленьких объектов). (Предложено Serhiy Storchaka в [bpo-41334](https://python-all.ru/3.10/whatsnew/3.10.html).)1002- Модуль [`runpy`](https://python-all.ru/3.10/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.10/whatsnew/3.10.html) и [bpo-41718](https://python-all.ru/3.10/whatsnew/3.10.html).)1003- Инструкция `LOAD_ATTR` теперь использует новый механизм «per opcode cache». Она работает примерно на 36% быстрее для обычных атрибутов и на 44% быстрее для слотов. (Предложено Pablo Galindo и Yury Selivanov в [bpo-42093](https://python-all.ru/3.10/whatsnew/3.10.html) и Guido van Rossum в [bpo-42927](https://python-all.ru/3.10/whatsnew/3.10.html), на основе идей, первоначально реализованных в PyPy и MicroPython.)1004- При сборке Python с [`--enable-optimizations`](https://python-all.ru/3.10/using/configure.html#cmdoption-enable-optimizations) теперь `-fno-semantic-interposition` добавляется как в команду компиляции, так и в команду компоновки. Это ускоряет сборку интерпретатора Python, созданного с помощью [`--enable-shared`](https://python-all.ru/3.10/using/configure.html#cmdoption-enable-shared) с `gcc`, до 30%. См. [эту статью](https://python-all.ru/3.10/whatsnew/3.10.html) для подробностей. (Предложено Victor Stinner и Pablo Galindo в [bpo-38980](https://python-all.ru/3.10/whatsnew/3.10.html).)1005- Используется новый код управления выходным буфером для модулей [`bz2`](https://python-all.ru/3.10/library/bz2.html#module-bz2) / [`lzma`](https://python-all.ru/3.10/library/lzma.html#module-lzma) / [`zlib`](https://python-all.ru/3.10/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.10/whatsnew/3.10.html))1006- При использовании строковых аннотаций словари аннотаций для функций больше не создаются при создании функции. Вместо этого они хранятся в виде кортежа строк, и объект функции лениво преобразует его в словарь аннотаций по требованию. Эта оптимизация сокращает время CPU, необходимое для определения аннотированной функции, вдвое. (Предложено Yurii Karabas и Inada Naoki в [bpo-42202](https://python-all.ru/3.10/whatsnew/3.10.html).)1007- Функции поиска подстроки, такие как `str1 in str2` и `str2.find(str1)`, теперь иногда используют алгоритм поиска строк «Two-Way» Крочемора и Перрина, чтобы избежать квадратичного поведения на длинных строках. (Предложено Dennis Sweeney в [bpo-41972](https://python-all.ru/3.10/whatsnew/3.10.html))1008- Добавлены микрооптимизации в `_PyType_Lookup()` для улучшения производительности поиска в кеше атрибутов типа в типичном случае попадания в кеш. Это делает интерпретатор в среднем в 1,04 раза быстрее. (Предложено Dino Viehland в [bpo-43452](https://python-all.ru/3.10/whatsnew/3.10.html).)1009- Следующие встроенные функции теперь поддерживают более быстрый механизм вызова vectorcall [**PEP 590**](https://python-all.ru/3.10/whatsnew/3.10.html): [`map()`](https://python-all.ru/3.10/library/functions.html#map), [`filter()`](https://python-all.ru/3.10/library/functions.html#filter), [`reversed()`](https://python-all.ru/3.10/library/functions.html#reversed), [`bool()`](https://python-all.ru/3.10/library/functions.html#bool) и [`float()`](https://python-all.ru/3.10/library/functions.html#float). (Предложено Донг-хи На и Йеруном Демейером в [bpo-43575](https://python-all.ru/3.10/whatsnew/3.10.html), [bpo-43287](https://python-all.ru/3.10/whatsnew/3.10.html), [bpo-41922](https://python-all.ru/3.10/whatsnew/3.10.html), [bpo-41873](https://python-all.ru/3.10/whatsnew/3.10.html) и [bpo-41870](https://python-all.ru/3.10/whatsnew/3.10.html).)1010- Производительность `BZ2File` улучшена за счет удаления внутренних `RLock`. Это делает `BZ2File` потоконебезопасным при наличии нескольких одновременных читателей или писателей, как и его эквивалентные классы в [`gzip`](https://python-all.ru/3.10/library/gzip.html#module-gzip) и [`lzma`](https://python-all.ru/3.10/library/lzma.html#module-lzma) всегда были. (Предложено Inada Naoki в [bpo-43785](https://python-all.ru/3.10/whatsnew/3.10.html).)10111012## Устарело10131014- В настоящее время 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.10/reference/expressions.html#and), [`else`](https://python-all.ru/3.10/reference/compound_stmts.html#else), [`for`](https://python-all.ru/3.10/reference/compound_stmts.html#for), [`if`](https://python-all.ru/3.10/reference/compound_stmts.html#if), [`in`](https://python-all.ru/3.10/reference/expressions.html#in), [`is`](https://python-all.ru/3.10/reference/expressions.html#is) и [`or`](https://python-all.ru/3.10/reference/expressions.html#or), выдаётся предупреждение об устаревании. В будущих выпусках оно будет заменено на синтаксическое предупреждение, а затем на синтаксическую ошибку. (Предложено Сергеем Сторчакой в [bpo-43833](https://python-all.ru/3.10/whatsnew/3.10.html).)1015- Начиная с этого выпуска будет предпринята согласованная работа по очистке старой семантики импорта, которая сохранялась для совместимости с Python 2.7. В частности, [`find_loader()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.PathEntryFinder.find_loader)/[`find_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Finder.find_module) (заменено на `find_spec()`), [`load_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.load_module) (заменено на [`exec_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.exec_module)), [`module_repr()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.module_repr) (о чём система импорта заботится сама), атрибут `__package__` (заменён на `__spec__.parent`), атрибут `__loader__` (заменён на `__spec__.loader`) и атрибут `__cached__` (заменён на `__spec__.cached`) будут постепенно удалены (а также другие классы и методы в [`importlib`](https://python-all.ru/3.10/library/importlib.html#module-importlib)). При необходимости будут выдаваться [`ImportWarning`](https://python-all.ru/3.10/library/exceptions.html#ImportWarning) и/или [`DeprecationWarning`](https://python-all.ru/3.10/library/exceptions.html#DeprecationWarning), чтобы помочь определить код, требующий обновления в ходе этого перехода.1016- Всё пространство имён `distutils` объявлено устаревшим и будет удалено в Python 3.12. Подробнее см. в разделе [изменения модулей](https://python-all.ru/3.10/whatsnew/3.10.html#distutils-deprecated).1017- Нецелочисленные аргументы для [`random.randrange()`](https://python-all.ru/3.10/library/random.html#random.randrange) объявлены устаревшими. [`ValueError`](https://python-all.ru/3.10/library/exceptions.html#ValueError) устарел в пользу [`TypeError`](https://python-all.ru/3.10/library/exceptions.html#TypeError). (Предложено Сергеем Сторчакой и Раймондом Хеттингером в [bpo-37319](https://python-all.ru/3.10/whatsnew/3.10.html).)1018- Различные методы `load_module()` класса [`importlib`](https://python-all.ru/3.10/library/importlib.html#module-importlib) были задокументированы как устаревшие, начиная с Python 3.6, но теперь они также будут вызывать [`DeprecationWarning`](https://python-all.ru/3.10/library/exceptions.html#DeprecationWarning). Используйте вместо них [`exec_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.exec_module). (Предложено Бреттом Кэнноном в [bpo-26131](https://python-all.ru/3.10/whatsnew/3.10.html).)1019- `zimport.zipimporter.load_module()` объявлен устаревшим в пользу [`exec_module()`](https://python-all.ru/3.10/library/zipimport.html#zipimport.zipimporter.exec_module). (Предложено Бреттом Кэнноном в [bpo-26131](https://python-all.ru/3.10/whatsnew/3.10.html).)1020- Использование [`load_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.load_module) системой импорта теперь вызывает [`ImportWarning`](https://python-all.ru/3.10/library/exceptions.html#ImportWarning), поскольку предпочтительнее использовать [`exec_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.exec_module). (Предложено Бреттом Кэнноном в [bpo-26131](https://python-all.ru/3.10/whatsnew/3.10.html).)1021- Использование [`importlib.abc.MetaPathFinder.find_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.MetaPathFinder.find_module) и [`importlib.abc.PathEntryFinder.find_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.PathEntryFinder.find_module) системой импорта теперь вызывает [`ImportWarning`](https://python-all.ru/3.10/library/exceptions.html#ImportWarning), поскольку предпочтительнее использовать [`importlib.abc.MetaPathFinder.find_spec()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.MetaPathFinder.find_spec) и [`importlib.abc.PathEntryFinder.find_spec()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.PathEntryFinder.find_spec) соответственно. Для помощи в переносе можно использовать [`importlib.util.spec_from_loader()`](https://python-all.ru/3.10/library/importlib.html#importlib.util.spec_from_loader). (Предложено Бреттом Кэнноном в [bpo-42134](https://python-all.ru/3.10/whatsnew/3.10.html).)1022- Использование [`importlib.abc.PathEntryFinder.find_loader()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.PathEntryFinder.find_loader) системой импорта теперь вызывает [`ImportWarning`](https://python-all.ru/3.10/library/exceptions.html#ImportWarning), поскольку предпочтительнее использовать [`importlib.abc.PathEntryFinder.find_spec()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.PathEntryFinder.find_spec). Для помощи в переносе можно использовать [`importlib.util.spec_from_loader()`](https://python-all.ru/3.10/library/importlib.html#importlib.util.spec_from_loader). (Предложено Бреттом Кэнноном в [bpo-43672](https://python-all.ru/3.10/whatsnew/3.10.html).)1023- Различные реализации [`importlib.abc.MetaPathFinder.find_module()`](https://python-all.ru/3.10/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.10/library/importlib.html#importlib.machinery.PathFinder.find_module), [`importlib.abc.MetaPathFinder.find_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.MetaPathFinder.find_module) ), [`importlib.abc.PathEntryFinder.find_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.PathEntryFinder.find_module) ( `importlib.machinery.FileFinder.find_module()` ) и [`importlib.abc.PathEntryFinder.find_loader()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.PathEntryFinder.find_loader) ( [`importlib.machinery.FileFinder.find_loader()`](https://python-all.ru/3.10/library/importlib.html#importlib.machinery.FileFinder.find_loader) ) теперь вызывают [`DeprecationWarning`](https://python-all.ru/3.10/library/exceptions.html#DeprecationWarning) и планируются к удалению в Python 3.12 (ранее они были задокументированы как устаревшие в Python 3.4). (Предложено Бреттом Кэнноном в [bpo-42135](https://python-all.ru/3.10/whatsnew/3.10.html).)1024- [`importlib.abc.Finder`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Finder) объявлен устаревшим (включая его единственный метод [`find_module()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Finder.find_module)). Оба класса [`importlib.abc.MetaPathFinder`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.MetaPathFinder) и [`importlib.abc.PathEntryFinder`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.PathEntryFinder) больше не наследуются от этого класса. Вместо этого следует наследовать от одного из этих двух классов по ситуации. (Предложено Бреттом Кэнноном в [bpo-42135](https://python-all.ru/3.10/whatsnew/3.10.html).)1025- Уведомления об устаревании для [`imp`](https://python-all.ru/3.10/library/imp.html#module-imp), [`importlib.find_loader()`](https://python-all.ru/3.10/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.10/library/importlib.html#importlib.util.module_for_loader), [`pkgutil.ImpImporter`](https://python-all.ru/3.10/library/pkgutil.html#pkgutil.ImpImporter) и [`pkgutil.ImpLoader`](https://python-all.ru/3.10/library/pkgutil.html#pkgutil.ImpLoader) были обновлены: теперь в качестве планируемой версии удаления указан Python 3.12 (в предыдущих версиях Python они начали вызывать [`DeprecationWarning`](https://python-all.ru/3.10/library/exceptions.html#DeprecationWarning)). (Предложено Бреттом Кэнноном в [bpo-43720](https://python-all.ru/3.10/whatsnew/3.10.html).)1026- Система импорта теперь использует атрибут `__spec__` у модулей, прежде чем обратиться к [`module_repr()`](https://python-all.ru/3.10/library/importlib.html#importlib.abc.Loader.module_repr) для метода `__repr__()` модуля. Удаление использования `module_repr()` запланировано на Python 3.12. (Предложено Бреттом Кэнноном в [bpo-42137](https://python-all.ru/3.10/whatsnew/3.10.html).)1027- [`importlib.abc.Loader.module_repr()`](https://python-all.ru/3.10/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.10/whatsnew/3.10.html).)1028- `sqlite3.OptimizedUnicode` не документирован и считается устаревшим начиная с Python 3.3, когда он стал псевдонимом для [`str`](https://python-all.ru/3.10/library/stdtypes.html#str). Теперь он объявлен устаревшим и запланирован к удалению в Python 3.12. (Предложено Эрлендом Э. Осландом в [bpo-42264](https://python-all.ru/3.10/whatsnew/3.10.html).)1029- Не документированная встроенная функция `sqlite3.enable_shared_cache` теперь объявлена устаревшей и запланирована к удалению в Python 3.12. Документация SQLite3 настоятельно не рекомендует её использовать. Подробнее см. в [документации SQLite3](https://python-all.ru/3.10/whatsnew/3.10.html). Если необходимо использовать общий кеш, откройте базу данных в режиме URI с помощью параметра запроса `cache=shared`. (Предложено Эрлендом Э. Осландом в [bpo-24464](https://python-all.ru/3.10/whatsnew/3.10.html).)1030- Следующие методы `threading` теперь объявлены устаревшими:10311032 - `threading.currentThread` =\> [`threading.current_thread()`](https://python-all.ru/3.10/library/threading.html#threading.current_thread)1033 - `threading.activeCount` =\> [`threading.active_count()`](https://python-all.ru/3.10/library/threading.html#threading.active_count)1034 - `threading.Condition.notifyAll` =\> [`threading.Condition.notify_all()`](https://python-all.ru/3.10/library/threading.html#threading.Condition.notify_all)1035 - `threading.Event.isSet` =\> [`threading.Event.is_set()`](https://python-all.ru/3.10/library/threading.html#threading.Event.is_set)1036 - `threading.Thread.setName` =\> [`threading.Thread.name`](https://python-all.ru/3.10/library/threading.html#threading.Thread.name)1037 - `threading.thread.getName` =\> [`threading.Thread.name`](https://python-all.ru/3.10/library/threading.html#threading.Thread.name)1038 - `threading.Thread.isDaemon` =\> [`threading.Thread.daemon`](https://python-all.ru/3.10/library/threading.html#threading.Thread.daemon)1039 - `threading.Thread.setDaemon` =\> [`threading.Thread.daemon`](https://python-all.ru/3.10/library/threading.html#threading.Thread.daemon)10401041 (Предложено Йелле Зейлстрой в [gh-87889](https://python-all.ru/3.10/whatsnew/3.10.html).)1042- [`pathlib.Path.link_to()`](https://python-all.ru/3.10/library/pathlib.html#pathlib.Path.link_to) объявлен устаревшим и запланирован к удалению в Python 3.12. Вместо него используйте [`pathlib.Path.hardlink_to()`](https://python-all.ru/3.10/library/pathlib.html#pathlib.Path.hardlink_to). (Предложено Барни Гейлом в [bpo-39950](https://python-all.ru/3.10/whatsnew/3.10.html).)1043- `cgi.log()` объявлен устаревшим и запланирован к удалению в Python 3.12. (Предложено Инадой Наоки в [bpo-41139](https://python-all.ru/3.10/whatsnew/3.10.html).)1044- Следующие возможности [`ssl`](https://python-all.ru/3.10/library/ssl.html#module-ssl) объявлены устаревшими начиная с Python 3.6, Python 3.7 или OpenSSL 1.1.0 и будут удалены в 3.11:10451046 - [`OP_NO_SSLv2`](https://python-all.ru/3.10/library/ssl.html#ssl.OP_NO_SSLv2), [`OP_NO_SSLv3`](https://python-all.ru/3.10/library/ssl.html#ssl.OP_NO_SSLv3), [`OP_NO_TLSv1`](https://python-all.ru/3.10/library/ssl.html#ssl.OP_NO_TLSv1), [`OP_NO_TLSv1_1`](https://python-all.ru/3.10/library/ssl.html#ssl.OP_NO_TLSv1_1), [`OP_NO_TLSv1_2`](https://python-all.ru/3.10/library/ssl.html#ssl.OP_NO_TLSv1_2) и [`OP_NO_TLSv1_3`](https://python-all.ru/3.10/library/ssl.html#ssl.OP_NO_TLSv1_3) заменяются на `sslSSLContext.minimum_version` и `sslSSLContext.maximum_version`.1047 - [`PROTOCOL_SSLv2`](https://python-all.ru/3.10/library/ssl.html#ssl.PROTOCOL_SSLv2), [`PROTOCOL_SSLv3`](https://python-all.ru/3.10/library/ssl.html#ssl.PROTOCOL_SSLv3), [`PROTOCOL_SSLv23`](https://python-all.ru/3.10/library/ssl.html#ssl.PROTOCOL_SSLv23), [`PROTOCOL_TLSv1`](https://python-all.ru/3.10/library/ssl.html#ssl.PROTOCOL_TLSv1), [`PROTOCOL_TLSv1_1`](https://python-all.ru/3.10/library/ssl.html#ssl.PROTOCOL_TLSv1_1), [`PROTOCOL_TLSv1_2`](https://python-all.ru/3.10/library/ssl.html#ssl.PROTOCOL_TLSv1_2) и [`PROTOCOL_TLS`](https://python-all.ru/3.10/library/ssl.html#ssl.PROTOCOL_TLS) объявлены устаревшими в пользу [`PROTOCOL_TLS_CLIENT`](https://python-all.ru/3.10/library/ssl.html#ssl.PROTOCOL_TLS_CLIENT) и [`PROTOCOL_TLS_SERVER`](https://python-all.ru/3.10/library/ssl.html#ssl.PROTOCOL_TLS_SERVER)1048 - [`wrap_socket()`](https://python-all.ru/3.10/library/ssl.html#ssl.wrap_socket) заменяется на [`ssl.SSLContext.wrap_socket()`](https://python-all.ru/3.10/library/ssl.html#ssl.SSLContext.wrap_socket)1049 - [`match_hostname()`](https://python-all.ru/3.10/library/ssl.html#ssl.match_hostname)1050 - [`RAND_pseudo_bytes()`](https://python-all.ru/3.10/library/ssl.html#ssl.RAND_pseudo_bytes), `RAND_egd()`1051 - Возможности NPN, такие как [`ssl.SSLSocket.selected_npn_protocol()`](https://python-all.ru/3.10/library/ssl.html#ssl.SSLSocket.selected_npn_protocol) и [`ssl.SSLContext.set_npn_protocols()`](https://python-all.ru/3.10/library/ssl.html#ssl.SSLContext.set_npn_protocols), заменяются на ALPN.1052- Отладка threading ([`PYTHONTHREADDEBUG`](https://python-all.ru/3.10/using/cmdline.html#envvar-PYTHONTHREADDEBUG) переменная окружения) устарела в Python 3.10 и будет удалена в Python 3.12. Эта функция требует [отладочной сборки Python](https://python-all.ru/3.10/using/configure.html#debug-build). (Автор: Victor Stinner в [bpo-44584](https://python-all.ru/3.10/whatsnew/3.10.html).)1053- Импорт из подмодулей `typing.io` и `typing.re` теперь будет вызывать [`DeprecationWarning`](https://python-all.ru/3.10/library/exceptions.html#DeprecationWarning). Эти подмодули будут удалены в будущей версии Python. Всё, что относится к этим подмодулям, следует импортировать напрямую из [`typing`](https://python-all.ru/3.10/library/typing.html#module-typing). (Предложено Себастьяном Риттау в [bpo-38291](https://python-all.ru/3.10/whatsnew/3.10.html).)10541055## Удалено10561057- Удалены специальные методы `__int__`, `__float__`, `__floordiv__`, `__mod__`, `__divmod__`, `__rfloordiv__`, `__rmod__` и `__rdivmod__` класса [`complex`](https://python-all.ru/3.10/library/functions.html#complex). Они всегда вызывали [`TypeError`](https://python-all.ru/3.10/library/exceptions.html#TypeError). (Предложено Сергеем Сторчакой в [bpo-41974](https://python-all.ru/3.10/whatsnew/3.10.html).)1058- Метод `ParserBase.error()` из приватного и недокументированного модуля `_markupbase` был удалён. [`html.parser.HTMLParser`](https://python-all.ru/3.10/library/html.parser.html#html.parser.HTMLParser) – единственный подкласс `ParserBase`, и его реализация `error()` уже была удалена в Python 3.5. (Предложено Беркером Пексагом в [bpo-31844](https://python-all.ru/3.10/whatsnew/3.10.html).)1059- Удалён атрибут `unicodedata.ucnhash_CAPI`, который был внутренним объектом PyCapsule. Соответствующая приватная структура `_PyUnicode_Name_CAPI` была перемещена во внутренний C API. (Предложено Виктором Стиннером в [bpo-42157](https://python-all.ru/3.10/whatsnew/3.10.html).)1060- Удалён модуль `parser`, который был объявлен устаревшим в версии 3.9 из-за перехода на новый PEG-парсер, а также все исходные C-файлы и заголовочные файлы, которые использовались только старым парсером, включая `node.h`, `parser.h`, `graminit.h` и `grammar.h`.1061- Удалены функции публичного C API `PyParser_SimpleParseStringFlags`, `PyParser_SimpleParseStringFlagsFilename`, `PyParser_SimpleParseFileFlags` и `PyNode_Compile`, которые были объявлены устаревшими в версии 3.9 из-за перехода на новый PEG-парсер.1062- Удалён модуль `formatter`, который был объявлен устаревшим в Python 3.4. Он несколько устарел, мало используется и не тестируется. Изначально его планировалось удалить в Python 3.6, но такие удаления были отложены до окончания поддержки Python 2.7. Текущим пользователям следует скопировать используемые классы в свой код. (Предложено Донг-хи На и Терри Дж. Риди в [bpo-42299](https://python-all.ru/3.10/whatsnew/3.10.html).)1063- Удалена функция `PyModule_GetWarningsModule()`, которая стала бесполезной после того, как модуль \_warnings был преобразован во встроенный модуль в версии 2.6. (Предложено Хай Ши в [bpo-42599](https://python-all.ru/3.10/whatsnew/3.10.html).)1064- Удалены устаревшие псевдонимы для [абстрактных базовых классов коллекций](https://python-all.ru/3.10/library/collections.abc.html#collections-abstract-base-classes) из модуля [`collections`](https://python-all.ru/3.10/library/collections.html#module-collections). (Автор: Victor Stinner в [bpo-37324](https://python-all.ru/3.10/whatsnew/3.10.html).)1065- Параметр `loop` был удалён из большинства [высокоуровневого API](https://python-all.ru/3.10/library/asyncio-api-index.html) [`asyncio`](https://python-all.ru/3.10/library/asyncio.html#module-asyncio) после объявления устаревшим в Python 3.8. Причины этого изменения многообразны:10661067 1. Это упрощает высокоуровневый API.1068 2. Функции высокоуровневого API неявно получают работающий цикл событий текущего потока, начиная с Python 3.7. В большинстве обычных случаев нет необходимости передавать цикл событий в API.1069 3. Передача цикла событий чревата ошибками, особенно при работе с циклами, выполняющимися в разных потоках.10701071 Обратите внимание: низкоуровневый API по-прежнему принимает `loop`. Примеры замены существующего кода см. в разделе [Изменения в Python API](https://python-all.ru/3.10/whatsnew/3.10.html#changes-python-api).10721073 (Авторы: Yurii Karabas, Andrew Svetlov, Yury Selivanov и Kyle Stanley в [bpo-42392](https://python-all.ru/3.10/whatsnew/3.10.html).)10741075## Перенос на Python 3.1010761077В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.10781079### Изменения в синтаксисе Python10801081- Теперь выдаётся предупреждение об устаревании при компиляции ранее допустимого синтаксиса, если числовой литерал непосредственно предшествует ключевому слову (как в `0in x`). В будущих версиях это станет синтаксическим предупреждением, а затем синтаксической ошибкой. Чтобы избавиться от предупреждения и обеспечить совместимость с будущими версиями, просто добавьте пробел между числовым литералом и следующим ключевым словом. (Автор: Serhiy Storchaka в [bpo-43833](https://python-all.ru/3.10/whatsnew/3.10.html).)10821083### Изменения в Python API10841085- Параметры *etype* функций [`format_exception()`](https://python-all.ru/3.10/library/traceback.html#traceback.format_exception), [`format_exception_only()`](https://python-all.ru/3.10/library/traceback.html#traceback.format_exception_only) и [`print_exception()`](https://python-all.ru/3.10/library/traceback.html#traceback.print_exception) в модуле [`traceback`](https://python-all.ru/3.10/library/traceback.html#module-traceback) переименованы в *exc*. (Авторы: Zackery Spytz и Matthias Bussonnier в [bpo-26389](https://python-all.ru/3.10/whatsnew/3.10.html).)1086- [`atexit`](https://python-all.ru/3.10/library/atexit.html#module-atexit): При завершении Python, если колбэк, зарегистрированный с помощью [`atexit.register()`](https://python-all.ru/3.10/library/atexit.html#atexit.register), завершается ошибкой, его исключение теперь записывается в журнал. Ранее регистрировались только некоторые исключения, а последнее исключение всегда молча игнорировалось. (Автор: Victor Stinner в [bpo-42639](https://python-all.ru/3.10/whatsnew/3.10.html).)1087- Обобщённый тип [`collections.abc.Callable`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Callable) теперь уплощает параметры типа, аналогично тому, что делает [`typing.Callable`](https://python-all.ru/3.10/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.10/library/typing.html#typing.get_args) или `__args__`, должен учитывать это изменение. Кроме того, [`TypeError`](https://python-all.ru/3.10/library/exceptions.html#TypeError) может быть возбуждено для некорректных форм параметризации [`collections.abc.Callable`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Callable), которые в Python 3.9 могли проходить незамеченными. (Автор: Ken Jin в [bpo-42195](https://python-all.ru/3.10/whatsnew/3.10.html).)1088- [`socket.htons()`](https://python-all.ru/3.10/library/socket.html#socket.htons) и [`socket.ntohs()`](https://python-all.ru/3.10/library/socket.html#socket.ntohs) теперь возбуждают [`OverflowError`](https://python-all.ru/3.10/library/exceptions.html#OverflowError) вместо [`DeprecationWarning`](https://python-all.ru/3.10/library/exceptions.html#DeprecationWarning), если заданный параметр не помещается в 16-битное целое без знака. (Автор: Erlend E. Aasland в [bpo-42393](https://python-all.ru/3.10/whatsnew/3.10.html).)1089- Параметр `loop` был удалён из большинства [высокоуровневого API](https://python-all.ru/3.10/library/asyncio-api-index.html) [`asyncio`](https://python-all.ru/3.10/library/asyncio.html#module-asyncio) после объявления устаревшим в Python 3.8.10901091 Корутина, которая сейчас выглядит так:10921093 ```python1094 async def foo(loop):1095 await asyncio.sleep(1, loop=loop)1096 ```10971098 Должна быть заменена на:10991100 ```python1101 async def foo():1102 await asyncio.sleep(1)1103 ```11041105 Если `foo()` была специально спроектирована *не* для работы в работающем цикле событий текущего потока (например, для работы в цикле событий другого потока), рассмотрите возможность использования [`asyncio.run_coroutine_threadsafe()`](https://python-all.ru/3.10/library/asyncio-task.html#asyncio.run_coroutine_threadsafe) вместо этого.11061107 (Авторы: Yurii Karabas, Andrew Svetlov, Yury Selivanov и Kyle Stanley в [bpo-42392](https://python-all.ru/3.10/whatsnew/3.10.html).)1108- Конструктор [`types.FunctionType`](https://python-all.ru/3.10/library/types.html#types.FunctionType) теперь наследует текущие встроенные функции, если словарь *globals* не содержит ключа `"__builtins__"`, вместо использования `{"None": None}` в качестве встроенных функций: такое же поведение, как у функций [`eval()`](https://python-all.ru/3.10/library/functions.html#eval) и [`exec()`](https://python-all.ru/3.10/library/functions.html#exec). Определение функции с помощью `def function(...): ...` в Python не затрагивается, глобальные переменные не могут быть переопределены этим синтаксисом: он также наследует текущие встроенные функции. (Автор: Victor Stinner в [bpo-42990](https://python-all.ru/3.10/whatsnew/3.10.html).)11091110### Изменения в C API11111112- Функции C API `PyParser_SimpleParseStringFlags`, `PyParser_SimpleParseStringFlagsFilename`, `PyParser_SimpleParseFileFlags`, `PyNode_Compile` и тип, используемый этими функциями, `struct _node`, были удалены из-за перехода на новый PEG-парсер.11131114 Исходный код теперь следует компилировать непосредственно в объект кода, например, с помощью [`Py_CompileString()`](https://python-all.ru/3.10/c-api/veryhigh.html#c.Py_CompileString). Полученный объект кода затем можно выполнить, например, с помощью [`PyEval_EvalCode()`](https://python-all.ru/3.10/c-api/veryhigh.html#c.PyEval_EvalCode).11151116 В частности:11171118 - Вызов `PyParser_SimpleParseStringFlags` с последующим `PyNode_Compile` можно заменить вызовом [`Py_CompileString()`](https://python-all.ru/3.10/c-api/veryhigh.html#c.Py_CompileString).1119 - Прямой замены для `PyParser_SimpleParseFileFlags` не существует. Чтобы скомпилировать код из аргумента `FILE *`, вам нужно будет прочитать файл на C и передать полученный буфер в [`Py_CompileString()`](https://python-all.ru/3.10/c-api/veryhigh.html#c.Py_CompileString).1120 - Чтобы скомпилировать файл по заданному имени файла `char *`, необходимо явно открыть файл, прочитать его и скомпилировать результат. Один из способов – использовать модуль [`io`](https://python-all.ru/3.10/library/io.html#module-io) с функциями [`PyImport_ImportModule()`](https://python-all.ru/3.10/c-api/import.html#c.PyImport_ImportModule), [`PyObject_CallMethod()`](https://python-all.ru/3.10/c-api/call.html#c.PyObject_CallMethod), [`PyBytes_AsString()`](https://python-all.ru/3.10/c-api/bytes.html#c.PyBytes_AsString) и [`Py_CompileString()`](https://python-all.ru/3.10/c-api/veryhigh.html#c.Py_CompileString), как показано ниже. (Объявления и обработка ошибок опущены.)11211122 ```python1123 io_module = Import_ImportModule("io");1124 fileobject = PyObject_CallMethod(io_module, "open", "ss", filename, "rb");1125 source_bytes_object = PyObject_CallMethod(fileobject, "read", "");1126 result = PyObject_CallMethod(fileobject, "close", "");1127 source_buf = PyBytes_AsString(source_bytes_object);1128 code = Py_CompileString(source_buf, filename, Py_file_input);1129 ```1130 - Для объектов `FrameObject` член `f_lasti` теперь представляет смещение в wordcode, а не просто смещение в строке байткода. Это означает, что это число необходимо умножить на 2 для использования с API, которые ожидают смещение в байтах (например, [`PyCode_Addr2Line()`](https://python-all.ru/3.10/c-api/code.html#c.PyCode_Addr2Line)). Также обратите внимание, что член `f_lasti` объектов `FrameObject` не считается стабильным: используйте вместо него [`PyFrame_GetLineNumber()`](https://python-all.ru/3.10/c-api/reflection.html#c.PyFrame_GetLineNumber).11311132## Изменения байткода CPython11331134- Инструкция `MAKE_FUNCTION` теперь принимает в качестве аннотаций функции либо словарь, либо кортеж строк. (Предложено Юрием Карабасом и Инадой Наоки в [bpo-42202](https://python-all.ru/3.10/whatsnew/3.10.html).)11351136## Изменения сборки11371138- [**PEP 644**](https://python-all.ru/3.10/whatsnew/3.10.html): Python теперь требует OpenSSL 1.1.1 или новее. OpenSSL 1.0.2 больше не поддерживается. (Предложено Кристианом Хаймсом в [bpo-43669](https://python-all.ru/3.10/whatsnew/3.10.html).)1139- Для сборки Python теперь требуются функции C99 `snprintf()` и `vsnprintf()`. (Предложено Виктором Штиннером в [bpo-36020](https://python-all.ru/3.10/whatsnew/3.10.html).)1140- [`sqlite3`](https://python-all.ru/3.10/library/sqlite3.html#module-sqlite3) требует SQLite 3.7.15 или выше. (Предложено Сергеем Федосеевым и Эрлендом Э. Аасландом в [bpo-40744](https://python-all.ru/3.10/whatsnew/3.10.html) и [bpo-40810](https://python-all.ru/3.10/whatsnew/3.10.html).)1141- Модуль [`atexit`](https://python-all.ru/3.10/library/atexit.html#module-atexit) теперь всегда должен быть встроенным модулем. (Предложено Виктором Штиннером в [bpo-42639](https://python-all.ru/3.10/whatsnew/3.10.html).)1142- Добавлена опция [`--disable-test-modules`](https://python-all.ru/3.10/using/configure.html#cmdoption-disable-test-modules) в скрипт `configure`: не собирать и не устанавливать тестовые модули. (Предложено Ксавье де Гаем, Томасом Петаззони и Пейсином Сином в [bpo-27640](https://python-all.ru/3.10/whatsnew/3.10.html).)1143- Добавлен [`--with-wheel-pkg-dir=PATH option`](https://python-all.ru/3.10/using/configure.html#cmdoption-with-wheel-pkg-dir) в скрипт `./configure`. Если указано, модуль [`ensurepip`](https://python-all.ru/3.10/library/ensurepip.html#module-ensurepip) ищет колесные пакеты `setuptools` и `pip` в этом каталоге: если оба присутствуют, эти колесные пакеты используются вместо встроенных колесных пакетов ensurepip.11441145 Некоторые политики упаковки дистрибутивов Linux рекомендуют не включать зависимости. Например, Fedora устанавливает пакеты wheel в каталог `/usr/share/python-wheels/` и не устанавливает пакет `ensurepip._bundled`.11461147 (Предложено Виктором Штиннером в [bpo-42856](https://python-all.ru/3.10/whatsnew/3.10.html).)1148- Добавлена новая [`configure --without-static-libpython option`](https://python-all.ru/3.10/using/configure.html#cmdoption-without-static-libpython), чтобы не собирать статическую библиотеку `libpythonMAJOR.MINOR.a` и не устанавливать объектный файл `python.o`.11491150 (Предложено Виктором Штиннером в [bpo-43103](https://python-all.ru/3.10/whatsnew/3.10.html).)1151- Скрипт `configure` теперь использует утилиту `pkg-config`, если она доступна, для определения местоположения заголовков и библиотек Tcl/Tk. Как и раньше, эти местоположения можно указать явно с помощью опций конфигурации [`--with-tcltk-includes`](https://python-all.ru/3.10/using/configure.html#cmdoption-with-tcltk-includes) и [`--with-tcltk-libs`](https://python-all.ru/3.10/using/configure.html#cmdoption-with-tcltk-libs). (Предложено Манолисом Стаматогианнакисом в [bpo-42603](https://python-all.ru/3.10/whatsnew/3.10.html).)1152- Добавлена опция [`--with-openssl-rpath`](https://python-all.ru/3.10/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.10/whatsnew/3.10.html).)11531154## Изменения C API11551156### PEP 652: Поддержание стабильного ABI11571158Стабильный ABI (интерфейс двоичного кода приложений) для модулей расширения или встраивания Python теперь явно определён. [Стабильность C API](https://python-all.ru/3.10/c-api/stable.html#stable) описывает гарантии стабильности C API и ABI, а также лучшие практики использования стабильного ABI.11591160(Предложено Петром Викториным в [**PEP 652**](https://python-all.ru/3.10/whatsnew/3.10.html) и [bpo-43795](https://python-all.ru/3.10/whatsnew/3.10.html).)11611162### Новые возможности11631164- Результат [`PyNumber_Index()`](https://python-all.ru/3.10/c-api/number.html#c.PyNumber_Index) теперь всегда имеет точный тип [`int`](https://python-all.ru/3.10/library/functions.html#int). Ранее результатом мог быть экземпляр подкласса `int`. (Предложено Сергеем Сторчакой в [bpo-40792](https://python-all.ru/3.10/whatsnew/3.10.html).)1165- Добавлен новый член [`orig_argv`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.orig_argv) в структуру [`PyConfig`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig): список исходных аргументов командной строки, переданных исполняемому файлу Python. (Предложено Виктором Штиннером в [bpo-23427](https://python-all.ru/3.10/whatsnew/3.10.html).)1166- Добавлены макросы [`PyDateTime_DATE_GET_TZINFO()`](https://python-all.ru/3.10/c-api/datetime.html#c.PyDateTime_DATE_GET_TZINFO) и [`PyDateTime_TIME_GET_TZINFO()`](https://python-all.ru/3.10/c-api/datetime.html#c.PyDateTime_TIME_GET_TZINFO) для доступа к атрибутам `tzinfo` объектов [`datetime.datetime`](https://python-all.ru/3.10/library/datetime.html#datetime.datetime) и [`datetime.time`](https://python-all.ru/3.10/library/datetime.html#datetime.time). (Предложено Закери Спайтцем в [bpo-30155](https://python-all.ru/3.10/whatsnew/3.10.html).)1167- Добавлена функция [`PyCodec_Unregister()`](https://python-all.ru/3.10/c-api/codec.html#c.PyCodec_Unregister) для отмены регистрации функции поиска кодеков. (Предложено Хай Ши в [bpo-41842](https://python-all.ru/3.10/whatsnew/3.10.html).)1168- Добавлена функция [`PyIter_Send()`](https://python-all.ru/3.10/c-api/iter.html#c.PyIter_Send), позволяющая отправить значение в итератор без возбуждения исключения `StopIteration`. (Предложено Владимиром Матвеевым в [bpo-41756](https://python-all.ru/3.10/whatsnew/3.10.html).)1169- Добавлен [`PyUnicode_AsUTF8AndSize()`](https://python-all.ru/3.10/c-api/unicode.html#c.PyUnicode_AsUTF8AndSize) в ограниченный C API. (Предложено Алексом Гейнором в [bpo-41784](https://python-all.ru/3.10/whatsnew/3.10.html).)1170- Добавлена функция [`PyModule_AddObjectRef()`](https://python-all.ru/3.10/c-api/module.html#c.PyModule_AddObjectRef): похожа на [`PyModule_AddObject()`](https://python-all.ru/3.10/c-api/module.html#c.PyModule_AddObject), но не крадёт ссылку на значение при успехе. (Предложено Виктором Штиннером в [bpo-1635741](https://python-all.ru/3.10/whatsnew/3.10.html).)1171- Добавлены функции [`Py_NewRef()`](https://python-all.ru/3.10/c-api/refcounting.html#c.Py_NewRef) и [`Py_XNewRef()`](https://python-all.ru/3.10/c-api/refcounting.html#c.Py_XNewRef) для увеличения счётчика ссылок объекта и возврата объекта. (Предложено Виктором Штиннером в [bpo-42262](https://python-all.ru/3.10/whatsnew/3.10.html).)1172- Функции [`PyType_FromSpecWithBases()`](https://python-all.ru/3.10/c-api/type.html#c.PyType_FromSpecWithBases) и [`PyType_FromModuleAndSpec()`](https://python-all.ru/3.10/c-api/type.html#c.PyType_FromModuleAndSpec) теперь принимают один класс в качестве аргумента *bases*. (Предложено Сергеем Сторчакой в [bpo-42423](https://python-all.ru/3.10/whatsnew/3.10.html).)1173- Функция [`PyType_FromModuleAndSpec()`](https://python-all.ru/3.10/c-api/type.html#c.PyType_FromModuleAndSpec) теперь принимает NULL-слот `tp_doc`. (Предложено Хай Ши в [bpo-41832](https://python-all.ru/3.10/whatsnew/3.10.html).)1174- Функция [`PyType_GetSlot()`](https://python-all.ru/3.10/c-api/type.html#c.PyType_GetSlot) может принимать [статические типы](https://python-all.ru/3.10/c-api/typeobj.html#static-types). (Предложено Хай Ши и Петром Викториным в [bpo-41073](https://python-all.ru/3.10/whatsnew/3.10.html).)1175- Добавлена новая функция [`PySet_CheckExact()`](https://python-all.ru/3.10/c-api/set.html#c.PySet_CheckExact) в C-API, проверяющая, является ли объект экземпляром [`set`](https://python-all.ru/3.10/library/stdtypes.html#set), но не экземпляром подтипа. (Автор: Pablo Galindo в [bpo-43277](https://python-all.ru/3.10/whatsnew/3.10.html).)1176- Добавлена функция [`PyErr_SetInterruptEx()`](https://python-all.ru/3.10/c-api/exceptions.html#c.PyErr_SetInterruptEx), позволяющая передавать номер сигнала для имитации. (Автор: Antoine Pitrou в [bpo-43356](https://python-all.ru/3.10/whatsnew/3.10.html).)1177- Ограниченный C-API теперь поддерживается, если [Python собран в режиме отладки](https://python-all.ru/3.10/using/configure.html#debug-build) (если определён макрос `Py_DEBUG`). В ограниченном C-API функции [`Py_INCREF()`](https://python-all.ru/3.10/c-api/refcounting.html#c.Py_INCREF) и [`Py_DECREF()`](https://python-all.ru/3.10/c-api/refcounting.html#c.Py_DECREF) теперь реализованы как вызовы непрозрачных функций, а не как прямой доступ к члену [`PyObject.ob_refcnt`](https://python-all.ru/3.10/c-api/typeobj.html#c.PyObject.ob_refcnt), если Python собран в режиме отладки и макрос `Py_LIMITED_API` нацелен на Python 3.10 или новее. Поддержка ограниченного C-API в режиме отладки стала возможна благодаря тому, что структура [`PyObject`](https://python-all.ru/3.10/c-api/structures.html#c.PyObject) одинакова в релизном и отладочном режимах начиная с Python 3.8 (см. [bpo-36465](https://python-all.ru/3.10/whatsnew/3.10.html)).11781179 Ограниченный C-API по-прежнему не поддерживается в специальной сборке [`--with-trace-refs`](https://python-all.ru/3.10/using/configure.html#cmdoption-with-trace-refs) (макрос `Py_TRACE_REFS`). (Автор: Victor Stinner в [bpo-43688](https://python-all.ru/3.10/whatsnew/3.10.html).)1180- Добавлена функция [`Py_Is(x, y)`](https://python-all.ru/3.10/c-api/structures.html#c.Py_Is) для проверки, является ли объект *x* тем же объектом *y*, что аналогично `x is y` в Python. Также добавлены функции [`Py_IsNone()`](https://python-all.ru/3.10/c-api/structures.html#c.Py_IsNone), [`Py_IsTrue()`](https://python-all.ru/3.10/c-api/structures.html#c.Py_IsTrue), [`Py_IsFalse()`](https://python-all.ru/3.10/c-api/structures.html#c.Py_IsFalse) для проверки, является ли объект соответственно синглтоном `None`, синглтоном `True` или синглтоном `False`. (Автор: Victor Stinner в [bpo-43753](https://python-all.ru/3.10/whatsnew/3.10.html).)1181- Добавлены новые функции для управления сборщиком мусора из C-кода: [`PyGC_Enable()`](https://python-all.ru/3.10/c-api/gcsupport.html#c.PyGC_Enable), [`PyGC_Disable()`](https://python-all.ru/3.10/c-api/gcsupport.html#c.PyGC_Disable), [`PyGC_IsEnabled()`](https://python-all.ru/3.10/c-api/gcsupport.html#c.PyGC_IsEnabled). Эти функции позволяют активировать, деактивировать и запрашивать состояние сборщика мусора из C-кода без необходимости импорта модуля [`gc`](https://python-all.ru/3.10/library/gc.html#module-gc).1182- Добавлен новый флаг типа `Py_TPFLAGS_DISALLOW_INSTANTIATION` для запрета создания экземпляров типа. (Автор: Victor Stinner в [bpo-43916](https://python-all.ru/3.10/whatsnew/3.10.html).)1183- Добавлен новый флаг типа `Py_TPFLAGS_IMMUTABLETYPE` для создания неизменяемых объектов типа: атрибуты типа нельзя ни установить, ни удалить. (Авторы: Victor Stinner и Erlend E. Aasland в [bpo-43908](https://python-all.ru/3.10/whatsnew/3.10.html).)11841185### Перенос на Python 3.1011861187- Теперь для использования форматов [`PyArg_ParseTuple()`](https://python-all.ru/3.10/c-api/arg.html#c.PyArg_ParseTuple) и [`Py_BuildValue()`](https://python-all.ru/3.10/c-api/arg.html#c.Py_BuildValue), которые используют `#`, должен быть определён макрос `PY_SSIZE_T_CLEAN`: `es#`, `et#`, `s#`, `u#`, `y#`, `z#`, `U#` и `Z#`. См. [Разбор аргументов и формирование значений](https://python-all.ru/3.10/c-api/arg.html#arg-parsing) и [**PEP 353**](https://python-all.ru/3.10/whatsnew/3.10.html). (Автор: Victor Stinner в [bpo-40943](https://python-all.ru/3.10/whatsnew/3.10.html).)1188- Поскольку [`Py_REFCNT()`](https://python-all.ru/3.10/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.10/c-api/structures.html#c.Py_SET_REFCNT) (доступно начиная с Python 3.9). Для обратной совместимости может использоваться этот макрос:11891190 ```python1191 #if PY_VERSION_HEX < 0x030900A41192 # define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0)1193 #endif1194 ```11951196 (Автор: Victor Stinner в [bpo-39573](https://python-all.ru/3.10/whatsnew/3.10.html).)1197- Вызов [`PyDict_GetItem()`](https://python-all.ru/3.10/c-api/dict.html#c.PyDict_GetItem) без удержания [GIL](https://python-all.ru/3.10/glossary.html#term-GIL) ранее допускался по историческим причинам. Теперь это запрещено. (Автор: Victor Stinner в [bpo-40839](https://python-all.ru/3.10/whatsnew/3.10.html).)1198- `PyUnicode_FromUnicode(NULL, size)` и `PyUnicode_FromStringAndSize(NULL, size)` теперь возбуждают `DeprecationWarning`. Для выделения объекта Unicode без начальных данных используйте [`PyUnicode_New()`](https://python-all.ru/3.10/c-api/unicode.html#c.PyUnicode_New). (Автор: Inada Naoki в [bpo-36346](https://python-all.ru/3.10/whatsnew/3.10.html).)1199- Приватная структура `_PyUnicode_Name_CAPI` `unicodedata.ucnhash_CAPI` API PyCapsule перемещена во внутренний C-API. (Автор: Victor Stinner в [bpo-42157](https://python-all.ru/3.10/whatsnew/3.10.html).)1200- Функции [`Py_GetPath()`](https://python-all.ru/3.10/c-api/init.html#c.Py_GetPath), [`Py_GetPrefix()`](https://python-all.ru/3.10/c-api/init.html#c.Py_GetPrefix), [`Py_GetExecPrefix()`](https://python-all.ru/3.10/c-api/init.html#c.Py_GetExecPrefix), [`Py_GetProgramFullPath()`](https://python-all.ru/3.10/c-api/init.html#c.Py_GetProgramFullPath), [`Py_GetPythonHome()`](https://python-all.ru/3.10/c-api/init.html#c.Py_GetPythonHome) и [`Py_GetProgramName()`](https://python-all.ru/3.10/c-api/init.html#c.Py_GetProgramName) теперь возвращают `NULL`, если они вызваны до [`Py_Initialize()`](https://python-all.ru/3.10/c-api/init.html#c.Py_Initialize) (до инициализации Python). Используйте новый API [Начальная конфигурация Python](https://python-all.ru/3.10/c-api/init_config.html#init-config) для получения [Конфигурации путей Python](https://python-all.ru/3.10/c-api/init_config.html#init-path-config). (Автор: Victor Stinner в [bpo-42260](https://python-all.ru/3.10/whatsnew/3.10.html).)1201- Макросы [`PyList_SET_ITEM()`](https://python-all.ru/3.10/c-api/list.html#c.PyList_SET_ITEM), [`PyTuple_SET_ITEM()`](https://python-all.ru/3.10/c-api/tuple.html#c.PyTuple_SET_ITEM) и [`PyCell_SET()`](https://python-all.ru/3.10/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.10/whatsnew/3.10.html).)1202- Файлы `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.10/c-api/intro.html#api-includes). Если они были включены напрямую, рассмотрите включение `Python.h` вместо этого. (Автор: Nicholas Sim в [bpo-35134](https://python-all.ru/3.10/whatsnew/3.10.html).)1203- Используйте флаг типа `Py_TPFLAGS_IMMUTABLETYPE` для создания неизменяемых объектов типа. Не полагайтесь на `Py_TPFLAGS_HEAPTYPE`, чтобы определить, является ли объект типа изменяемым; вместо этого проверяйте, установлен ли `Py_TPFLAGS_IMMUTABLETYPE`. (Авторы: Victor Stinner и Erlend E. Aasland в [bpo-43908](https://python-all.ru/3.10/whatsnew/3.10.html).)1204- Незадокументированная функция `Py_FrozenMain` удалена из ограниченного API. Эта функция в основном полезна для пользовательских сборок Python. (Автор: Petr Viktorin в [bpo-26241](https://python-all.ru/3.10/whatsnew/3.10.html).)12051206### Устарело12071208- Функция `PyUnicode_InternImmortal()` теперь устарела и будет удалена в Python 3.12; используйте [`PyUnicode_InternInPlace()`](https://python-all.ru/3.10/c-api/unicode.html#c.PyUnicode_InternInPlace) вместо неё. (Автор: Victor Stinner в [bpo-41692](https://python-all.ru/3.10/whatsnew/3.10.html).)12091210### Удалено12111212- Удалены функции `Py_UNICODE_str*`, работающие со строками `Py_UNICODE*`. (Автор: Inada Naoki в [bpo-41123](https://python-all.ru/3.10/whatsnew/3.10.html).)12131214 > - `Py_UNICODE_strlen`: используйте [`PyUnicode_GetLength()`](https://python-all.ru/3.10/c-api/unicode.html#c.PyUnicode_GetLength) или [`PyUnicode_GET_LENGTH`](https://python-all.ru/3.10/c-api/unicode.html#c.PyUnicode_GET_LENGTH)1215 > - `Py_UNICODE_strcat`: используйте [`PyUnicode_CopyCharacters()`](https://python-all.ru/3.10/c-api/unicode.html#c.PyUnicode_CopyCharacters) или [`PyUnicode_FromFormat()`](https://python-all.ru/3.10/c-api/unicode.html#c.PyUnicode_FromFormat)1216 > - `Py_UNICODE_strcpy`, `Py_UNICODE_strncpy`: используйте [`PyUnicode_CopyCharacters()`](https://python-all.ru/3.10/c-api/unicode.html#c.PyUnicode_CopyCharacters) или [`PyUnicode_Substring()`](https://python-all.ru/3.10/c-api/unicode.html#c.PyUnicode_Substring)1217 > - `Py_UNICODE_strcmp`: используйте [`PyUnicode_Compare()`](https://python-all.ru/3.10/c-api/unicode.html#c.PyUnicode_Compare)1218 > - `Py_UNICODE_strncmp`: используйте [`PyUnicode_Tailmatch()`](https://python-all.ru/3.10/c-api/unicode.html#c.PyUnicode_Tailmatch)1219 > - `Py_UNICODE_strchr`, `Py_UNICODE_strrchr`: используйте [`PyUnicode_FindChar()`](https://python-all.ru/3.10/c-api/unicode.html#c.PyUnicode_FindChar)1220- Удалена `PyUnicode_GetMax()`. Переходите на новые API ([**PEP 393**](https://python-all.ru/3.10/whatsnew/3.10.html)). (Автор: Inada Naoki в [bpo-41103](https://python-all.ru/3.10/whatsnew/3.10.html).)1221- Удалена `PyLong_FromUnicode()`. Переходите на [`PyLong_FromUnicodeObject()`](https://python-all.ru/3.10/c-api/long.html#c.PyLong_FromUnicodeObject). (Автор: Inada Naoki в [bpo-41103](https://python-all.ru/3.10/whatsnew/3.10.html).)1222- Удалено `PyUnicode_AsUnicodeCopy()`. Используйте [`PyUnicode_AsUCS4Copy()`](https://python-all.ru/3.10/c-api/unicode.html#c.PyUnicode_AsUCS4Copy) или [`PyUnicode_AsWideCharString()`](https://python-all.ru/3.10/c-api/unicode.html#c.PyUnicode_AsWideCharString) (Автор: Inada Naoki, [bpo-41103](https://python-all.ru/3.10/whatsnew/3.10.html).)1223- Удалена переменная `_Py_CheckRecursionLimit`: она заменена на `ceval.recursion_limit` структуры [`PyInterpreterState`](https://python-all.ru/3.10/c-api/init.html#c.PyInterpreterState). (Автор: Victor Stinner, [bpo-41834](https://python-all.ru/3.10/whatsnew/3.10.html).)1224- Удалены недокументированные макросы `Py_ALLOW_RECURSION` и `Py_END_ALLOW_RECURSION`, а также поле `recursion_critical` структуры [`PyInterpreterState`](https://python-all.ru/3.10/c-api/init.html#c.PyInterpreterState). (Автор: Serhiy Storchaka, [bpo-41936](https://python-all.ru/3.10/whatsnew/3.10.html).)1225- Удалена недокументированная функция `PyOS_InitInterrupts()`. При инициализации Python уже неявно устанавливает обработчики сигналов: см. [`PyConfig.install_signal_handlers`](https://python-all.ru/3.10/c-api/init_config.html#c.PyConfig.install_signal_handlers). (Автор: Victor Stinner, [bpo-41713](https://python-all.ru/3.10/whatsnew/3.10.html).)1226- 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.10/whatsnew/3.10.html)). (Contributed by Victor Stinner in [bpo-43244](https://python-all.ru/3.10/whatsnew/3.10.html).)1227- Удалены заголовочный файл `symtable.h` и недокументированные функции:12281229 - `PyST_GetScope()`1230 - `PySymtable_Build()`1231 - `PySymtable_BuildObject()`1232 - `PySymtable_Free()`1233 - `Py_SymtableString()`1234 - `Py_SymtableStringObject()`12351236 Функция `Py_SymtableString()` по ошибке была частью стабильного ABI, но не могла использоваться, так как заголовочный файл `symtable.h` был исключён из ограниченного C API.12371238 Вместо этого используйте модуль Python [`symtable`](https://python-all.ru/3.10/library/symtable.html#module-symtable). (Автор: Victor Stinner, [bpo-43244](https://python-all.ru/3.10/whatsnew/3.10.html).)1239- Удалён [`PyOS_ReadlineFunctionPointer()`](https://python-all.ru/3.10/c-api/veryhigh.html#c.PyOS_ReadlineFunctionPointer) из заголовков ограниченного C API и из `python3.dll` (библиотеки, предоставляющей стабильный ABI в Windows). Поскольку функция принимает аргумент `FILE*`, её стабильность ABI не может быть гарантирована. (Автор: Petr Viktorin, [bpo-43868](https://python-all.ru/3.10/whatsnew/3.10.html).)1240- Удалены заголовочные файлы `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.10/library/ast.html#module-ast). (Автор: Victor Stinner, [bpo-43244](https://python-all.ru/3.10/whatsnew/3.10.html).)1241- Удалены функции компилятора и парсера, использующие тип `struct _mod`, так как публичный C API для AST был удалён:12421243 - `PyAST_Compile()`1244 - `PyAST_CompileEx()`1245 - `PyAST_CompileObject()`1246 - `PyFuture_FromAST()`1247 - `PyFuture_FromASTObject()`1248 - `PyParser_ASTFromFile()`1249 - `PyParser_ASTFromFileObject()`1250 - `PyParser_ASTFromFilename()`1251 - `PyParser_ASTFromString()`1252 - `PyParser_ASTFromStringObject()`12531254 Эти функции были недокументированы и исключены из ограниченного C API. (Автор: Victor Stinner, [bpo-43244](https://python-all.ru/3.10/whatsnew/3.10.html).)1255- Удалён заголовочный файл `pyarena.h` с функциями:12561257 - `PyArena_New()`1258 - `PyArena_Free()`1259 - `PyArena_Malloc()`1260 - `PyArena_AddPyObject()`12611262 Эти функции были недокументированы, исключены из ограниченного C API и использовались только внутри компилятора. (Автор: Victor Stinner, [bpo-43244](https://python-all.ru/3.10/whatsnew/3.10.html).)1263- Элемент `PyThreadState.use_tracing` удалён для оптимизации Python. (Автор: Mark Shannon, [bpo-43760](https://python-all.ru/3.10/whatsnew/3.10.html).)12641265## Важная функция безопасности в 3.10.712661267Преобразование между [`int`](https://python-all.ru/3.10/library/functions.html#int) и [`str`](https://python-all.ru/3.10/library/stdtypes.html#str) в системах счисления, отличных от 2 (двоичной), 4, 8 (восьмеричной), 16 (шестнадцатеричной) или 32, например, 10 (десятичной), теперь вызывает [`ValueError`](https://python-all.ru/3.10/library/exceptions.html#ValueError), если количество цифр в строковом представлении превышает предельное значение, чтобы избежать потенциальных атак типа «отказ в обслуживании» из-за алгоритмической сложности. Это мера смягчения последствий для [CVE-2020-10735](https://python-all.ru/3.10/whatsnew/3.10.html). Этот предел можно настроить или отключить с помощью переменной окружения, флага командной строки или [`sys`](https://python-all.ru/3.10/library/sys.html#module-sys) API. См. документацию [ограничение длины преобразования целых чисел в строку](https://python-all.ru/3.10/library/stdtypes.html#int-max-str-digits). Значение по умолчанию – 4300 цифр в строковом представлении.12681269## Важная функция безопасности в 3.10.812701271Устаревший модуль [`mailcap`](https://python-all.ru/3.10/library/mailcap.html#module-mailcap) теперь отказывается внедрять небезопасный текст (имена файлов, MIME-типы, параметры) в команды оболочки. Вместо использования такого текста он выдаст предупреждение и будет действовать так, как если бы совпадение не было найдено (или для тестовых команд, как если бы тест провалился). (Автор: Petr Viktorin, [gh-98966](https://python-all.ru/3.10/whatsnew/3.10.html).)12721273## Заметные изменения в 3.10.1212741275### tarfile12761277- Методы извлечения в [`tarfile`](https://python-all.ru/3.10/library/tarfile.html#module-tarfile) и [`shutil.unpack_archive()`](https://python-all.ru/3.10/library/shutil.html#shutil.unpack_archive) получили новый аргумент *filter*, позволяющий ограничивать возможности tar, которые могут быть неожиданными или опасными, например создание файлов за пределами целевого каталога. Подробнее см. [Extraction filters](https://python-all.ru/3.10/library/tarfile.html#tarfile-extraction-filter). В Python 3.12 использование без аргумента *filter* вызовет [`DeprecationWarning`](https://python-all.ru/3.10/library/exceptions.html#DeprecationWarning). В Python 3.14 значение по умолчанию будет изменено на `'data'`. (Автор: Petr Viktorin в [**PEP 706**](https://python-all.ru/3.10/whatsnew/3.10.html).)12781279## Заметные изменения в 3.10.1512801281### ipaddress12821283- Исправлено поведение `is_global` и `is_private` в `IPv4Address`, `IPv6Address`, `IPv4Network` и `IPv6Network`.12841285### email12861287- Заголовки с символами новой строки внутри теперь заключаются в кавычки при выводе.12881289 [`generator`](https://python-all.ru/3.10/library/email.generator.html#module-email.generator) теперь будет отказываться сериализовать (записывать) заголовки, которые неправильно свёрнуты или разделены, так что они будут распознаны как несколько заголовков или объединены с соседними данными. Если необходимо отключить эту защиту, установите [`verify_generated_headers`](https://python-all.ru/3.10/library/email.policy.html#email.policy.Policy.verify_generated_headers). (Авторы: Bas Bloemsaat и Petr Viktorin в [gh-121650](https://python-all.ru/3.10/whatsnew/3.10.html).)1290- [`email.utils.getaddresses()`](https://python-all.ru/3.10/library/email.utils.html#email.utils.getaddresses) и [`email.utils.parseaddr()`](https://python-all.ru/3.10/library/email.utils.html#email.utils.parseaddr) теперь возвращают `('', '')` 2-кортежи в большем количестве случаев, когда встречаются недопустимые адреса электронной почты, вместо потенциально неточных значений. В эти две функции добавлен необязательный параметр *strict*: используйте `strict=False` для получения старого поведения, принимающего некорректные входные данные. `getattr(email.utils, 'supports_strict_parsing', False)` можно использовать для проверки доступности параметра *strict*. (Авторы: Thomas Dwyer и Victor Stinner для [gh-102988](https://python-all.ru/3.10/whatsnew/3.10.html), улучшение исправления CVE-2023-27043.)12911292## Заметные изменения в 3.10.1812931294### os.path12951296- Параметр *strict* для [`os.path.realpath()`](https://python-all.ru/3.10/library/os.path.html#os.path.realpath) принимает новое значение: [`os.path.ALLOW_MISSING`](https://python-all.ru/3.10/library/os.path.html#os.path.ALLOW_MISSING). При его использовании исключения, отличные от [`FileNotFoundError`](https://python-all.ru/3.10/library/exceptions.html#FileNotFoundError), будут возбуждены повторно; итоговый путь может отсутствовать, но он будет свободен от символьных ссылок. (Автор: Petr Viktorin, CVE 2025-4517.)12971298### tarfile12991300- [`data_filter()`](https://python-all.ru/3.10/library/tarfile.html#tarfile.data_filter) теперь нормализует цели символьных ссылок, чтобы избежать атак обхода пути. (Автор: Petr Viktorin в [gh-127987](https://python-all.ru/3.10/whatsnew/3.10.html) и CVE 2025-4138.)1301- [`extractall()`](https://python-all.ru/3.10/library/tarfile.html#tarfile.TarFile.extractall) теперь пропускает исправление атрибутов каталога, когда каталог был удалён или заменён файлом другого типа. (Автор: Petr Viktorin в [gh-127987](https://python-all.ru/3.10/whatsnew/3.10.html) и CVE 2024-12718.)1302- [`extract()`](https://python-all.ru/3.10/library/tarfile.html#tarfile.TarFile.extract) и [`extractall()`](https://python-all.ru/3.10/library/tarfile.html#tarfile.TarFile.extractall) теперь (заново) применяют фильтр извлечения при замене ссылки (жёсткой или символьной) копией другого члена архива, а также при исправлении атрибутов каталога. Первый вызывает новое исключение [`LinkFallbackError`](https://python-all.ru/3.10/library/tarfile.html#tarfile.LinkFallbackError). (Автор: Petr Viktorin, CVE 2025-4330 и CVE 2024-12718.)1303- [`extract()`](https://python-all.ru/3.10/library/tarfile.html#tarfile.TarFile.extract) и [`extractall()`](https://python-all.ru/3.10/library/tarfile.html#tarfile.TarFile.extractall) больше не извлекают отклонённые члены, когда [`errorlevel()`](https://python-all.ru/3.10/library/tarfile.html#tarfile.TarFile.errorlevel) равен нулю. (Авторы: Matt Prodani и Petr Viktorin в [gh-112887](https://python-all.ru/3.10/whatsnew/3.10.html) и CVE 2025-4435.)1304