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

3.10.md

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

1> **Источник:** https://python-all.ru/3.13/whatsnew/3.10.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Что нового в Python 3.1089**Редактор:**1011Pablo Galindo Salgado1213В этой статье описаны новые возможности Python 3.10 по сравнению с 3.9. Python 3.10 был выпущен 4 октября 2021 года. Полную информацию см. в [журнале изменений](https://python-all.ru/3.13/whatsnew/changelog.html#changelog).1415## Итоги – основные изменения1617Новые синтаксические возможности:1819- [**PEP 634**](https://python-all.ru/3.13/whatsnew/3.10.html), Структурное сопоставление с образцом: спецификация20- [**PEP 635**](https://python-all.ru/3.13/whatsnew/3.10.html), Структурное сопоставление с образцом: мотивация и обоснование21- [**PEP 636**](https://python-all.ru/3.13/whatsnew/3.10.html), Структурное сопоставление с образцом: руководство22- [bpo-12782](https://python-all.ru/3.13/whatsnew/3.10.html), теперь официально разрешены контекстные менеджеры в скобках.2324Новые возможности в стандартной библиотеке:2526- [**PEP 618**](https://python-all.ru/3.13/whatsnew/3.10.html), добавление опциональной проверки длины в zip.2728Улучшения интерпретатора:2930- [**PEP 626**](https://python-all.ru/3.13/whatsnew/3.10.html), точные номера строк для отладки и других инструментов.3132Новые возможности типизации:3334- [**PEP 604**](https://python-all.ru/3.13/whatsnew/3.10.html), разрешение записи объединённых типов как X | Y35- [**PEP 612**](https://python-all.ru/3.13/whatsnew/3.10.html), переменные спецификации параметров36- [**PEP 613**](https://python-all.ru/3.13/whatsnew/3.10.html), явные псевдонимы типов37- [**PEP 647**](https://python-all.ru/3.13/whatsnew/3.10.html), пользовательские гарды типов3839Важные устаревания, удаления и ограничения:4041- [**PEP 644**](https://python-all.ru/3.13/whatsnew/3.10.html), требуется OpenSSL 1.1.1 или новее42- [**PEP 632**](https://python-all.ru/3.13/whatsnew/3.10.html), устаревание модуля distutils.43- [**PEP 623**](https://python-all.ru/3.13/whatsnew/3.10.html), устаревание и подготовка к удалению элемента wstr в PyUnicodeObject.44- [**PEP 624**](https://python-all.ru/3.13/whatsnew/3.10.html), удаление API кодировщиков Py\_UNICODE45- [**PEP 597**](https://python-all.ru/3.13/whatsnew/3.10.html), добавление опционального EncodingWarning4647## Новые возможности4849### Контекстные менеджеры в скобках5051Теперь поддерживается использование круглых скобок для переноса на несколько строк в контекстных менеджерах. Это позволяет форматировать длинный набор контекстных менеджеров на нескольких строках аналогично тому, как это было возможно ранее с операторами import. Например, все эти примеры теперь являются допустимыми:5253```python54with (CtxManager() as example):55    ...5657with (58    CtxManager1(),59    CtxManager2()60):61    ...6263with (CtxManager1() as example,64      CtxManager2()):65    ...6667with (CtxManager1(),68      CtxManager2() as example):69    ...7071with (72    CtxManager1() as example1,73    CtxManager2() as example274):75    ...76```7778также можно использовать завершающую запятую в конце заключённой группы:7980```python81with (82    CtxManager1() as example1,83    CtxManager2() as example2,84    CtxManager3() as example3,85):86    ...87```8889Этот новый синтаксис использует не LL(1) возможности нового парсера. Подробнее см. [**PEP 617**](https://python-all.ru/3.13/whatsnew/3.10.html).9091(Авторы: Guido van Rossum, Pablo Galindo и Lysandros Nikolaou в [bpo-12782](https://python-all.ru/3.13/whatsnew/3.10.html) и [bpo-40334](https://python-all.ru/3.13/whatsnew/3.10.html).)9293### Улучшенные сообщения об ошибках9495#### SyntaxErrors9697При разборе кода, содержащего незакрытые скобки или квадратные скобки, интерпретатор теперь указывает местоположение незакрытой скобки вместо отображения *SyntaxError: unexpected EOF while parsing* или указания на некорректное местоположение. Например, рассмотрим следующий код (обратите внимание на незакрытую ‘{‘):9899```python100expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,101            38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6,102some_other_code = foo()103```104105Предыдущие версии интерпретатора сообщали о запутанных местах как о местоположении синтаксической ошибки:106107```python108File "example.py", line 3109    some_other_code = foo()110                    ^111SyntaxError: invalid syntax112```113114но в Python 3.10 выводится более информативная ошибка:115116```python117File "example.py", line 1118    expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,119               ^120SyntaxError: '{' was never closed121```122123Аналогично, ошибки, связанные с незакрытыми строковыми литералами (одинарные и тройные кавычки), теперь указывают на начало строки вместо сообщения EOF/EOL.124125Эти улучшения вдохновлены предыдущей работой в интерпретаторе PyPy.126127(Авторы: Pablo Galindo в [bpo-42864](https://python-all.ru/3.13/whatsnew/3.10.html) и Batuhan Taskaya в [bpo-40176](https://python-all.ru/3.13/whatsnew/3.10.html).)128129[`SyntaxError`](https://python-all.ru/3.13/library/exceptions.html#SyntaxError) исключения, вызываемые интерпретатором, теперь будут подсвечивать полный диапазон выражения, которое составляет саму синтаксическую ошибку, а не только место, где обнаружена проблема. Таким образом, вместо отображения (до Python 3.10):130131```python132>>> foo(x, z for z in range(10), t, w)133  File "<stdin>", line 1134    foo(x, z for z in range(10), t, w)135           ^136SyntaxError: Generator expression must be parenthesized137```138139теперь Python 3.10 будет отображать исключение как:140141```python142>>> foo(x, z for z in range(10), t, w)143  File "<stdin>", line 1144    foo(x, z for z in range(10), t, w)145           ^^^^^^^^^^^^^^^^^^^^146SyntaxError: Generator expression must be parenthesized147```148149Это улучшение было предложено Пабло Галиндо в [bpo-43914](https://python-all.ru/3.13/whatsnew/3.10.html).150151Добавлено значительное количество новых специализированных сообщений для исключений [`SyntaxError`](https://python-all.ru/3.13/library/exceptions.html#SyntaxError). Наиболее примечательные из них:152153- Пропущен `:` перед блоками:154155  ```python156  >>> if rocket.position > event_horizon157    File "<stdin>", line 1158      if rocket.position > event_horizon159                                        ^160  SyntaxError: expected ':'161  ```162163  (Предложено Пабло Галиндо в [bpo-42997](https://python-all.ru/3.13/whatsnew/3.10.html).)164- Кортежи без скобок в целях (targets) генераторов:165166  ```python167  >>> {x,y for x,y in zip('abcd', '1234')}168    File "<stdin>", line 1169      {x,y for x,y in zip('abcd', '1234')}170       ^171  SyntaxError: did you forget parentheses around the comprehension target?172  ```173174  (Предложено Пабло Галиндо в [bpo-43017](https://python-all.ru/3.13/whatsnew/3.10.html).)175- Отсутствуют запятые в литералах коллекций и между выражениями:176177  ```python178  >>> items = {179  ... x: 1,180  ... y: 2181  ... z: 3,182    File "<stdin>", line 3183      y: 2184         ^185  SyntaxError: invalid syntax. Perhaps you forgot a comma?186  ```187188  (Предложено Пабло Галиндо в [bpo-43822](https://python-all.ru/3.13/whatsnew/3.10.html).)189- Несколько типов исключений без скобок:190191  ```python192  >>> try:193  ...     build_dyson_sphere()194  ... except NotEnoughScienceError, NotEnoughResourcesError:195    File "<stdin>", line 3196      except NotEnoughScienceError, NotEnoughResourcesError:197             ^198  SyntaxError: multiple exception types must be parenthesized199  ```200201  (Предложено Пабло Галиндо в [bpo-43149](https://python-all.ru/3.13/whatsnew/3.10.html).)202- Отсутствуют `:` и значения в литералах словарей:203204  ```python205  >>> values = {206  ... x: 1,207  ... y: 2,208  ... z:209  ... }210    File "<stdin>", line 4211      z:212       ^213  SyntaxError: expression expected after dictionary key and ':'214215  >>> values = {x:1, y:2, z w:3}216    File "<stdin>", line 1217      values = {x:1, y:2, z w:3}218                          ^219  SyntaxError: ':' expected after dictionary key220  ```221222  (Предложено Пабло Галиндо в [bpo-43823](https://python-all.ru/3.13/whatsnew/3.10.html).)223- Блоки `try` без блоков `except` или `finally`:224225  ```python226  >>> try:227  ...     x = 2228  ... something = 3229    File "<stdin>", line 3230      something  = 3231      ^^^^^^^^^232  SyntaxError: expected 'except' or 'finally' block233  ```234235  (Предложено Пабло Галиндо в [bpo-44305](https://python-all.ru/3.13/whatsnew/3.10.html).)236- Использование `=` вместо `==` в сравнениях:237238  ```python239  >>> if rocket.position = event_horizon:240    File "<stdin>", line 1241      if rocket.position = event_horizon:242                         ^243  SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?244  ```245246  (Предложено Пабло Галиндо в [bpo-43797](https://python-all.ru/3.13/whatsnew/3.10.html).)247- Использование `*` в f-строках:248249  ```python250  >>> f"Black holes {*all_black_holes} and revelations"251    File "<stdin>", line 1252      (*all_black_holes)253       ^254  SyntaxError: f-string: cannot use starred expression here255  ```256257  (Предложено Пабло Галиндо в [bpo-41064](https://python-all.ru/3.13/whatsnew/3.10.html).)258259#### IndentationErrors260261Многие исключения [`IndentationError`](https://python-all.ru/3.13/library/exceptions.html#IndentationError) теперь содержат больше контекста о том, какой блок ожидал отступа, включая местоположение инструкции:262263```python264>>> def foo():265...    if lel:266...    x = 2267  File "<stdin>", line 3268    x = 2269    ^270IndentationError: expected an indented block after 'if' statement in line 2271```272273#### AttributeErrors274275При выводе [`AttributeError`](https://python-all.ru/3.13/library/exceptions.html#AttributeError), `PyErr_Display()` будет предлагать имена похожих атрибутов в объекте, в котором возникло исключение:276277```python278>>> collections.namedtoplo279Traceback (most recent call last):280  File "<stdin>", line 1, in <module>281AttributeError: module 'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?282```283284(Предложено Пабло Галиндо в [bpo-38530](https://python-all.ru/3.13/whatsnew/3.10.html).)285286> **Предупреждение**287>288> Обратите внимание: это не будет работать, если `PyErr_Display()` не вызывается для отображения ошибки что может произойти, если используется другая пользовательская функция отображения ошибок. Это обычная ситуация в некоторых интерактивных оболочках, например IPython.289290#### NameErrors291292При выводе [`NameError`](https://python-all.ru/3.13/library/exceptions.html#NameError), вызванного интерпретатором, `PyErr_Display()` будет предлагать имена похожих переменных в функции, в которой возникло исключение:293294```python295>>> schwarzschild_black_hole = None296>>> schwarschild_black_hole297Traceback (most recent call last):298  File "<stdin>", line 1, in <module>299NameError: name 'schwarschild_black_hole' is not defined. Did you mean: schwarzschild_black_hole?300```301302(Предложено Пабло Галиндо в [bpo-38530](https://python-all.ru/3.13/whatsnew/3.10.html).)303304> **Предупреждение**305>306> Обратите внимание: это не будет работать, если `PyErr_Display()` не вызывается для отображения ошибки, что может произойти, если используется другая пользовательская функция отображения ошибок. Это обычная ситуация в некоторых интерактивных оболочках, например IPython.307308### PEP 626: Точные номера строк для отладки и других инструментов309310PEP 626 привносит более точные и надёжные номера строк для инструментов отладки, профилирования и покрытия кода. События трассировки с правильным номером строки генерируются для всех выполняемых строк кода и только для выполняемых строк кода.311312Атрибут [`f_lineno`](https://python-all.ru/3.13/reference/datamodel.html#frame.f_lineno) объектов фреймов всегда будет содержать ожидаемый номер строки.313314Атрибут [`co_lnotab`](https://python-all.ru/3.13/reference/datamodel.html#codeobject.co_lnotab) [объектов кода](https://python-all.ru/3.13/reference/datamodel.html#code-objects) устарел и будет удалён в версии 3.12. Коду, которому необходимо преобразовывать смещение в номер строки, следует использовать новый метод [`co_lines()`](https://python-all.ru/3.13/reference/datamodel.html#codeobject.co_lines).315316### PEP 634: Структурное сопоставление с образцом317318Структурное сопоставление с образцом было добавлено в виде *оператора match* и *операторов case* с шаблонами и связанными с ними действиями. Шаблоны состоят из последовательностей, отображений, примитивных типов данных, а также экземпляров классов. Сопоставление с образцом позволяет программам извлекать информацию из сложных типов данных, выполнять ветвление на основе структуры данных и применять конкретные действия в зависимости от формы данных.319320#### Синтаксис и операции321322Общий синтаксис сопоставления с образцом:323324```python325match subject:326    case <pattern_1>:327        <action_1>328    case <pattern_2>:329        <action_2>330    case <pattern_3>:331        <action_3>332    case _:333        <action_wildcard>334```335336Оператор match принимает выражение и сравнивает его значение с последовательными шаблонами, заданными в виде одного или нескольких блоков case. В частности, сопоставление с образцом работает следующим образом:3373381. используя данные с типом и формой (`subject`)3392. вычисляя `subject` в операторе `match`3403. сравнивая проверяемое значение с каждым шаблоном в операторе `case` сверху вниз до подтверждения совпадения.3414. выполняя действие, связанное с шаблоном подтверждённого совпадения3425. Если точное совпадение не подтверждено, последний оператор case, универсальный шаблон `_`, если он предусмотрен, будет использован как совпадающий. Если точное совпадение не подтверждено и универсальный шаблон отсутствует, весь блок match ничего не делает (no-op).343344#### Декларативный подход345346Читатели могут быть знакомы с сопоставлением с образцом по простому примеру сопоставления выражения (объекта данных) с литералом (шаблоном) с помощью оператора switch в C, Java или JavaScript (и многих других языках). Часто оператор switch используется для сравнения объекта/выражения с операторами case, содержащими литералы.347348Более мощные примеры сопоставления с образцом можно найти в таких языках, как Scala и Elixir. При структурном сопоставлении с образцом подход является «декларативным» и явно задаёт условия (шаблоны), которым должны соответствовать данные.349350Хотя «императивный» набор инструкций с вложенными операторами «if» можно использовать для достижения чего-то похожего на структурное сопоставление с образцом, он менее понятен, чем «декларативный» подход. Вместо этого «декларативный» подход задаёт условия для совпадения и более читаем благодаря явным шаблонам. Хотя структурное сопоставление с образцом можно использовать в его простейшей форме – сравнение переменной с литералом в операторе case, его истинная ценность для Python заключается в обработке типа и формы проверяемого значения.351352#### Простой шаблон: сопоставление с литералом353354Рассмотрим этот пример как сопоставление с образцом в его простейшей форме: значение (проверяемое выражение) сопоставляется с несколькими литералами (шаблонами). В примере ниже `status` является проверяемым выражением оператора match. Шаблонами являются каждый из операторов case, где литералы представляют коды статуса запроса. Связанное с оператором case действие выполняется после совпадения:355356```python357def http_error(status):358    match status:359        case 400:360            return "Bad request"361        case 404:362            return "Not found"363        case 418:364            return "I'm a teapot"365        case _:366            return "Something's wrong with the internet"367```368369Если в указанную выше функцию передано `status` со значением 418, возвращается «I’m a teapot». Если передано `status` со значением 500, оператор case с `_` совпадёт как универсальный шаблон, и будет возвращено «Something’s wrong with the internet». Обратите внимание на последний блок: имя переменной `_` действует как *универсальный шаблон* и гарантирует, что проверяемое значение всегда совпадёт. Использование `_` необязательно.370371Можно объединить несколько литералов в одном шаблоне с помощью `|` («или»):372373```python374case 401 | 403 | 404:375    return "Not allowed"376```377378##### Поведение без универсального шаблона379380Если изменить предыдущий пример, удалив последний блок case, пример станет таким:381382```python383def http_error(status):384    match status:385        case 400:386            return "Bad request"387        case 404:388            return "Not found"389        case 418:390            return "I'm a teapot"391```392393Без использования `_` в операторе case совпадения может не быть. Если совпадения нет, поведение – пустая операция (no-op). Например, если передано `status` со значением 500, ничего не происходит.394395#### Шаблоны с литералом и переменной396397Шаблоны могут выглядеть как распаковка в присваивании, и шаблон может использоваться для связывания переменных. В этом примере точка данных может быть распакована на её x-координату и y-координату:398399```python400# point – это кортеж (x, y)401match point:402    case (0, 0):403        print("Origin")404    case (0, y):405        print(f"Y={y}")406    case (x, 0):407        print(f"X={x}")408    case (x, y):409        print(f"X={x}, Y={y}")410    case _:411        raise ValueError("Not a point")412```413414Первый шаблон содержит два литерала, `(0, 0)`, и может рассматриваться как расширение шаблона-литерала, показанного выше. Следующие два шаблона объединяют литерал и переменную, и переменная *связывает* значение из проверяемого выражения (`point`). Четвёртый шаблон захватывает два значения, что делает его концептуально похожим на распаковывающее присваивание `(x, y) = point`.415416#### Шаблоны и классы417418Если вы используете классы для структурирования данных, вы можете использовать в качестве шаблона имя класса, за которым следует список аргументов, напоминающий конструктор. Этот шаблон позволяет захватывать атрибуты экземпляра в переменные:419420```python421class Point:422    def __init__(self, x, y):423        self.x = x424        self.y = y425426def location(point):427    match point:428        case Point(x=0, y=0):429            print("Origin is the point's location.")430        case Point(x=0, y=y):431            print(f"Y={y} and the point is on the y-axis.")432        case Point(x=x, y=0):433            print(f"X={x} and the point is on the x-axis.")434        case Point():435            print("The point is located somewhere else on the plane.")436        case _:437            print("Not a point")438```439440##### Шаблоны с позиционными параметрами441442Вы можете использовать позиционные параметры с некоторыми встроенными классами, которые предоставляют упорядочивание для своих атрибутов (например, dataclasses). Вы также можете определить конкретную позицию для атрибутов в шаблонах, задав специальный атрибут `__match_args__` в своих классах. Если он установлен в (“x”, “y”), следующие шаблоны все эквивалентны (и все связывают атрибут `y` с переменной `var`):443444```python445Point(1, var)446Point(1, y=var)447Point(x=1, y=var)448Point(y=var, x=1)449```450451#### Вложенные шаблоны452453Шаблоны могут быть произвольно вложенными. Например, если наши данные – короткий список точек, их можно сопоставить следующим образом:454455```python456match points:457    case []:458        print("No points in the list.")459    case [Point(0, 0)]:460        print("The origin is the only point in the list.")461    case [Point(x, y)]:462        print(f"A single point {x}, {y} is in the list.")463    case [Point(0, y1), Point(0, y2)]:464        print(f"Two points on the Y axis at {y1}, {y2} are in the list.")465    case _:466        print("Something else is found in the list.")467```468469#### Сложные шаблоны и универсальный шаблон470471До этого момента в примерах использовался `_` отдельно в последнем операторе case. Универсальный шаблон можно использовать в более сложных шаблонах, например `('error', code, _)`. Например:472473```python474match test_variable:475    case ('warning', code, 40):476        print("A warning has been received.")477    case ('error', code, _):478        print(f"An error {code} occurred.")479```480481В приведённом выше случае `test_variable` будет соответствовать (‘error’, code, 100) и (‘error’, code, 800).482483#### Ограничитель484485К шаблону можно добавить предложение `if`, известное как «страж». Если страж ложен, `match` переходит к следующему блоку case. Обратите внимание, что захват значения происходит до вычисления стража:486487```python488match point:489    case Point(x, y) if x == y:490        print(f"The point is located on the diagonal Y=X at {x}.")491    case Point(x, y):492        print(f"Point is not on the diagonal.")493```494495#### Другие ключевые особенности496497Несколько других важных возможностей:498499- Как и при распаковке присваиваний, шаблоны кортежей и списков имеют одинаковый смысл и по сути сопоставляются с произвольными последовательностями. Технически субъект должен быть последовательностью. Поэтому важное исключение: шаблоны не сопоставляются с итераторами. Кроме того, чтобы избежать распространённой ошибки, шаблоны последовательностей не сопоставляются со строками.500- Шаблоны последовательностей поддерживают подстановочные знаки: `[x, y, *rest]` и `(x, y, *rest)` работают аналогично подстановочным знакам при распаковке присваиваний. Имя после `*` также может быть `_`, поэтому `(x, y, *_)` сопоставляется с последовательностью из не менее двух элементов без привязки остальных элементов.501- Шаблоны отображений: `{"bandwidth": b, "latency": l}` захватывает значения `"bandwidth"` и `"latency"` из словаря. В отличие от шаблонов последовательностей, лишние ключи игнорируются. Также поддерживается подстановочный знак `**rest`. (Но `**_` был бы избыточным, поэтому не допускается.)502- Подшаблоны могут быть захвачены с помощью ключевого слова `as`:503504  ```python505  case (Point(x1, y1), Point(x2, y2) as p2): ...506  ```507508  Это связывает x1, y1, x2, y2, как и ожидалось, без пункта `as`, а p2 – со всем вторым элементом субъекта.509- Большинство литералов сравниваются по равенству. Однако синглтоны `True`, `False` и `None` сравниваются по идентичности.510- Именованные константы можно использовать в шаблонах. Они должны быть точечными именами, чтобы константа не интерпретировалась как переменная захвата:511512  ```python513  from enum import Enum514  class Color(Enum):515      RED = 0516      GREEN = 1517      BLUE = 2518519  color = Color.GREEN520  match color:521      case Color.RED:522          print("I see red!")523      case Color.GREEN:524          print("Grass is green")525      case Color.BLUE:526          print("I'm feeling the blues :(")527  ```528529Полную спецификацию см. в [**PEP 634**](https://python-all.ru/3.13/whatsnew/3.10.html). Мотивация и обоснование находятся в [**PEP 635**](https://python-all.ru/3.13/whatsnew/3.10.html), а более подробное руководство – в [**PEP 636**](https://python-all.ru/3.13/whatsnew/3.10.html).530531### Опциональные `EncodingWarning` и `encoding="locale"` параметры532533Кодировка по умолчанию для [`TextIOWrapper`](https://python-all.ru/3.13/library/io.html#io.TextIOWrapper) и [`open()`](https://python-all.ru/3.13/library/functions.html#open) зависит от платформы и локали. Поскольку UTF-8 используется на большинстве платформ Unix, опускание параметра `encoding` при открытии файлов в UTF-8 (например, JSON, YAML, TOML, Markdown) является очень распространённой ошибкой. Например:534535```python536# ОШИБКА: следует использовать режим "rb" или encoding="utf-8".537with open("data.json") as f:538    data = json.load(f)539```540541Для обнаружения такой ошибки добавлен опциональный `EncodingWarning`. Он выдаётся, когда [`sys.flags.warn_default_encoding`](https://python-all.ru/3.13/library/sys.html#sys.flags) истинно и используется кодировка по умолчанию, зависящая от локали.542543Параметр `-X warn_default_encoding` и [`PYTHONWARNDEFAULTENCODING`](https://python-all.ru/3.13/using/cmdline.html#envvar-PYTHONWARNDEFAULTENCODING) добавлены для включения предупреждения.544545См. [Кодировка текста](https://python-all.ru/3.13/library/io.html#io-text-encoding) для получения дополнительной информации.546547## Новые возможности, связанные с аннотациями типов548549Этот раздел охватывает основные изменения, затрагивающие [**PEP 484**](https://python-all.ru/3.13/whatsnew/3.10.html) подсказки типов и модуль [`typing`](https://python-all.ru/3.13/library/typing.html#module-typing).550551### PEP 604: Новый оператор объединения типов552553Был введён новый оператор объединения типов, который позволяет использовать синтаксис `X | Y`. Это даёт более чистый способ выразить «тип X или тип Y» вместо использования [`typing.Union`](https://python-all.ru/3.13/library/typing.html#typing.Union), особенно в аннотациях типов.554555В предыдущих версиях Python для аннотации типов функций, принимающих аргументы нескольких типов, использовался [`typing.Union`](https://python-all.ru/3.13/library/typing.html#typing.Union):556557```python558def square(number: Union[int, float]) -> Union[int, float]:559    return number ** 2560```561562Теперь аннотации типов можно писать более кратко:563564```python565def square(number: int | float) -> int | float:566    return number ** 2567```568569Этот новый синтаксис также принимается в качестве второго аргумента для [`isinstance()`](https://python-all.ru/3.13/library/functions.html#isinstance) и [`issubclass()`](https://python-all.ru/3.13/library/functions.html#issubclass):570571```python572>>> isinstance(1, int | str)573True574```575576См. [Union Type](https://python-all.ru/3.13/library/stdtypes.html#types-union) и [**PEP 604**](https://python-all.ru/3.13/whatsnew/3.10.html) для получения дополнительной информации.577578(Авторы: Maggie Moss и Philippe Prados в [bpo-41428](https://python-all.ru/3.13/whatsnew/3.10.html), с дополнениями от Yurii Karabas и Serhiy Storchaka в [bpo-44490](https://python-all.ru/3.13/whatsnew/3.10.html).)579580### PEP 612: Переменные спецификации параметров581582В модуль [`typing`](https://python-all.ru/3.13/library/typing.html#module-typing) добавлены два новых параметра, улучшающих информацию, предоставляемую статическим анализаторам типов для [**PEP 484**](https://python-all.ru/3.13/whatsnew/3.10.html)'s `Callable`.583584Первая – это переменная спецификации параметров. Она используется для передачи типов параметров одного вызываемого объекта другому – шаблон, часто встречающийся в функциях высшего порядка и декораторах. Примеры использования можно найти в [`typing.ParamSpec`](https://python-all.ru/3.13/library/typing.html#typing.ParamSpec). Ранее не было простого способа аннотировать зависимость типов параметров с такой точностью.585586Второй вариант – новый оператор `Concatenate`. Он используется вместе с переменными спецификации параметров для аннотации типов вызываемого объекта высшего порядка, который добавляет или удаляет параметры другого вызываемого объекта. Примеры использования можно найти в [`typing.Concatenate`](https://python-all.ru/3.13/library/typing.html#typing.Concatenate).587588См. [`typing.Callable`](https://python-all.ru/3.13/library/typing.html#typing.Callable), [`typing.ParamSpec`](https://python-all.ru/3.13/library/typing.html#typing.ParamSpec), [`typing.Concatenate`](https://python-all.ru/3.13/library/typing.html#typing.Concatenate), [`typing.ParamSpecArgs`](https://python-all.ru/3.13/library/typing.html#typing.ParamSpecArgs), [`typing.ParamSpecKwargs`](https://python-all.ru/3.13/library/typing.html#typing.ParamSpecKwargs) и [**PEP 612**](https://python-all.ru/3.13/whatsnew/3.10.html) для получения дополнительной информации.589590(Автор: Ken Jin в [bpo-41559](https://python-all.ru/3.13/whatsnew/3.10.html), с небольшими улучшениями от Jelle Zijlstra в [bpo-43783](https://python-all.ru/3.13/whatsnew/3.10.html). PEP написан Mark Mendoza.)591592### PEP 613: TypeAlias593594[**PEP 484**](https://python-all.ru/3.13/whatsnew/3.10.html) ввёл понятие псевдонимов типов, требуя лишь, чтобы они были присваиваниями верхнего уровня без аннотаций. Эта простота иногда затрудняла для анализаторов типов различие между псевдонимами типов и обычными присваиваниями, особенно когда были задействованы опережающие ссылки или недопустимые типы. Сравните:595596```python597StrCache = 'Cache[str]'  # псевдоним типа598LOG_PREFIX = 'LOG[DEBUG]'  # константа модуля599```600601Теперь в модуле [`typing`](https://python-all.ru/3.13/library/typing.html#module-typing) есть специальное значение [`TypeAlias`](https://python-all.ru/3.13/library/typing.html#typing.TypeAlias), которое позволяет объявлять псевдонимы типов более явно:602603```python604StrCache: TypeAlias = 'Cache[str]'  # псевдоним типа605LOG_PREFIX = 'LOG[DEBUG]'  # константа модуля606```607608См. [**PEP 613**](https://python-all.ru/3.13/whatsnew/3.10.html) для получения дополнительных сведений.609610(Автор: Mikhail Golubev в [bpo-41923](https://python-all.ru/3.13/whatsnew/3.10.html).)611612### PEP 647: Определяемые пользователем стражники типов613614[`TypeGuard`](https://python-all.ru/3.13/library/typing.html#typing.TypeGuard) добавлен в модуль [`typing`](https://python-all.ru/3.13/library/typing.html#module-typing) для аннотирования функций-стражников типов и улучшения информации, передаваемой статическим проверщикам типов при сужении типа. Для получения дополнительной информации см. документацию `TypeGuard` и [**PEP 647**](https://python-all.ru/3.13/whatsnew/3.10.html).615616(Авторы: Ken Jin и Guido van Rossum в [bpo-43766](https://python-all.ru/3.13/whatsnew/3.10.html). Автор PEP: Eric Traut.)617618## Прочие изменения языка619620- Тип [`int`](https://python-all.ru/3.13/library/functions.html#int) получил новый метод [`int.bit_count()`](https://python-all.ru/3.13/library/stdtypes.html#int.bit_count), который возвращает количество единиц в двоичном представлении целого числа, также известное как число единиц (population count). (Автор: Niklas Fiekas в [bpo-29882](https://python-all.ru/3.13/whatsnew/3.10.html).)621- Представления, возвращаемые [`dict.keys()`](https://python-all.ru/3.13/library/stdtypes.html#dict.keys), [`dict.values()`](https://python-all.ru/3.13/library/stdtypes.html#dict.values) и [`dict.items()`](https://python-all.ru/3.13/library/stdtypes.html#dict.items), теперь все имеют атрибут `mapping`, предоставляющий объект [`types.MappingProxyType`](https://python-all.ru/3.13/library/types.html#types.MappingProxyType), оборачивающий исходный словарь. (Автор: Dennis Sweeney в [bpo-40890](https://python-all.ru/3.13/whatsnew/3.10.html).)622- [**PEP 618**](https://python-all.ru/3.13/whatsnew/3.10.html): функция [`zip()`](https://python-all.ru/3.13/library/functions.html#zip) теперь имеет необязательный флаг `strict`, используемый для требования, чтобы все итерируемые объекты имели одинаковую длину.623- Встроенные функции и функции расширений, принимающие целочисленные аргументы, больше не принимают [`Decimal`](https://python-all.ru/3.13/library/decimal.html#decimal.Decimal), [`Fraction`](https://python-all.ru/3.13/library/fractions.html#fractions.Fraction) и другие объекты, которые могут быть преобразованы в целые числа только с потерей (например, имеющие метод [`__int__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__int__), но не имеющие метода [`__index__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__index__)). (Автор: Serhiy Storchaka в [bpo-37999](https://python-all.ru/3.13/whatsnew/3.10.html).)624- Если [`object.__ipow__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__ipow__) возвращает [`NotImplemented`](https://python-all.ru/3.13/library/constants.html#NotImplemented), оператор будет корректно возвращаться к [`object.__pow__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__pow__) и [`object.__rpow__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__rpow__), как и ожидается. (Автор: Alex Shkop в [bpo-38302](https://python-all.ru/3.13/whatsnew/3.10.html).)625- Присваивающие выражения теперь можно использовать без скобок внутри литералов множеств и включений множеств, а также в индексах последовательностей (но не в срезах).626- Функции получили новый атрибут `__builtins__`, который используется для поиска встроенных символов при выполнении функции, вместо поиска в `__globals__['__builtins__']`. Атрибут инициализируется из `__globals__["__builtins__"]`, если он существует, иначе из текущих встроенных объектов. (Автор: Mark Shannon в [bpo-42990](https://python-all.ru/3.13/whatsnew/3.10.html).)627- Две новые встроенные функции – [`aiter()`](https://python-all.ru/3.13/library/functions.html#aiter) и [`anext()`](https://python-all.ru/3.13/library/functions.html#anext) были добавлены для предоставления асинхронных аналогов [`iter()`](https://python-all.ru/3.13/library/functions.html#iter) и [`next()`](https://python-all.ru/3.13/library/functions.html#next) соответственно. (Авторы: Joshua Bronson, Daniel Pope и Justin Wang в [bpo-31861](https://python-all.ru/3.13/whatsnew/3.10.html).)628- Статические методы ([`@staticmethod`](https://python-all.ru/3.13/library/functions.html#staticmethod)) и методы классов ([`@classmethod`](https://python-all.ru/3.13/library/functions.html#classmethod)) теперь наследуют атрибуты методов (`__module__`, `__name__`, `__qualname__`, `__doc__`, `__annotations__`) и имеют новый атрибут `__wrapped__`. Более того, статические методы теперь можно вызывать как обычные функции. (Автор: Victor Stinner в [bpo-43682](https://python-all.ru/3.13/whatsnew/3.10.html).)629- Аннотации для сложных целей (всё, кроме целей `simple name`, заданных [**PEP 526**](https://python-all.ru/3.13/whatsnew/3.10.html)) больше не вызывают никаких эффектов во время выполнения при `from __future__ import annotations`. (Автор: Batuhan Taskaya в [bpo-42737](https://python-all.ru/3.13/whatsnew/3.10.html).)630- Объекты классов и модулей теперь лениво создают пустые словари аннотаций по требованию. Словари аннотаций хранятся в `__dict__` объекта для обратной совместимости. Это улучшает лучшие практики работы с `__annotations__`; для получения дополнительной информации см. [Annotations Best Practices](https://python-all.ru/3.13/howto/annotations.html#annotations-howto). (Автор: Larry Hastings в [bpo-43901](https://python-all.ru/3.13/whatsnew/3.10.html).)631- Аннотации, состоящие из `yield`, `yield from`, `await` или именованных выражений, теперь запрещены при `from __future__ import annotations` из-за их побочных эффектов. (Автор: Batuhan Taskaya в [bpo-42725](https://python-all.ru/3.13/whatsnew/3.10.html).)632- Использование несвязанных переменных, `super()` и других выражений, которые могут изменить обработку таблицы символов в качестве аннотаций, теперь не имеет эффекта при `from __future__ import annotations`. (Автор: Batuhan Taskaya в [bpo-42725](https://python-all.ru/3.13/whatsnew/3.10.html).)633- Хеши значений NaN как типа [`float`](https://python-all.ru/3.13/library/functions.html#float), так и типа [`decimal.Decimal`](https://python-all.ru/3.13/library/decimal.html#decimal.Decimal) теперь зависят от идентичности объекта. Раньше они всегда хешировались в `0`, несмотря на то что значения NaN не равны друг другу. Это приводило к потенциально квадратичному поведению во время выполнения из-за чрезмерных коллизий хешей при создании словарей и множеств, содержащих несколько NaN. (Автор: Raymond Hettinger в [bpo-43475](https://python-all.ru/3.13/whatsnew/3.10.html).)634- При удалении константы [`__debug__`](https://python-all.ru/3.13/library/constants.html#debug__) будет возбуждено [`SyntaxError`](https://python-all.ru/3.13/library/exceptions.html#SyntaxError) (вместо [`NameError`](https://python-all.ru/3.13/library/exceptions.html#NameError)). (Автор: Donghee Na в [bpo-45000](https://python-all.ru/3.13/whatsnew/3.10.html).)635- Исключения [`SyntaxError`](https://python-all.ru/3.13/library/exceptions.html#SyntaxError) теперь имеют атрибуты `end_lineno` и `end_offset`. Они будут равны `None`, если не определены. (Автор: Pablo Galindo в [bpo-43914](https://python-all.ru/3.13/whatsnew/3.10.html).)636637## Новые модули638639- Нет.640641## Улучшенные модули642643### asyncio644645Добавлен отсутствующий метод [`connect_accepted_socket()`](https://python-all.ru/3.13/library/asyncio-eventloop.html#asyncio.loop.connect_accepted_socket). (Автор: Alex Grönholm в [bpo-41332](https://python-all.ru/3.13/whatsnew/3.10.html).)646647### argparse648649Вводящая в заблуждение фраза «optional arguments» была заменена на «options» в справке argparse. Некоторым тестам может потребоваться адаптация, если они полагаются на точное совпадение вывода. (Автор: Raymond Hettinger в [bpo-9694](https://python-all.ru/3.13/whatsnew/3.10.html).)650651### array652653Метод [`index()`](https://python-all.ru/3.13/library/array.html#array.array.index) у [`array.array`](https://python-all.ru/3.13/library/array.html#array.array) теперь имеет необязательные параметры *start* и *stop*. (Авторы: Anders Lorentsen и Zackery Spytz в [bpo-31956](https://python-all.ru/3.13/whatsnew/3.10.html).)654655### asynchat, asyncore, smtpd656657Эти модули были отмечены как устаревшие в своей документации, начиная с Python 3.6. Теперь во все три модуля добавлено [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning) во время импорта.658659### base64660661Добавлены [`base64.b32hexencode()`](https://python-all.ru/3.13/library/base64.html#base64.b32hexencode) и [`base64.b32hexdecode()`](https://python-all.ru/3.13/library/base64.html#base64.b32hexdecode) для поддержки кодирования Base32 с расширенным шестнадцатеричным алфавитом.662663### bdb664665Добавлена `clearBreakpoints()` для сброса всех установленных точек останова. (Предложено Ирит Катриэлем в [bpo-24160](https://python-all.ru/3.13/whatsnew/3.10.html).)666667### bisect668669Добавлена возможность указания функции *key* в API модуля [`bisect`](https://python-all.ru/3.13/library/bisect.html#module-bisect). (Предложено Рэймондом Хеттингером в [bpo-4356](https://python-all.ru/3.13/whatsnew/3.10.html).)670671### codecs672673Добавлена функция [`codecs.unregister()`](https://python-all.ru/3.13/library/codecs.html#codecs.unregister) для отмены регистрации функции поиска кодеков. (Предложено Хай Ши в [bpo-41842](https://python-all.ru/3.13/whatsnew/3.10.html).)674675### collections.abc676677`__args__` у [параметризованных обобщённых типов](https://python-all.ru/3.13/library/stdtypes.html#types-genericalias) для [`collections.abc.Callable`](https://python-all.ru/3.13/library/collections.abc.html#collections.abc.Callable) теперь согласованы с [`typing.Callable`](https://python-all.ru/3.13/library/typing.html#typing.Callable). `collections.abc.Callable` обобщённый тип теперь упрощает параметры типа, аналогично tому, что делает `typing.Callable`. Это означает, что `collections.abc.Callable[[int, str], str]` будет иметь `__args__` от `(int, str, str)`; ранее это было `([int, str], str)`. Чтобы обеспечить это изменение, [`types.GenericAlias`](https://python-all.ru/3.13/library/types.html#types.GenericAlias) теперь может быть подклассом, и при индексировании типа `collections.abc.Callable` будет возвращаться подкласс. Обратите внимание, что может возникать [`TypeError`](https://python-all.ru/3.13/library/exceptions.html#TypeError) для некорректных форм параметризации `collections.abc.Callable`, которые в Python 3.9 могли проходить молча. (Предложено Кеном Джином в [bpo-42195](https://python-all.ru/3.13/whatsnew/3.10.html).)678679### contextlib680681Добавлен менеджер контекста [`contextlib.aclosing()`](https://python-all.ru/3.13/library/contextlib.html#contextlib.aclosing) для безопасного закрытия асинхронных генераторов и объектов, представляющих асинхронно освобождаемые ресурсы. (Предложено Джунги Кимом и Джоном Бельмонте в [bpo-41229](https://python-all.ru/3.13/whatsnew/3.10.html).)682683Добавлена поддержка асинхронного менеджера контекста для [`contextlib.nullcontext()`](https://python-all.ru/3.13/library/contextlib.html#contextlib.nullcontext). (Предложено Томом Грингаузом в [bpo-41543](https://python-all.ru/3.13/whatsnew/3.10.html).)684685Добавлен [`AsyncContextDecorator`](https://python-all.ru/3.13/library/contextlib.html#contextlib.AsyncContextDecorator) для поддержки использования асинхронных менеджеров контекста в качестве декораторов.686687### curses688689Расширенные функции цвета, добавленные в ncurses 6.1, будут прозрачно использоваться [`curses.color_content()`](https://python-all.ru/3.13/library/curses.html#curses.color_content), [`curses.init_color()`](https://python-all.ru/3.13/library/curses.html#curses.init_color), [`curses.init_pair()`](https://python-all.ru/3.13/library/curses.html#curses.init_pair) и [`curses.pair_content()`](https://python-all.ru/3.13/library/curses.html#curses.pair_content). Новая функция [`curses.has_extended_color_support()`](https://python-all.ru/3.13/library/curses.html#curses.has_extended_color_support) указывает, поддерживаются ли расширенные цвета базовой библиотекой ncurses. (Предложено Джеффри Кинчером и Хансом Петтером Янссоном в [bpo-36982](https://python-all.ru/3.13/whatsnew/3.10.html).)690691Константы `BUTTON5_*` теперь доступны в модуле [`curses`](https://python-all.ru/3.13/library/curses.html#module-curses), если они предоставляются базовой библиотекой curses. (Предложено Закери Спайтцем в [bpo-39273](https://python-all.ru/3.13/whatsnew/3.10.html).)692693### dataclasses694695#### \_\_slots\_\_696697Добавлен параметр `slots` в декоратор [`dataclasses.dataclass()`](https://python-all.ru/3.13/library/dataclasses.html#dataclasses.dataclass). (Предложено Юрием Карабасом в [bpo-42269](https://python-all.ru/3.13/whatsnew/3.10.html))698699#### Поля только по ключу700701dataclasses теперь поддерживает поля, которые являются только по ключу в сгенерированном методе \_\_init\_\_. Существует несколько способов указания таких полей.702703Можно указать, что все поля являются только по ключу:704705```python706from dataclasses import dataclass707708@dataclass(kw_only=True)709class Birthday:710    name: str711    birthday: datetime.date712```713714Оба параметра `name` и `birthday` являются только по ключу в сгенерированном методе \_\_init\_\_.715716Можно указать «только по ключу» для каждого поля отдельно:717718```python719from dataclasses import dataclass, field720721@dataclass722class Birthday:723    name: str724    birthday: datetime.date = field(kw_only=True)725```726727Здесь только `birthday` является только по ключу. Если установить `kw_only` для отдельных полей, следует учитывать, что существуют правила переупорядочивания полей: поля только по ключу должны следовать после полей не только по ключу. Подробнее см. в полной документации dataclasses.728729Также можно указать, что все поля, следующие за маркером KW\_ONLY, являются только по ключу. Вероятно, это будет наиболее распространённый способ использования:730731```python732from dataclasses import dataclass, KW_ONLY733734@dataclass735class Point:736    x: float737    y: float738    _: KW_ONLY739    z: float = 0.0740    t: float = 0.0741```742743Здесь `z` и `t` являются параметрами только по ключу, а `x` и `y` – нет. (Предложено Эриком В. Смитом в [bpo-43532](https://python-all.ru/3.13/whatsnew/3.10.html).)744745### distutils746747Весь пакет `distutils` является устаревшим и будет удалён в Python 3.12. Его функциональность для указания сборки пакетов уже полностью заменена сторонними пакетами `setuptools` и `packaging`, а большинство других часто используемых API доступны в других местах стандартной библиотеки (например, [`platform`](https://python-all.ru/3.13/library/platform.html#module-platform), [`shutil`](https://python-all.ru/3.13/library/shutil.html#module-shutil), [`subprocess`](https://python-all.ru/3.13/library/subprocess.html#module-subprocess) или [`sysconfig`](https://python-all.ru/3.13/library/sysconfig.html#module-sysconfig)). Планов по переносу какой-либо другой функциональности из `distutils` нет, и приложения, использующие другие функции, должны рассмотреть создание частных копий кода. Обратитесь к [**PEP 632**](https://python-all.ru/3.13/whatsnew/3.10.html) для обсуждения.748749Команда `bdist_wininst`, устаревшая в Python 3.8, была удалена. Теперь для распространения двоичных пакетов в Windows рекомендуется использовать команду `bdist_wheel`. (Предложено Виктором Стиннером в [bpo-42802](https://python-all.ru/3.13/whatsnew/3.10.html).)750751### doctest752753Если модуль не определяет `__loader__`, используется `__spec__.loader`. (Автор: Brett Cannon в [bpo-42133](https://python-all.ru/3.13/whatsnew/3.10.html).)754755### encodings756757[`encodings.normalize_encoding()`](https://python-all.ru/3.13/library/codecs.html#encodings.normalize_encoding) теперь игнорирует не-ASCII символы. (Добавлено Хай Ши в [bpo-39337](https://python-all.ru/3.13/whatsnew/3.10.html).)758759### enum760761[`Enum`](https://python-all.ru/3.13/library/enum.html#enum.Enum) [`__repr__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__repr__) теперь возвращает `enum_name.member_name`, а [`__str__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__str__) теперь возвращает `member_name`. Перечисления стандартной библиотеки, доступные как константы модуля, имеют [`repr()`](https://python-all.ru/3.13/library/functions.html#repr), равный `module_name.member_name`. (Добавлено Итаном Фурманом в [bpo-40066](https://python-all.ru/3.13/whatsnew/3.10.html).)762763Добавлен [`enum.StrEnum`](https://python-all.ru/3.13/library/enum.html#enum.StrEnum) для перечислений, все члены которых являются строками. (Добавлено Итаном Фурманом в [bpo-41816](https://python-all.ru/3.13/whatsnew/3.10.html).)764765### fileinput766767Добавлены параметры *encoding* и *errors* в [`fileinput.input()`](https://python-all.ru/3.13/library/fileinput.html#fileinput.input) и [`fileinput.FileInput`](https://python-all.ru/3.13/library/fileinput.html#fileinput.FileInput). (Добавлено Инадой Наоки в [bpo-43712](https://python-all.ru/3.13/whatsnew/3.10.html).)768769[`fileinput.hook_compressed()`](https://python-all.ru/3.13/library/fileinput.html#fileinput.hook_compressed) теперь возвращает объект [`TextIOWrapper`](https://python-all.ru/3.13/library/io.html#io.TextIOWrapper), когда *mode* равен «r», а файл сжат, как и несжатые файлы. (Добавлено Инадой Наоки в [bpo-5758](https://python-all.ru/3.13/whatsnew/3.10.html).)770771### faulthandler772773Модуль [`faulthandler`](https://python-all.ru/3.13/library/faulthandler.html#module-faulthandler) теперь обнаруживает, произошла ли фатальная ошибка во время сборки мусора. (Добавлено Виктором Стиннером в [bpo-44466](https://python-all.ru/3.13/whatsnew/3.10.html).)774775### gc776777Добавлены аудит-хуки для [`gc.get_objects()`](https://python-all.ru/3.13/library/gc.html#gc.get_objects), [`gc.get_referrers()`](https://python-all.ru/3.13/library/gc.html#gc.get_referrers) и [`gc.get_referents()`](https://python-all.ru/3.13/library/gc.html#gc.get_referents). (Добавлено Пабло Галиндо в [bpo-43439](https://python-all.ru/3.13/whatsnew/3.10.html).)778779### glob780781Добавлены параметры *root\_dir* и *dir\_fd* в [`glob()`](https://python-all.ru/3.13/library/glob.html#glob.glob) и [`iglob()`](https://python-all.ru/3.13/library/glob.html#glob.iglob), которые позволяют указать корневой каталог для поиска. (Добавлено Сергеем Сторчакой в [bpo-38144](https://python-all.ru/3.13/whatsnew/3.10.html).)782783### hashlib784785Модуль hashlib требует OpenSSL 1.1.1 или новее. (Добавлено Кристианом Хаймсом в [**PEP 644**](https://python-all.ru/3.13/whatsnew/3.10.html) и [bpo-43669](https://python-all.ru/3.13/whatsnew/3.10.html).)786787Модуль hashlib имеет предварительную поддержку OpenSSL 3.0.0. (Добавлено Кристианом Хаймсом в [bpo-38820](https://python-all.ru/3.13/whatsnew/3.10.html) и других тикетах.)788789Чистая реализация на Python [`pbkdf2_hmac()`](https://python-all.ru/3.13/library/hashlib.html#hashlib.pbkdf2_hmac) объявлена устаревшей. В будущем PBKDF2-HMAC будет доступен только при сборке Python с поддержкой OpenSSL. (Добавлено Кристианом Хаймсом в [bpo-43880](https://python-all.ru/3.13/whatsnew/3.10.html).)790791### hmac792793Модуль hmac теперь использует реализацию HMAC от OpenSSL внутри. (Добавлено Кристианом Хаймсом в [bpo-40645](https://python-all.ru/3.13/whatsnew/3.10.html).)794795### IDLE и idlelib796797IDLE теперь вызывает [`sys.excepthook()`](https://python-all.ru/3.13/library/sys.html#sys.excepthook) (при запуске без «-n»). Ранее пользовательские хуки игнорировались. (Добавлено Кеном Хилтоном в [bpo-43008](https://python-all.ru/3.13/whatsnew/3.10.html).)798799Переработан диалог настроек. Вкладка General разделена на вкладки Windows и Shell/Ed. Источники справки, расширяющие меню Help, перемещены на вкладку Extensions. Освобождено место для новых опций и сокращён диалог. Последнее улучшает отображение диалога на маленьких экранах. (Добавлено Терри Джан Риди в [bpo-40468](https://python-all.ru/3.13/whatsnew/3.10.html).) Настройка отступа (indent space) перенесена с вкладки Font на новую вкладку Windows. (Добавлено Марком Роземаном и Терри Джан Риди в [bpo-33962](https://python-all.ru/3.13/whatsnew/3.10.html).)800801Эти изменения были перенесены в поддерживаемый выпуск 3.9.802803Добавлена боковая панель Shell. Основное приглашение («\>\>\>») перемещено на боковую панель. Вторичные приглашения («…») добавлены на боковую панель. Щелчок левой кнопкой мыши и перетаскивание (опционально) выделяют одну или несколько строк текста, как в боковой панели с номерами строк редактора. Щелчок правой кнопкой после выделения строк текста отображает контекстное меню с пунктом «copy with prompts». Это объединяет приглашения с боковой панели со строками выделенного текста. Этот пункт также появляется в контекстном меню текста. (Добавлено Талем Эйнатом в [bpo-37903](https://python-all.ru/3.13/whatsnew/3.10.html).)804805Используются пробелы вместо табуляции для отступа интерактивного кода. Это делает ввод интерактивного кода «выглядящим правильно». Возможность этого была основной мотивацией для добавления боковой панели Shell. (Добавлено Терри Джан Риди в [bpo-37892](https://python-all.ru/3.13/whatsnew/3.10.html).)806807Подсвечиваются новые [мягкие ключевые слова](https://python-all.ru/3.13/reference/lexical_analysis.html#soft-keywords) [`match`](https://python-all.ru/3.13/reference/compound_stmts.html#match), `case` и [`_`](https://python-all.ru/3.13/reference/compound_stmts.html#wildcard-patterns) в операторах сопоставления с образцом. Однако эта подсветка не идеальна и может быть некорректной в некоторых редких случаях, включая некоторые `_` в образцах `case`. (Добавлено Талем Эйнатом в [bpo-44010](https://python-all.ru/3.13/whatsnew/3.10.html).)808809Новое в поддерживаемых выпусках 3.10.810811Применять подсветку синтаксиса для файлов `.pyi`. (Авторы: Alex Waygood и Terry Jan Reedy, [bpo-45447](https://python-all.ru/3.13/whatsnew/3.10.html).)812813Включение приглашений при сохранении содержимого Shell с вводом и выводом. (Автор: Terry Jan Reedy, [gh-95191](https://python-all.ru/3.13/whatsnew/3.10.html).)814815### importlib.metadata816817Функциональная совместимость с `importlib_metadata` 4.6 ([история](https://python-all.ru/3.13/whatsnew/3.10.html)).818819[importlib.metadata entry points](https://python-all.ru/3.13/library/importlib.metadata.html#entry-points) теперь предоставляют более удобный интерфейс для выбора точек входа по группе и имени через новый класс [importlib.metadata.EntryPoints](https://python-all.ru/3.13/library/importlib.metadata.html#entry-points). См. примечание о совместимости в документации для получения дополнительной информации об устаревании и использовании.820821Добавлена [importlib.metadata.packages\_distributions()](https://python-all.ru/3.13/library/importlib.metadata.html#package-distributions) для разрешения модулей и пакетов верхнего уровня Python в их [importlib.metadata.Distribution](https://python-all.ru/3.13/library/importlib.metadata.html#distributions).822823### inspect824825Если модуль не определяет `__loader__`, используется `__spec__.loader`. (Автор: Brett Cannon в [bpo-42133](https://python-all.ru/3.13/whatsnew/3.10.html).)826827Добавлен [`inspect.get_annotations()`](https://python-all.ru/3.13/library/inspect.html#inspect.get_annotations), который безопасно вычисляет аннотации, определённые для объекта. Он обходит особенности доступа к аннотациям для различных типов объектов и делает очень мало предположений об объекте, который исследует. `inspect.get_annotations()` также может корректно преобразовывать строковые аннотации обратно в объекты. `inspect.get_annotations()` теперь считается лучшей практикой для доступа к словарю аннотаций, определённому для любого объекта Python; дополнительную информацию о лучших практиках работы с аннотациями см. в [Лучшие практики для аннотаций](https://python-all.ru/3.13/howto/annotations.html#annotations-howto). Кроме того, [`inspect.signature()`](https://python-all.ru/3.13/library/inspect.html#inspect.signature), [`inspect.Signature.from_callable()`](https://python-all.ru/3.13/library/inspect.html#inspect.Signature.from_callable) и `inspect.Signature.from_function()` теперь вызывают `inspect.get_annotations()` для получения аннотаций. Это означает, что `inspect.signature()` и `inspect.Signature.from_callable()` также теперь могут преобразовывать строковые аннотации обратно в объекты. (Автор: Larry Hastings в [bpo-43817](https://python-all.ru/3.13/whatsnew/3.10.html).)828829### itertools830831Добавлен [`itertools.pairwise()`](https://python-all.ru/3.13/library/itertools.html#itertools.pairwise). (Автор: Raymond Hettinger в [bpo-38200](https://python-all.ru/3.13/whatsnew/3.10.html).)832833### linecache834835Если модуль не определяет `__loader__`, используется `__spec__.loader`. (Автор: Brett Cannon в [bpo-42133](https://python-all.ru/3.13/whatsnew/3.10.html).)836837### os838839Добавлена поддержка [`os.cpu_count()`](https://python-all.ru/3.13/library/os.html#os.cpu_count) для VxWorks RTOS. (Автор: Peixing Xin в [bpo-41440](https://python-all.ru/3.13/whatsnew/3.10.html).)840841Добавлена новая функция [`os.eventfd()`](https://python-all.ru/3.13/library/os.html#os.eventfd) и вспомогательные функции для обёртки системного вызова `eventfd2` в Linux. (Автор: Christian Heimes в [bpo-41001](https://python-all.ru/3.13/whatsnew/3.10.html).)842843Добавлен [`os.splice()`](https://python-all.ru/3.13/library/os.html#os.splice), который позволяет перемещать данные между двумя файловыми дескрипторами без копирования между адресным пространством ядра и пользовательским адресным пространством, причём один из файловых дескрипторов должен ссылаться на канал. (Автор: Pablo Galindo в [bpo-41625](https://python-all.ru/3.13/whatsnew/3.10.html).)844845Добавлены [`O_EVTONLY`](https://python-all.ru/3.13/library/os.html#os.O_EVTONLY), [`O_FSYNC`](https://python-all.ru/3.13/library/os.html#os.O_FSYNC), [`O_SYMLINK`](https://python-all.ru/3.13/library/os.html#os.O_SYMLINK) и [`O_NOFOLLOW_ANY`](https://python-all.ru/3.13/library/os.html#os.O_NOFOLLOW_ANY) для macOS. (Автор: Donghee Na в [bpo-43106](https://python-all.ru/3.13/whatsnew/3.10.html).)846847### os.path848849[`os.path.realpath()`](https://python-all.ru/3.13/library/os.path.html#os.path.realpath) теперь принимает именованный аргумент *strict*. Если установлено значение `True`, [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError) возбуждается, если путь не существует или обнаружен цикл символической ссылки. (Автор: Barney Gale в [bpo-43757](https://python-all.ru/3.13/whatsnew/3.10.html).)850851### pathlib852853Добавлена поддержка срезов для [`PurePath.parents`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath.parents). (Автор: Joshua Cannon в [bpo-35498](https://python-all.ru/3.13/whatsnew/3.10.html).)854855Добавлена поддержка отрицательной индексации для [`PurePath.parents`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath.parents). (Автор: Yaroslav Pankovych в [bpo-21041](https://python-all.ru/3.13/whatsnew/3.10.html).)856857Добавлен метод [`Path.hardlink_to`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.hardlink_to), который заменяет `link_to()`. Новый метод имеет тот же порядок аргументов, что и [`symlink_to()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.symlink_to). (Автор: Barney Gale в [bpo-39950](https://python-all.ru/3.13/whatsnew/3.10.html).)858859[`pathlib.Path.stat()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.stat) и [`chmod()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.chmod) теперь принимают именованный аргумент *follow\_symlinks* для согласованности с соответствующими функциями в модуле [`os`](https://python-all.ru/3.13/library/os.html#module-os). (Автор: Barney Gale в [bpo-39906](https://python-all.ru/3.13/whatsnew/3.10.html).)860861### platform862863Добавлен [`platform.freedesktop_os_release()`](https://python-all.ru/3.13/library/platform.html#platform.freedesktop_os_release) для получения идентификации операционной системы из стандартного файла [freedesktop.org os-release](https://python-all.ru/3.13/whatsnew/3.10.html). (Автор: Christian Heimes в [bpo-28468](https://python-all.ru/3.13/whatsnew/3.10.html).)864865### pprint866867[`pprint.pprint()`](https://python-all.ru/3.13/library/pprint.html#pprint.pprint) теперь принимает новый именованный аргумент `underscore_numbers`. (Автор: sblondon в [bpo-42914](https://python-all.ru/3.13/whatsnew/3.10.html).)868869[`pprint`](https://python-all.ru/3.13/library/pprint.html#module-pprint) теперь может красиво печатать экземпляры [`dataclasses.dataclass`](https://python-all.ru/3.13/library/dataclasses.html#dataclasses.dataclass). (Автор: Lewis Gaul в [bpo-43080](https://python-all.ru/3.13/whatsnew/3.10.html).)870871### py\_compile872873Добавлена опция `--quiet` в интерфейс командной строки [`py_compile`](https://python-all.ru/3.13/library/py_compile.html#module-py_compile). (Автор: Gregory Schevchenko в [bpo-38731](https://python-all.ru/3.13/whatsnew/3.10.html).)874875### pyclbr876877Добавлен атрибут `end_lineno` в объекты `Function` и `Class` в дереве, возвращаемом [`pyclbr.readmodule()`](https://python-all.ru/3.13/library/pyclbr.html#pyclbr.readmodule) и [`pyclbr.readmodule_ex()`](https://python-all.ru/3.13/library/pyclbr.html#pyclbr.readmodule_ex). Он соответствует существующему (начальному) `lineno`. (Автор: Aviral Srivastava в [bpo-38307](https://python-all.ru/3.13/whatsnew/3.10.html).)878879### shelve880881Модуль [`shelve`](https://python-all.ru/3.13/library/shelve.html#module-shelve) теперь по умолчанию использует [`pickle.DEFAULT_PROTOCOL`](https://python-all.ru/3.13/library/pickle.html#pickle.DEFAULT_PROTOCOL) вместо протокола [`pickle`](https://python-all.ru/3.13/library/pickle.html#module-pickle) `3` при создании shelves. (Автор: Zackery Spytz в [bpo-34204](https://python-all.ru/3.13/whatsnew/3.10.html).)882883### statistics884885Добавлены функции [`covariance()`](https://python-all.ru/3.13/library/statistics.html#statistics.covariance), [`correlation()`](https://python-all.ru/3.13/library/statistics.html#statistics.correlation) Пирсона и простая [`linear_regression()`](https://python-all.ru/3.13/library/statistics.html#statistics.linear_regression). (Автор: Tymoteusz Wołodźko в [bpo-38490](https://python-all.ru/3.13/whatsnew/3.10.html).)886887### site888889Если модуль не определяет `__loader__`, используется `__spec__.loader`. (Автор: Brett Cannon в [bpo-42133](https://python-all.ru/3.13/whatsnew/3.10.html).)890891### socket892893Исключение [`socket.timeout`](https://python-all.ru/3.13/library/socket.html#socket.timeout) теперь является псевдонимом [`TimeoutError`](https://python-all.ru/3.13/library/exceptions.html#TimeoutError). (Автор: Christian Heimes в [bpo-42413](https://python-all.ru/3.13/whatsnew/3.10.html).)894895Добавлена возможность создавать MPTCP-сокеты с `IPPROTO_MPTCP` (Автор: Rui Cunha в [bpo-43571](https://python-all.ru/3.13/whatsnew/3.10.html).)896897Добавлена опция `IP_RECVTOS` для получения поля Type of Service (ToS) или DSCP/ECN (Автор: Georg Sauthoff в [bpo-44077](https://python-all.ru/3.13/whatsnew/3.10.html).)898899### ssl900901Модуль ssl требует OpenSSL 1.1.1 или новее. (Автор: Christian Heimes в [**PEP 644**](https://python-all.ru/3.13/whatsnew/3.10.html) и [bpo-43669](https://python-all.ru/3.13/whatsnew/3.10.html).)902903Модуль ssl получил предварительную поддержку OpenSSL 3.0.0 и новую опцию [`OP_IGNORE_UNEXPECTED_EOF`](https://python-all.ru/3.13/library/ssl.html#ssl.OP_IGNORE_UNEXPECTED_EOF). (Автор: Christian Heimes в [bpo-38820](https://python-all.ru/3.13/whatsnew/3.10.html), [bpo-43794](https://python-all.ru/3.13/whatsnew/3.10.html), [bpo-43788](https://python-all.ru/3.13/whatsnew/3.10.html), [bpo-43791](https://python-all.ru/3.13/whatsnew/3.10.html), [bpo-43799](https://python-all.ru/3.13/whatsnew/3.10.html), [bpo-43920](https://python-all.ru/3.13/whatsnew/3.10.html), [bpo-43789](https://python-all.ru/3.13/whatsnew/3.10.html) и [bpo-43811](https://python-all.ru/3.13/whatsnew/3.10.html).)904905Устаревшие функции и использование устаревших констант теперь приводят к [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning). У [`ssl.SSLContext.options`](https://python-all.ru/3.13/library/ssl.html#ssl.SSLContext.options) по умолчанию установлены [`OP_NO_SSLv2`](https://python-all.ru/3.13/library/ssl.html#ssl.OP_NO_SSLv2) и [`OP_NO_SSLv3`](https://python-all.ru/3.13/library/ssl.html#ssl.OP_NO_SSLv3), поэтому он не может предупредить о повторной установке флага. В [разделе об устаревших возможностях](https://python-all.ru/3.13/whatsnew/3.10.html#whatsnew310-deprecated) приведён список устаревших функций. (Автор: Christian Heimes в [bpo-43880](https://python-all.ru/3.13/whatsnew/3.10.html).)906907Модуль ssl теперь использует более безопасные настройки по умолчанию. Шифры без прямой секретности (forward secrecy) или с MAC SHA-1 отключены по умолчанию. Уровень безопасности 2 запрещает слабые ключи RSA, DH и ECC с надёжностью менее 112 бит. [`SSLContext`](https://python-all.ru/3.13/library/ssl.html#ssl.SSLContext) по умолчанию использует минимальную версию протокола TLS 1.2. Настройки основаны на исследовании Hynek Schlawack. (Автор: Christian Heimes в [bpo-43998](https://python-all.ru/3.13/whatsnew/3.10.html).)908909Устаревшие протоколы SSL 3.0, TLS 1.0 и TLS 1.1 больше официально не поддерживаются. Python активно их не блокирует. Однако параметры сборки OpenSSL, настройки дистрибутивов, патчи вендоров и наборы шифров могут препятствовать успешному рукопожатию.910911Добавлен параметр *timeout* в функцию [`ssl.get_server_certificate()`](https://python-all.ru/3.13/library/ssl.html#ssl.get_server_certificate). (Автор: Zackery Spytz в [bpo-31870](https://python-all.ru/3.13/whatsnew/3.10.html).)912913Модуль ssl использует heap-типы и многофазную инициализацию. (Автор: Christian Heimes в [bpo-42333](https://python-all.ru/3.13/whatsnew/3.10.html).)914915Добавлен новый флаг проверки [`VERIFY_X509_PARTIAL_CHAIN`](https://python-all.ru/3.13/library/ssl.html#ssl.VERIFY_X509_PARTIAL_CHAIN). (Автор: l0x в [bpo-40849](https://python-all.ru/3.13/whatsnew/3.10.html).)916917### sqlite3918919Добавлены события аудита для [`connect()`](https://python-all.ru/3.13/library/sqlite3.html#sqlite3.connect), [`enable_load_extension()`](https://python-all.ru/3.13/library/sqlite3.html#sqlite3.Connection.enable_load_extension) и [`load_extension()`](https://python-all.ru/3.13/library/sqlite3.html#sqlite3.Connection.load_extension). (Автор: Erlend E. Aasland в [bpo-43762](https://python-all.ru/3.13/whatsnew/3.10.html).)920921### sys922923Добавлен атрибут [`sys.orig_argv`](https://python-all.ru/3.13/library/sys.html#sys.orig_argv): список исходных аргументов командной строки, переданных исполняемому файлу Python. (Автор: Victor Stinner в [bpo-23427](https://python-all.ru/3.13/whatsnew/3.10.html).)924925Добавлен [`sys.stdlib_module_names`](https://python-all.ru/3.13/library/sys.html#sys.stdlib_module_names), содержащий список имён модулей стандартной библиотеки. (Автор: Victor Stinner в [bpo-42955](https://python-all.ru/3.13/whatsnew/3.10.html).)926927### \_thread928929[`_thread.interrupt_main()`](https://python-all.ru/3.13/library/_thread.html#thread.interrupt_main) теперь принимает необязательный номер сигнала для имитации (по умолчанию по-прежнему [`signal.SIGINT`](https://python-all.ru/3.13/library/signal.html#signal.SIGINT)). (Автор: Antoine Pitrou в [bpo-43356](https://python-all.ru/3.13/whatsnew/3.10.html).)930931### threading932933Добавлены [`threading.gettrace()`](https://python-all.ru/3.13/library/threading.html#threading.gettrace) и [`threading.getprofile()`](https://python-all.ru/3.13/library/threading.html#threading.getprofile) для получения функций, установленных [`threading.settrace()`](https://python-all.ru/3.13/library/threading.html#threading.settrace) и [`threading.setprofile()`](https://python-all.ru/3.13/library/threading.html#threading.setprofile) соответственно. (Автор: Mario Corchero в [bpo-42251](https://python-all.ru/3.13/whatsnew/3.10.html).)934935Добавлен [`threading.__excepthook__`](https://python-all.ru/3.13/library/threading.html#threading.__excepthook__) для получения исходного значения [`threading.excepthook()`](https://python-all.ru/3.13/library/threading.html#threading.excepthook), если оно установлено в сломанное или другое значение. (Автор: Mario Corchero в [bpo-42308](https://python-all.ru/3.13/whatsnew/3.10.html).)936937### traceback938939Функции [`format_exception()`](https://python-all.ru/3.13/library/traceback.html#traceback.format_exception), [`format_exception_only()`](https://python-all.ru/3.13/library/traceback.html#traceback.format_exception_only) и [`print_exception()`](https://python-all.ru/3.13/library/traceback.html#traceback.print_exception) теперь могут принимать объект исключения в качестве позиционного аргумента (только позиционный). (Авторы: Zackery Spytz и Matthias Bussonnier в [bpo-26389](https://python-all.ru/3.13/whatsnew/3.10.html).)940941### types942943Повторно введены классы [`types.EllipsisType`](https://python-all.ru/3.13/library/types.html#types.EllipsisType), [`types.NoneType`](https://python-all.ru/3.13/library/types.html#types.NoneType) и [`types.NotImplementedType`](https://python-all.ru/3.13/library/types.html#types.NotImplementedType), предоставляющие новый набор типов, легко интерпретируемых средствами проверки типов. (Автор: Bas van Beek в [bpo-41810](https://python-all.ru/3.13/whatsnew/3.10.html).)944945### typing946947Основные изменения см. в [новых возможностях, связанных с аннотациями типов](https://python-all.ru/3.13/whatsnew/3.10.html#new-feat-related-type-hints).948949Поведение [`typing.Literal`](https://python-all.ru/3.13/library/typing.html#typing.Literal) было изменено в соответствии с [**PEP 586**](https://python-all.ru/3.13/whatsnew/3.10.html) и для соответствия поведению статических анализаторов типов, описанному в PEP.9509511. `Literal` теперь удаляет дубликаты параметров.9522. Проверки равенства между объектами `Literal` теперь не зависят от порядка.9533. Сравнения `Literal` теперь учитывают типы. Например, `Literal[0] == Literal[False]` ранее давало `True`. Теперь это `False`. Для поддержки этого изменения внутренний кеш типов теперь поддерживает различение типов.9544. Объекты `Literal` теперь будут вызывать исключение [`TypeError`](https://python-all.ru/3.13/library/exceptions.html#TypeError) при проверке равенства, если какой-либо из их параметров не является [хешируемым](https://python-all.ru/3.13/glossary.html#term-hashable). Обратите внимание, что объявление `Literal` с нехешируемыми параметрами не вызовет ошибку:955956   ```python957   >>> from typing import Literal958   >>> Literal[{0}]959   >>> Literal[{0}] == Literal[{False}]960   Traceback (most recent call last):961     File "<stdin>", line 1, in <module>962   TypeError: unhashable type: 'set'963   ```964965(Предложено Юрием Карабасом в [bpo-42345](https://python-all.ru/3.13/whatsnew/3.10.html).)966967Добавлена новая функция [`typing.is_typeddict()`](https://python-all.ru/3.13/library/typing.html#typing.is_typeddict) для проверки, является ли аннотация типом [`typing.TypedDict`](https://python-all.ru/3.13/library/typing.html#typing.TypedDict). (Предложено Патриком Ридером в [bpo-41792](https://python-all.ru/3.13/whatsnew/3.10.html).)968969Подклассы `typing.Protocol`, которые объявляют только переменные данных, теперь будут вызывать `TypeError` при проверке с помощью `isinstance`, если они не декорированы [`runtime_checkable()`](https://python-all.ru/3.13/library/typing.html#typing.runtime_checkable). Ранее такие проверки проходили молча. Пользователям следует декорировать свои подклассы декоратором `runtime_checkable()`,\\если они хотят использовать протоколы времени выполнения. (Предложено Юрием Карабасом в [bpo-38908](https://python-all.ru/3.13/whatsnew/3.10.html).)970971Импорт из подмодулей `typing.io` и `typing.re` теперь будет вызывать [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning). Эти подмодули устарели начиная с Python 3.8 и будут удалены в будущей версии Python. Все, что принадлежит этим подмодулям, следует импортировать напрямую из [`typing`](https://python-all.ru/3.13/library/typing.html#module-typing). (Предложено Sebastian Rittau в [bpo-38291](https://python-all.ru/3.13/whatsnew/3.10.html).)972973### unittest974975Добавлен новый метод [`assertNoLogs()`](https://python-all.ru/3.13/library/unittest.html#unittest.TestCase.assertNoLogs) в дополнение к существующему [`assertLogs()`](https://python-all.ru/3.13/library/unittest.html#unittest.TestCase.assertLogs). (Предложено Kit Yan Choi в [bpo-39385](https://python-all.ru/3.13/whatsnew/3.10.html).)976977### urllib.parse978979В версиях Python ниже 3.10 допускалось использование как `;`, так и `&` в качестве разделителей параметров запроса в [`urllib.parse.parse_qs()`](https://python-all.ru/3.13/library/urllib.parse.html#urllib.parse.parse_qs) и [`urllib.parse.parse_qsl()`](https://python-all.ru/3.13/library/urllib.parse.html#urllib.parse.parse_qsl). Из соображений безопасности и для соответствия новым рекомендациям W3C теперь разрешен только один разделитель, по умолчанию `&`. Это изменение также затрагивает `cgi.parse()` и `cgi.parse_multipart()`, так как они внутренне используют затронутые функции. Подробнее см. в их документации. (Предложено Adam Goldschmidt, Senthil Kumaran и Ken Jin в [bpo-42967](https://python-all.ru/3.13/whatsnew/3.10.html).)980981Наличие символов новой строки или табуляции в частях URL допускает некоторые формы атак. Следуя спецификации WHATWG, обновляющей [**RFC 3986**](https://python-all.ru/3.13/whatsnew/3.10.html), символы ASCII новой строки `\n`, `\r` и табуляции `\t` удаляются из URL анализатором в [`urllib.parse`](https://python-all.ru/3.13/library/urllib.parse.html#module-urllib.parse), предотвращая такие атаки. Удаляемые символы контролируются новой переменной уровня модуля `urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE`. (См. [gh-88048](https://python-all.ru/3.13/whatsnew/3.10.html))982983### xml984985Добавлен класс [`LexicalHandler`](https://python-all.ru/3.13/library/xml.sax.handler.html#xml.sax.handler.LexicalHandler) в модуль [`xml.sax.handler`](https://python-all.ru/3.13/library/xml.sax.handler.html#module-xml.sax.handler). (Предложено Jonathan Gossage и Zackery Spytz в [bpo-35018](https://python-all.ru/3.13/whatsnew/3.10.html).)986987### zipimport988989Добавлены методы, связанные с [**PEP 451**](https://python-all.ru/3.13/whatsnew/3.10.html): [`find_spec()`](https://python-all.ru/3.13/library/zipimport.html#zipimport.zipimporter.find_spec), [`zipimport.zipimporter.create_module()`](https://python-all.ru/3.13/library/zipimport.html#zipimport.zipimporter.create_module) и [`zipimport.zipimporter.exec_module()`](https://python-all.ru/3.13/library/zipimport.html#zipimport.zipimporter.exec_module). (Предложено Brett Cannon в [bpo-42131](https://python-all.ru/3.13/whatsnew/3.10.html).)990991Добавлен метод [`invalidate_caches()`](https://python-all.ru/3.13/library/zipimport.html#zipimport.zipimporter.invalidate_caches). (Предложено Desmond Cheong в [bpo-14678](https://python-all.ru/3.13/whatsnew/3.10.html).)992993## Оптимизации994995- Конструкторы [`str()`](https://python-all.ru/3.13/library/stdtypes.html#str), [`bytes()`](https://python-all.ru/3.13/library/stdtypes.html#bytes) и [`bytearray()`](https://python-all.ru/3.13/library/stdtypes.html#bytearray) теперь работают быстрее (примерно на 30–40% для маленьких объектов). (Предложено Serhiy Storchaka в [bpo-41334](https://python-all.ru/3.13/whatsnew/3.10.html).)996- Модуль [`runpy`](https://python-all.ru/3.13/library/runpy.html#module-runpy) теперь импортирует меньше модулей. Время запуска команды `python3 -m module-name` в среднем в 1,4 раза быстрее. На Linux `python3 -I -m module-name` импортирует 69 модулей в Python 3.9, тогда как в Python 3.10 импортирует только 51 модуль (-18). (Предложено Victor Stinner в [bpo-41006](https://python-all.ru/3.13/whatsnew/3.10.html) и [bpo-41718](https://python-all.ru/3.13/whatsnew/3.10.html).)997- Инструкция `LOAD_ATTR` теперь использует новый механизм «per opcode cache». Она работает примерно на 36% быстрее для обычных атрибутов и на 44% быстрее для слотов. (Предложено Pablo Galindo и Yury Selivanov в [bpo-42093](https://python-all.ru/3.13/whatsnew/3.10.html) и Guido van Rossum в [bpo-42927](https://python-all.ru/3.13/whatsnew/3.10.html), на основе идей, первоначально реализованных в PyPy и MicroPython.)998- При сборке Python с [`--enable-optimizations`](https://python-all.ru/3.13/using/configure.html#cmdoption-enable-optimizations) теперь `-fno-semantic-interposition` добавляется как в команду компиляции, так и в команду компоновки. Это ускоряет сборку интерпретатора Python, созданного с помощью [`--enable-shared`](https://python-all.ru/3.13/using/configure.html#cmdoption-enable-shared) с `gcc`, до 30%. См. [эту статью](https://python-all.ru/3.13/whatsnew/3.10.html) для подробностей. (Предложено Victor Stinner и Pablo Galindo в [bpo-38980](https://python-all.ru/3.13/whatsnew/3.10.html).)999- Используется новый код управления выходным буфером для модулей [`bz2`](https://python-all.ru/3.13/library/bz2.html#module-bz2) / [`lzma`](https://python-all.ru/3.13/library/lzma.html#module-lzma) / [`zlib`](https://python-all.ru/3.13/library/zlib.html#module-zlib), и добавлена функция `.readall()` к классу `_compression.DecompressReader`. Распаковка bz2 теперь быстрее в 1,09x ~ 1,17x, распаковка lzma – в 1,20x ~ 1,32x, `GzipFile.read(-1)` – в 1,11x ~ 1,18x. (Предложено Ma Lin, проверено Gregory P. Smith, в [bpo-41486](https://python-all.ru/3.13/whatsnew/3.10.html))1000- При использовании строковых аннотаций словари аннотаций для функций больше не создаются при создании функции. Вместо этого они хранятся в виде кортежа строк, и объект функции лениво преобразует его в словарь аннотаций по требованию. Эта оптимизация сокращает время CPU, необходимое для определения аннотированной функции, вдвое. (Предложено Yurii Karabas и Inada Naoki в [bpo-42202](https://python-all.ru/3.13/whatsnew/3.10.html).)1001- Функции поиска подстроки, такие как `str1 in str2` и `str2.find(str1)`, теперь иногда используют алгоритм поиска строк «Two-Way» Крочемора и Перрина, чтобы избежать квадратичного поведения на длинных строках. (Предложено Dennis Sweeney в [bpo-41972](https://python-all.ru/3.13/whatsnew/3.10.html))1002- Добавлены микрооптимизации в `_PyType_Lookup()` для улучшения производительности поиска в кеше атрибутов типа в типичном случае попадания в кеш. Это делает интерпретатор в среднем в 1,04 раза быстрее. (Предложено Dino Viehland в [bpo-43452](https://python-all.ru/3.13/whatsnew/3.10.html).)1003- Следующие встроенные функции теперь поддерживают более быстрый соглашение вызова [**PEP 590**](https://python-all.ru/3.13/whatsnew/3.10.html) vectorcall: [`map()`](https://python-all.ru/3.13/library/functions.html#map), [`filter()`](https://python-all.ru/3.13/library/functions.html#filter), [`reversed()`](https://python-all.ru/3.13/library/functions.html#reversed), [`bool()`](https://python-all.ru/3.13/library/functions.html#bool) и [`float()`](https://python-all.ru/3.13/library/functions.html#float). (Предложено Donghee Na и Jeroen Demeyer в [bpo-43575](https://python-all.ru/3.13/whatsnew/3.10.html), [bpo-43287](https://python-all.ru/3.13/whatsnew/3.10.html), [bpo-41922](https://python-all.ru/3.13/whatsnew/3.10.html), [bpo-41873](https://python-all.ru/3.13/whatsnew/3.10.html) и [bpo-41870](https://python-all.ru/3.13/whatsnew/3.10.html).)1004- Производительность [`BZ2File`](https://python-all.ru/3.13/library/bz2.html#bz2.BZ2File) улучшена за счет удаления внутренних `RLock`. Это делает `BZ2File` потоконебезопасным при наличии нескольких одновременных читателей или писателей, как и его эквивалентные классы в [`gzip`](https://python-all.ru/3.13/library/gzip.html#module-gzip) и [`lzma`](https://python-all.ru/3.13/library/lzma.html#module-lzma) всегда были. (Предложено Inada Naoki в [bpo-43785](https://python-all.ru/3.13/whatsnew/3.10.html).)10051006## Устарело10071008- В настоящее время Python допускает числовые литералы, непосредственно после которых следуют ключевые слова, например `0in x`, `1or x`, `0if 1else 2`. Это приводит к появлению сбивающих с толку и неоднозначных выражений, таких как `[0x1for x in y]` (которые можно рассматривать как `[0x1 for x in y]` или `[0x1f or x in y]`). Начиная с этого выпуска, если за числовым литералом непосредственно следует одно из ключевых слов [`and`](https://python-all.ru/3.13/reference/expressions.html#and), [`else`](https://python-all.ru/3.13/reference/compound_stmts.html#else), [`for`](https://python-all.ru/3.13/reference/compound_stmts.html#for), [`if`](https://python-all.ru/3.13/reference/compound_stmts.html#if), [`in`](https://python-all.ru/3.13/reference/expressions.html#in), [`is`](https://python-all.ru/3.13/reference/expressions.html#is) и [`or`](https://python-all.ru/3.13/reference/expressions.html#or), выдаётся предупреждение об устаревании. В будущих выпусках оно будет заменено на синтаксическое предупреждение, а затем на синтаксическую ошибку. (Предложено Сергеем Сторчакой в [bpo-43833](https://python-all.ru/3.13/whatsnew/3.10.html).)1009- Начиная с этого выпуска будет предпринята согласованная работа по очистке старой семантики импорта, которая сохранялась для совместимости с Python 2.7. В частности, `find_loader()`/`find_module()` (заменено на [`find_spec()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.MetaPathFinder.find_spec)), [`load_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.load_module) (заменено на [`exec_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.exec_module)), `module_repr()` (о чём система импорта заботится сама), атрибут `__package__` (заменён на `__spec__.parent`), атрибут `__loader__` (заменён на `__spec__.loader`) и атрибут `__cached__` (заменён на `__spec__.cached`) будут постепенно удалены (а также другие классы и методы в [`importlib`](https://python-all.ru/3.13/library/importlib.html#module-importlib)). При необходимости будут выдаваться [`ImportWarning`](https://python-all.ru/3.13/library/exceptions.html#ImportWarning) и/или [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning), чтобы помочь определить код, требующий обновления в ходе этого перехода.1010- Всё пространство имён `distutils` объявлено устаревшим и будет удалено в Python 3.12. Подробнее см. в разделе [изменения модулей](https://python-all.ru/3.13/whatsnew/3.10.html#distutils-deprecated).1011- Нецелочисленные аргументы для [`random.randrange()`](https://python-all.ru/3.13/library/random.html#random.randrange) объявлены устаревшими. [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError) устарел в пользу [`TypeError`](https://python-all.ru/3.13/library/exceptions.html#TypeError). (Предложено Сергеем Сторчакой и Раймондом Хеттингером в [bpo-37319](https://python-all.ru/3.13/whatsnew/3.10.html).)1012- Различные методы `load_module()` класса [`importlib`](https://python-all.ru/3.13/library/importlib.html#module-importlib) были задокументированы как устаревшие, начиная с Python 3.6, но теперь они также будут вызывать [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning). Используйте вместо них [`exec_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.exec_module). (Предложено Бреттом Кэнноном в [bpo-26131](https://python-all.ru/3.13/whatsnew/3.10.html).)1013- `zimport.zipimporter.load_module()` объявлен устаревшим в пользу [`exec_module()`](https://python-all.ru/3.13/library/zipimport.html#zipimport.zipimporter.exec_module). (Предложено Бреттом Кэнноном в [bpo-26131](https://python-all.ru/3.13/whatsnew/3.10.html).)1014- Использование [`load_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.load_module) системой импорта теперь вызывает [`ImportWarning`](https://python-all.ru/3.13/library/exceptions.html#ImportWarning), поскольку предпочтительнее использовать [`exec_module()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.Loader.exec_module). (Предложено Бреттом Кэнноном в [bpo-26131](https://python-all.ru/3.13/whatsnew/3.10.html).)1015- Использование `importlib.abc.MetaPathFinder.find_module()` и `importlib.abc.PathEntryFinder.find_module()` системой импорта теперь вызывает [`ImportWarning`](https://python-all.ru/3.13/library/exceptions.html#ImportWarning), поскольку предпочтительнее использовать [`importlib.abc.MetaPathFinder.find_spec()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.MetaPathFinder.find_spec) и [`importlib.abc.PathEntryFinder.find_spec()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.PathEntryFinder.find_spec) соответственно. Для помощи в переносе можно использовать [`importlib.util.spec_from_loader()`](https://python-all.ru/3.13/library/importlib.html#importlib.util.spec_from_loader). (Предложено Бреттом Кэнноном в [bpo-42134](https://python-all.ru/3.13/whatsnew/3.10.html).)1016- Использование `importlib.abc.PathEntryFinder.find_loader()` системой импорта теперь вызывает [`ImportWarning`](https://python-all.ru/3.13/library/exceptions.html#ImportWarning), поскольку предпочтительнее использовать [`importlib.abc.PathEntryFinder.find_spec()`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.PathEntryFinder.find_spec). Для помощи в переносе можно использовать [`importlib.util.spec_from_loader()`](https://python-all.ru/3.13/library/importlib.html#importlib.util.spec_from_loader). (Предложено Бреттом Кэнноном в [bpo-43672](https://python-all.ru/3.13/whatsnew/3.10.html).)1017- Различные реализации `importlib.abc.MetaPathFinder.find_module()` ( `importlib.machinery.BuiltinImporter.find_module()`, `importlib.machinery.FrozenImporter.find_module()`, `importlib.machinery.WindowsRegistryFinder.find_module()`, `importlib.machinery.PathFinder.find_module()`, `importlib.abc.MetaPathFinder.find_module()` ), `importlib.abc.PathEntryFinder.find_module()` ( `importlib.machinery.FileFinder.find_module()` ) и `importlib.abc.PathEntryFinder.find_loader()` ( `importlib.machinery.FileFinder.find_loader()` ) теперь вызывают [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning) и планируются к удалению в Python 3.12 (ранее они были задокументированы как устаревшие в Python 3.4). (Предложено Бреттом Кэнноном в [bpo-42135](https://python-all.ru/3.13/whatsnew/3.10.html).)1018- `importlib.abc.Finder` объявлен устаревшим (включая его единственный метод `find_module()`). Оба класса [`importlib.abc.MetaPathFinder`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.MetaPathFinder) и [`importlib.abc.PathEntryFinder`](https://python-all.ru/3.13/library/importlib.html#importlib.abc.PathEntryFinder) больше не наследуются от этого класса. Вместо этого следует наследовать от одного из этих двух классов по ситуации. (Предложено Бреттом Кэнноном в [bpo-42135](https://python-all.ru/3.13/whatsnew/3.10.html).)1019- Уведомления об устаревании для `imp`, `importlib.find_loader()`, `importlib.util.set_package_wrapper()`, `importlib.util.set_loader_wrapper()`, `importlib.util.module_for_loader()`, `pkgutil.ImpImporter` и `pkgutil.ImpLoader` были обновлены: теперь в качестве планируемой версии удаления указан Python 3.12 (в предыдущих версиях Python они начали вызывать [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning)). (Предложено Бреттом Кэнноном в [bpo-43720](https://python-all.ru/3.13/whatsnew/3.10.html).)1020- Система импорта теперь использует атрибут `__spec__` у модулей, прежде чем обратиться к `module_repr()` для метода `__repr__()` модуля. Удаление использования `module_repr()` запланировано на Python 3.12. (Предложено Бреттом Кэнноном в [bpo-42137](https://python-all.ru/3.13/whatsnew/3.10.html).)1021- `importlib.abc.Loader.module_repr()`, `importlib.machinery.FrozenLoader.module_repr()` и `importlib.machinery.BuiltinLoader.module_repr()` объявлены устаревшими и планируются к удалению в Python 3.12. (Предложено Бреттом Кэнноном в [bpo-42136](https://python-all.ru/3.13/whatsnew/3.10.html).)1022- `sqlite3.OptimizedUnicode` не документирован и считается устаревшим начиная с Python 3.3, когда он стал псевдонимом для [`str`](https://python-all.ru/3.13/library/stdtypes.html#str). Теперь он объявлен устаревшим и запланирован к удалению в Python 3.12. (Предложено Эрлендом Э. Осландом в [bpo-42264](https://python-all.ru/3.13/whatsnew/3.10.html).)1023- Не документированная встроенная функция `sqlite3.enable_shared_cache` теперь объявлена устаревшей и запланирована к удалению в Python 3.12. Документация SQLite3 настоятельно не рекомендует её использовать. Подробнее см. в [документации SQLite3](https://python-all.ru/3.13/whatsnew/3.10.html). Если необходимо использовать общий кеш, откройте базу данных в режиме URI с помощью параметра запроса `cache=shared`. (Предложено Эрлендом Э. Осландом в [bpo-24464](https://python-all.ru/3.13/whatsnew/3.10.html).)1024- Следующие методы `threading` теперь объявлены устаревшими:10251026  - `threading.currentThread` =\> [`threading.current_thread()`](https://python-all.ru/3.13/library/threading.html#threading.current_thread)1027  - `threading.activeCount` =\> [`threading.active_count()`](https://python-all.ru/3.13/library/threading.html#threading.active_count)1028  - `threading.Condition.notifyAll` =\> [`threading.Condition.notify_all()`](https://python-all.ru/3.13/library/threading.html#threading.Condition.notify_all)1029  - `threading.Event.isSet` =\> [`threading.Event.is_set()`](https://python-all.ru/3.13/library/threading.html#threading.Event.is_set)1030  - `threading.Thread.setName` =\> [`threading.Thread.name`](https://python-all.ru/3.13/library/threading.html#threading.Thread.name)1031  - `threading.thread.getName` =\> [`threading.Thread.name`](https://python-all.ru/3.13/library/threading.html#threading.Thread.name)1032  - `threading.Thread.isDaemon` =\> [`threading.Thread.daemon`](https://python-all.ru/3.13/library/threading.html#threading.Thread.daemon)1033  - `threading.Thread.setDaemon` =\> [`threading.Thread.daemon`](https://python-all.ru/3.13/library/threading.html#threading.Thread.daemon)10341035  (Предложено Йелле Зейлстрой в [gh-87889](https://python-all.ru/3.13/whatsnew/3.10.html).)1036- `pathlib.Path.link_to()` объявлен устаревшим и запланирован к удалению в Python 3.12. Вместо него используйте [`pathlib.Path.hardlink_to()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.hardlink_to). (Предложено Барни Гейлом в [bpo-39950](https://python-all.ru/3.13/whatsnew/3.10.html).)1037- `cgi.log()` объявлен устаревшим и запланирован к удалению в Python 3.12. (Предложено Инадой Наоки в [bpo-41139](https://python-all.ru/3.13/whatsnew/3.10.html).)1038- Следующие возможности [`ssl`](https://python-all.ru/3.13/library/ssl.html#module-ssl) объявлены устаревшими начиная с Python 3.6, Python 3.7 или OpenSSL 1.1.0 и будут удалены в 3.11:10391040  - `OP_NO_SSLv2`, `OP_NO_SSLv3`, `OP_NO_TLSv1`, `OP_NO_TLSv1_1`, `OP_NO_TLSv1_2` и `OP_NO_TLSv1_3` заменяются на [`minimum_version`](https://python-all.ru/3.13/library/ssl.html#ssl.SSLContext.minimum_version) и [`maximum_version`](https://python-all.ru/3.13/library/ssl.html#ssl.SSLContext.maximum_version).1041  - `PROTOCOL_SSLv2`, `PROTOCOL_SSLv3`, `PROTOCOL_SSLv23`, `PROTOCOL_TLSv1`, `PROTOCOL_TLSv1_1`, `PROTOCOL_TLSv1_2` и `PROTOCOL_TLS` объявлены устаревшими в пользу [`PROTOCOL_TLS_CLIENT`](https://python-all.ru/3.13/library/ssl.html#ssl.PROTOCOL_TLS_CLIENT) и [`PROTOCOL_TLS_SERVER`](https://python-all.ru/3.13/library/ssl.html#ssl.PROTOCOL_TLS_SERVER)1042  - `wrap_socket()` заменяется на [`ssl.SSLContext.wrap_socket()`](https://python-all.ru/3.13/library/ssl.html#ssl.SSLContext.wrap_socket)1043  - `match_hostname()`1044  - `RAND_pseudo_bytes()`, `RAND_egd()`1045  - Возможности NPN, такие как [`ssl.SSLSocket.selected_npn_protocol()`](https://python-all.ru/3.13/library/ssl.html#ssl.SSLSocket.selected_npn_protocol) и [`ssl.SSLContext.set_npn_protocols()`](https://python-all.ru/3.13/library/ssl.html#ssl.SSLContext.set_npn_protocols), заменяются на ALPN.1046- Отладка потоков (переменная окружения `PYTHONTHREADDEBUG`) объявлена устаревшей в Python 3.10 и будет удалена в Python 3.12. Эта возможность требует [отладочной сборки Python](https://python-all.ru/3.13/using/configure.html#debug-build). (Предложено Виктором Стиннером в [bpo-44584](https://python-all.ru/3.13/whatsnew/3.10.html).)1047- Импорт из подмодулей `typing.io` и `typing.re` теперь будет вызывать [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning). Эти подмодули будут удалены в будущей версии Python. Всё, что относится к этим подмодулям, следует импортировать напрямую из [`typing`](https://python-all.ru/3.13/library/typing.html#module-typing). (Предложено Себастьяном Риттау в [bpo-38291](https://python-all.ru/3.13/whatsnew/3.10.html).)10481049## Удалено10501051- Удалены специальные методы `__int__`, `__float__`, `__floordiv__`, `__mod__`, `__divmod__`, `__rfloordiv__`, `__rmod__` и `__rdivmod__` класса [`complex`](https://python-all.ru/3.13/library/functions.html#complex). Они всегда вызывали [`TypeError`](https://python-all.ru/3.13/library/exceptions.html#TypeError). (Предложено Сергеем Сторчакой в [bpo-41974](https://python-all.ru/3.13/whatsnew/3.10.html).)1052- Метод `ParserBase.error()` из приватного и недокументированного модуля `_markupbase` был удалён. [`html.parser.HTMLParser`](https://python-all.ru/3.13/library/html.parser.html#html.parser.HTMLParser) – единственный подкласс `ParserBase`, и его реализация `error()` уже была удалена в Python 3.5. (Предложено Беркером Пексагом в [bpo-31844](https://python-all.ru/3.13/whatsnew/3.10.html).)1053- Удалён атрибут `unicodedata.ucnhash_CAPI`, который был внутренним объектом PyCapsule. Соответствующая приватная структура `_PyUnicode_Name_CAPI` была перемещена во внутренний C API. (Предложено Виктором Стиннером в [bpo-42157](https://python-all.ru/3.13/whatsnew/3.10.html).)1054- Удалён модуль `parser`, который был объявлен устаревшим в версии 3.9 из-за перехода на новый PEG-парсер, а также все исходные C-файлы и заголовочные файлы, которые использовались только старым парсером, включая `node.h`, `parser.h`, `graminit.h` и `grammar.h`.1055- Удалены функции публичного C API `PyParser_SimpleParseStringFlags`, `PyParser_SimpleParseStringFlagsFilename`, `PyParser_SimpleParseFileFlags` и `PyNode_Compile`, которые были объявлены устаревшими в версии 3.9 из-за перехода на новый PEG-парсер.1056- Удалён модуль `formatter`, который был объявлен устаревшим в Python 3.4. Он несколько устарел, мало используется и не тестируется. Изначально его планировали удалить в Python 3.6, но такие удаления были отложены до окончания поддержки Python 2.7. Существующим пользователям следует скопировать используемые ими классы в свой код. (Авторы: Donghee Na и Terry J. Reedy в [bpo-42299](https://python-all.ru/3.13/whatsnew/3.10.html).)1057- Удалена функция `PyModule_GetWarningsModule()`, которая стала бесполезной после того, как модуль `_warnings` был преобразован во встроенный модуль в версии 2.6. (Автор: Hai Shi в [bpo-42599](https://python-all.ru/3.13/whatsnew/3.10.html).)1058- Удалены устаревшие псевдонимы для [абстрактных базовых классов коллекций](https://python-all.ru/3.13/library/collections.abc.html#collections-abstract-base-classes) из модуля [`collections`](https://python-all.ru/3.13/library/collections.html#module-collections). (Автор: Victor Stinner в [bpo-37324](https://python-all.ru/3.13/whatsnew/3.10.html).)1059- Параметр `loop` был удалён из большинства [высокоуровневого API](https://python-all.ru/3.13/library/asyncio-api-index.html) [`asyncio`](https://python-all.ru/3.13/library/asyncio.html#module-asyncio) после объявления устаревшим в Python 3.8. Причины этого изменения многообразны:10601061  1. Это упрощает высокоуровневый API.1062  2. Функции высокоуровневого API неявно получают работающий цикл событий текущего потока, начиная с Python 3.7. В большинстве обычных случаев нет необходимости передавать цикл событий в API.1063  3. Передача цикла событий чревата ошибками, особенно при работе с циклами, выполняющимися в разных потоках.10641065  Обратите внимание: низкоуровневый API по-прежнему принимает `loop`. Примеры замены существующего кода см. в разделе [Изменения в Python API](https://python-all.ru/3.13/whatsnew/3.10.html#changes-python-api).10661067  (Авторы: Yurii Karabas, Andrew Svetlov, Yury Selivanov и Kyle Stanley в [bpo-42392](https://python-all.ru/3.13/whatsnew/3.10.html).)10681069## Перенос на Python 3.1010701071В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.10721073### Изменения в синтаксисе Python10741075- Теперь выдаётся предупреждение об устаревании при компиляции ранее допустимого синтаксиса, если числовой литерал непосредственно предшествует ключевому слову (как в `0in x`). В будущих версиях это станет синтаксическим предупреждением, а затем синтаксической ошибкой. Чтобы избавиться от предупреждения и обеспечить совместимость с будущими версиями, просто добавьте пробел между числовым литералом и следующим ключевым словом. (Автор: Serhiy Storchaka в [bpo-43833](https://python-all.ru/3.13/whatsnew/3.10.html).)10761077### Изменения в Python API10781079- Параметры *etype* функций [`format_exception()`](https://python-all.ru/3.13/library/traceback.html#traceback.format_exception), [`format_exception_only()`](https://python-all.ru/3.13/library/traceback.html#traceback.format_exception_only) и [`print_exception()`](https://python-all.ru/3.13/library/traceback.html#traceback.print_exception) в модуле [`traceback`](https://python-all.ru/3.13/library/traceback.html#module-traceback) переименованы в *exc*. (Авторы: Zackery Spytz и Matthias Bussonnier в [bpo-26389](https://python-all.ru/3.13/whatsnew/3.10.html).)1080- [`atexit`](https://python-all.ru/3.13/library/atexit.html#module-atexit): При завершении Python, если колбэк, зарегистрированный с помощью [`atexit.register()`](https://python-all.ru/3.13/library/atexit.html#atexit.register), завершается ошибкой, его исключение теперь записывается в журнал. Ранее регистрировались только некоторые исключения, а последнее исключение всегда молча игнорировалось. (Автор: Victor Stinner в [bpo-42639](https://python-all.ru/3.13/whatsnew/3.10.html).)1081- Обобщённый тип [`collections.abc.Callable`](https://python-all.ru/3.13/library/collections.abc.html#collections.abc.Callable) теперь уплощает параметры типа, аналогично тому, что делает [`typing.Callable`](https://python-all.ru/3.13/library/typing.html#typing.Callable). Это означает, что `collections.abc.Callable[[int, str], str]` будет иметь `__args__` из `(int, str, str)`; ранее это было `([int, str], str)`. Код, обращающийся к аргументам через [`typing.get_args()`](https://python-all.ru/3.13/library/typing.html#typing.get_args) или `__args__`, должен учитывать это изменение. Кроме того, [`TypeError`](https://python-all.ru/3.13/library/exceptions.html#TypeError) может быть возбуждено для некорректных форм параметризации `collections.abc.Callable`, которые в Python 3.9 могли проходить незамеченными. (Автор: Ken Jin в [bpo-42195](https://python-all.ru/3.13/whatsnew/3.10.html).)1082- [`socket.htons()`](https://python-all.ru/3.13/library/socket.html#socket.htons) и [`socket.ntohs()`](https://python-all.ru/3.13/library/socket.html#socket.ntohs) теперь возбуждают [`OverflowError`](https://python-all.ru/3.13/library/exceptions.html#OverflowError) вместо [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning), если заданный параметр не помещается в 16-битное целое без знака. (Автор: Erlend E. Aasland в [bpo-42393](https://python-all.ru/3.13/whatsnew/3.10.html).)1083- Параметр `loop` был удалён из большинства [высокоуровневого API](https://python-all.ru/3.13/library/asyncio-api-index.html) [`asyncio`](https://python-all.ru/3.13/library/asyncio.html#module-asyncio) после объявления устаревшим в Python 3.8.10841085  Корутина, которая сейчас выглядит так:10861087  ```python1088  async def foo(loop):1089      await asyncio.sleep(1, loop=loop)1090  ```10911092  Должна быть заменена на:10931094  ```python1095  async def foo():1096      await asyncio.sleep(1)1097  ```10981099  Если `foo()` была специально спроектирована *не* для работы в работающем цикле событий текущего потока (например, для работы в цикле событий другого потока), рассмотрите возможность использования [`asyncio.run_coroutine_threadsafe()`](https://python-all.ru/3.13/library/asyncio-task.html#asyncio.run_coroutine_threadsafe) вместо этого.11001101  (Авторы: Yurii Karabas, Andrew Svetlov, Yury Selivanov и Kyle Stanley в [bpo-42392](https://python-all.ru/3.13/whatsnew/3.10.html).)1102- Конструктор [`types.FunctionType`](https://python-all.ru/3.13/library/types.html#types.FunctionType) теперь наследует текущие встроенные функции, если словарь *globals* не содержит ключа `"__builtins__"`, вместо использования `{"None": None}` в качестве встроенных функций: такое же поведение, как у функций [`eval()`](https://python-all.ru/3.13/library/functions.html#eval) и [`exec()`](https://python-all.ru/3.13/library/functions.html#exec). Определение функции с помощью `def function(...): ...` в Python не затрагивается, глобальные переменные не могут быть переопределены этим синтаксисом: он также наследует текущие встроенные функции. (Автор: Victor Stinner в [bpo-42990](https://python-all.ru/3.13/whatsnew/3.10.html).)11031104### Изменения в C API11051106- Функции C API `PyParser_SimpleParseStringFlags`, `PyParser_SimpleParseStringFlagsFilename`, `PyParser_SimpleParseFileFlags`, `PyNode_Compile` и тип, используемый этими функциями, `struct _node`, были удалены из-за перехода на новый PEG-парсер.11071108  Исходный код теперь следует компилировать непосредственно в объект кода, например, с помощью [`Py_CompileString()`](https://python-all.ru/3.13/c-api/veryhigh.html#c.Py_CompileString). Полученный объект кода затем можно выполнить, например, с помощью [`PyEval_EvalCode()`](https://python-all.ru/3.13/c-api/veryhigh.html#c.PyEval_EvalCode).11091110  В частности:11111112  - Вызов `PyParser_SimpleParseStringFlags` с последующим `PyNode_Compile` можно заменить вызовом [`Py_CompileString()`](https://python-all.ru/3.13/c-api/veryhigh.html#c.Py_CompileString).1113  - Прямой замены для `PyParser_SimpleParseFileFlags` не существует. Чтобы скомпилировать код из аргумента `FILE *`, вам нужно будет прочитать файл на C и передать полученный буфер в [`Py_CompileString()`](https://python-all.ru/3.13/c-api/veryhigh.html#c.Py_CompileString).1114  - Чтобы скомпилировать файл по заданному имени файла `char *`, необходимо явно открыть файл, прочитать его и скомпилировать результат. Один из способов – использовать модуль [`io`](https://python-all.ru/3.13/library/io.html#module-io) с функциями [`PyImport_ImportModule()`](https://python-all.ru/3.13/c-api/import.html#c.PyImport_ImportModule), [`PyObject_CallMethod()`](https://python-all.ru/3.13/c-api/call.html#c.PyObject_CallMethod), [`PyBytes_AsString()`](https://python-all.ru/3.13/c-api/bytes.html#c.PyBytes_AsString) и [`Py_CompileString()`](https://python-all.ru/3.13/c-api/veryhigh.html#c.Py_CompileString), как показано ниже. (Объявления и обработка ошибок опущены.)11151116    ```python1117    io_module = Import_ImportModule("io");1118    fileobject = PyObject_CallMethod(io_module, "open", "ss", filename, "rb");1119    source_bytes_object = PyObject_CallMethod(fileobject, "read", "");1120    result = PyObject_CallMethod(fileobject, "close", "");1121    source_buf = PyBytes_AsString(source_bytes_object);1122    code = Py_CompileString(source_buf, filename, Py_file_input);1123    ```1124  - Для объектов `FrameObject` член [`f_lasti`](https://python-all.ru/3.13/reference/datamodel.html#frame.f_lasti) теперь представляет смещение в wordcode, а не просто смещение в строке байткода. Это означает, что это число необходимо умножить на 2 для использования с API, которые ожидают смещение в байтах (например, [`PyCode_Addr2Line()`](https://python-all.ru/3.13/c-api/code.html#c.PyCode_Addr2Line)). Также обратите внимание, что член `f_lasti` объектов `FrameObject` не считается стабильным: используйте вместо него [`PyFrame_GetLineNumber()`](https://python-all.ru/3.13/c-api/frame.html#c.PyFrame_GetLineNumber).11251126## Изменения байткода CPython11271128- Инструкция `MAKE_FUNCTION` теперь принимает в качестве аннотаций функции либо словарь, либо кортеж строк. (Предложено Юрием Карабасом и Инадой Наоки в [bpo-42202](https://python-all.ru/3.13/whatsnew/3.10.html).)11291130## Изменения сборки11311132- [**PEP 644**](https://python-all.ru/3.13/whatsnew/3.10.html): Python теперь требует OpenSSL 1.1.1 или новее. OpenSSL 1.0.2 больше не поддерживается. (Предложено Кристианом Хаймсом в [bpo-43669](https://python-all.ru/3.13/whatsnew/3.10.html).)1133- Для сборки Python теперь требуются функции C99 `snprintf()` и `vsnprintf()`. (Предложено Виктором Штиннером в [bpo-36020](https://python-all.ru/3.13/whatsnew/3.10.html).)1134- [`sqlite3`](https://python-all.ru/3.13/library/sqlite3.html#module-sqlite3) требует SQLite 3.7.15 или выше. (Предложено Сергеем Федосеевым и Эрлендом Э. Аасландом в [bpo-40744](https://python-all.ru/3.13/whatsnew/3.10.html) и [bpo-40810](https://python-all.ru/3.13/whatsnew/3.10.html).)1135- Модуль [`atexit`](https://python-all.ru/3.13/library/atexit.html#module-atexit) теперь всегда должен быть встроенным модулем. (Предложено Виктором Штиннером в [bpo-42639](https://python-all.ru/3.13/whatsnew/3.10.html).)1136- Добавлена опция [`--disable-test-modules`](https://python-all.ru/3.13/using/configure.html#cmdoption-disable-test-modules) в скрипт `configure`: не собирать и не устанавливать тестовые модули. (Предложено Ксавье де Гаем, Томасом Петаззони и Пейсином Сином в [bpo-27640](https://python-all.ru/3.13/whatsnew/3.10.html).)1137- Добавлен [`--with-wheel-pkg-dir=PATH option`](https://python-all.ru/3.13/using/configure.html#cmdoption-with-wheel-pkg-dir) в скрипт `./configure`. Если указано, модуль [`ensurepip`](https://python-all.ru/3.13/library/ensurepip.html#module-ensurepip) ищет колесные пакеты `setuptools` и `pip` в этом каталоге: если оба присутствуют, эти колесные пакеты используются вместо встроенных колесных пакетов ensurepip.11381139  Некоторые политики упаковки дистрибутивов Linux рекомендуют не включать зависимости. Например, Fedora устанавливает пакеты wheel в каталог `/usr/share/python-wheels/` и не устанавливает пакет `ensurepip._bundled`.11401141  (Предложено Виктором Штиннером в [bpo-42856](https://python-all.ru/3.13/whatsnew/3.10.html).)1142- Добавлена новая [`configure --without-static-libpython option`](https://python-all.ru/3.13/using/configure.html#cmdoption-without-static-libpython), чтобы не собирать статическую библиотеку `libpythonMAJOR.MINOR.a` и не устанавливать объектный файл `python.o`.11431144  (Предложено Виктором Штиннером в [bpo-43103](https://python-all.ru/3.13/whatsnew/3.10.html).)1145- Скрипт `configure` теперь использует утилиту `pkg-config`, если она доступна, для определения местоположения заголовков и библиотек Tcl/Tk. Как и раньше, эти местоположения можно указать явно с помощью опций конфигурации `--with-tcltk-includes` и `--with-tcltk-libs`. (Предложено Манолисом Стаматогианнакисом в [bpo-42603](https://python-all.ru/3.13/whatsnew/3.10.html).)1146- Добавлена опция [`--with-openssl-rpath`](https://python-all.ru/3.13/using/configure.html#cmdoption-with-openssl-rpath) в скрипт `configure`. Эта опция упрощает сборку Python с пользовательской установкой OpenSSL, например `./configure --with-openssl=/path/to/openssl --with-openssl-rpath=auto`. (Предложено Кристианом Хаймсом в [bpo-43466](https://python-all.ru/3.13/whatsnew/3.10.html).)11471148## Изменения C API11491150### PEP 652: Поддержание стабильного ABI11511152Стабильный ABI (интерфейс двоичного кода приложений) для модулей расширения или встраивания Python теперь явно определён. [Стабильность C API](https://python-all.ru/3.13/c-api/stable.html#stable) описывает гарантии стабильности C API и ABI, а также лучшие практики использования стабильного ABI.11531154(Предложено Петром Викториным в [**PEP 652**](https://python-all.ru/3.13/whatsnew/3.10.html) и [bpo-43795](https://python-all.ru/3.13/whatsnew/3.10.html).)11551156### Новые возможности11571158- Результат [`PyNumber_Index()`](https://python-all.ru/3.13/c-api/number.html#c.PyNumber_Index) теперь всегда имеет точный тип [`int`](https://python-all.ru/3.13/library/functions.html#int). Ранее результатом мог быть экземпляр подкласса `int`. (Предложено Сергеем Сторчакой в [bpo-40792](https://python-all.ru/3.13/whatsnew/3.10.html).)1159- Добавлен новый член [`orig_argv`](https://python-all.ru/3.13/c-api/init_config.html#c.PyConfig.orig_argv) в структуру [`PyConfig`](https://python-all.ru/3.13/c-api/init_config.html#c.PyConfig): список исходных аргументов командной строки, переданных исполняемому файлу Python. (Предложено Виктором Штиннером в [bpo-23427](https://python-all.ru/3.13/whatsnew/3.10.html).)1160- Добавлены макросы [`PyDateTime_DATE_GET_TZINFO()`](https://python-all.ru/3.13/c-api/datetime.html#c.PyDateTime_DATE_GET_TZINFO) и [`PyDateTime_TIME_GET_TZINFO()`](https://python-all.ru/3.13/c-api/datetime.html#c.PyDateTime_TIME_GET_TZINFO) для доступа к атрибутам `tzinfo` объектов [`datetime.datetime`](https://python-all.ru/3.13/library/datetime.html#datetime.datetime) и [`datetime.time`](https://python-all.ru/3.13/library/datetime.html#datetime.time). (Предложено Закери Спайтцем в [bpo-30155](https://python-all.ru/3.13/whatsnew/3.10.html).)1161- Добавлена функция [`PyCodec_Unregister()`](https://python-all.ru/3.13/c-api/codec.html#c.PyCodec_Unregister) для отмены регистрации функции поиска кодеков. (Предложено Хай Ши в [bpo-41842](https://python-all.ru/3.13/whatsnew/3.10.html).)1162- Добавлена функция [`PyIter_Send()`](https://python-all.ru/3.13/c-api/iter.html#c.PyIter_Send), позволяющая отправить значение в итератор без возбуждения исключения `StopIteration`. (Предложено Владимиром Матвеевым в [bpo-41756](https://python-all.ru/3.13/whatsnew/3.10.html).)1163- Добавлен [`PyUnicode_AsUTF8AndSize()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_AsUTF8AndSize) в ограниченный C API. (Предложено Алексом Гейнором в [bpo-41784](https://python-all.ru/3.13/whatsnew/3.10.html).)1164- Добавлена функция [`PyModule_AddObjectRef()`](https://python-all.ru/3.13/c-api/module.html#c.PyModule_AddObjectRef): похожа на [`PyModule_AddObject()`](https://python-all.ru/3.13/c-api/module.html#c.PyModule_AddObject), но не крадёт ссылку на значение при успехе. (Предложено Виктором Штиннером в [bpo-1635741](https://python-all.ru/3.13/whatsnew/3.10.html).)1165- Добавлены функции [`Py_NewRef()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_NewRef) и [`Py_XNewRef()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_XNewRef) для увеличения счётчика ссылок объекта и возврата объекта. (Предложено Виктором Штиннером в [bpo-42262](https://python-all.ru/3.13/whatsnew/3.10.html).)1166- Функции [`PyType_FromSpecWithBases()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_FromSpecWithBases) и [`PyType_FromModuleAndSpec()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_FromModuleAndSpec) теперь принимают один класс в качестве аргумента *bases*. (Предложено Сергеем Сторчакой в [bpo-42423](https://python-all.ru/3.13/whatsnew/3.10.html).)1167- Функция [`PyType_FromModuleAndSpec()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_FromModuleAndSpec) теперь принимает NULL-слот `tp_doc`. (Предложено Хай Ши в [bpo-41832](https://python-all.ru/3.13/whatsnew/3.10.html).)1168- Функция [`PyType_GetSlot()`](https://python-all.ru/3.13/c-api/type.html#c.PyType_GetSlot) может принимать [статические типы](https://python-all.ru/3.13/c-api/typeobj.html#static-types). (Предложено Хай Ши и Петром Викториным в [bpo-41073](https://python-all.ru/3.13/whatsnew/3.10.html).)1169- Добавлена новая функция [`PySet_CheckExact()`](https://python-all.ru/3.13/c-api/set.html#c.PySet_CheckExact) в C-API, проверяющая, является ли объект экземпляром [`set`](https://python-all.ru/3.13/library/stdtypes.html#set), но не экземпляром подтипа. (Автор: Pablo Galindo в [bpo-43277](https://python-all.ru/3.13/whatsnew/3.10.html).)1170- Добавлена функция [`PyErr_SetInterruptEx()`](https://python-all.ru/3.13/c-api/exceptions.html#c.PyErr_SetInterruptEx), позволяющая передавать номер сигнала для имитации. (Автор: Antoine Pitrou в [bpo-43356](https://python-all.ru/3.13/whatsnew/3.10.html).)1171- Ограниченный C-API теперь поддерживается, если [Python собран в режиме отладки](https://python-all.ru/3.13/using/configure.html#debug-build) (если определён макрос `Py_DEBUG`). В ограниченном C-API функции [`Py_INCREF()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_INCREF) и [`Py_DECREF()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_DECREF) теперь реализованы как вызовы непрозрачных функций, а не как прямой доступ к члену [`PyObject.ob_refcnt`](https://python-all.ru/3.13/c-api/typeobj.html#c.PyObject.ob_refcnt), если Python собран в режиме отладки и макрос `Py_LIMITED_API` нацелен на Python 3.10 или новее. Поддержка ограниченного C-API в режиме отладки стала возможна благодаря тому, что структура [`PyObject`](https://python-all.ru/3.13/c-api/structures.html#c.PyObject) одинакова в релизном и отладочном режимах начиная с Python 3.8 (см. [bpo-36465](https://python-all.ru/3.13/whatsnew/3.10.html)).11721173  Ограниченный C-API по-прежнему не поддерживается в специальной сборке [`--with-trace-refs`](https://python-all.ru/3.13/using/configure.html#cmdoption-with-trace-refs) (макрос `Py_TRACE_REFS`). (Автор: Victor Stinner в [bpo-43688](https://python-all.ru/3.13/whatsnew/3.10.html).)1174- Добавлена функция [`Py_Is(x, y)`](https://python-all.ru/3.13/c-api/structures.html#c.Py_Is) для проверки, является ли объект *x* тем же объектом *y*, что аналогично `x is y` в Python. Также добавлены функции [`Py_IsNone()`](https://python-all.ru/3.13/c-api/structures.html#c.Py_IsNone), [`Py_IsTrue()`](https://python-all.ru/3.13/c-api/structures.html#c.Py_IsTrue), [`Py_IsFalse()`](https://python-all.ru/3.13/c-api/structures.html#c.Py_IsFalse) для проверки, является ли объект соответственно синглтоном `None`, синглтоном `True` или синглтоном `False`. (Автор: Victor Stinner в [bpo-43753](https://python-all.ru/3.13/whatsnew/3.10.html).)1175- Добавлены новые функции для управления сборщиком мусора из C-кода: [`PyGC_Enable()`](https://python-all.ru/3.13/c-api/gcsupport.html#c.PyGC_Enable), [`PyGC_Disable()`](https://python-all.ru/3.13/c-api/gcsupport.html#c.PyGC_Disable), [`PyGC_IsEnabled()`](https://python-all.ru/3.13/c-api/gcsupport.html#c.PyGC_IsEnabled). Эти функции позволяют активировать, деактивировать и запрашивать состояние сборщика мусора из C-кода без необходимости импорта модуля [`gc`](https://python-all.ru/3.13/library/gc.html#module-gc).1176- Добавлен новый флаг типа [`Py_TPFLAGS_DISALLOW_INSTANTIATION`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_DISALLOW_INSTANTIATION) для запрета создания экземпляров типа. (Автор: Victor Stinner в [bpo-43916](https://python-all.ru/3.13/whatsnew/3.10.html).)1177- Добавлен новый флаг типа [`Py_TPFLAGS_IMMUTABLETYPE`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_IMMUTABLETYPE) для создания неизменяемых объектов типа: атрибуты типа нельзя ни установить, ни удалить. (Авторы: Victor Stinner и Erlend E. Aasland в [bpo-43908](https://python-all.ru/3.13/whatsnew/3.10.html).)11781179### Перенос на Python 3.1011801181- Теперь для использования форматов [`PyArg_ParseTuple()`](https://python-all.ru/3.13/c-api/arg.html#c.PyArg_ParseTuple) и [`Py_BuildValue()`](https://python-all.ru/3.13/c-api/arg.html#c.Py_BuildValue), которые используют `#`, должен быть определён макрос `PY_SSIZE_T_CLEAN`: `es#`, `et#`, `s#`, `u#`, `y#`, `z#`, `U#` и `Z#`. См. [Разбор аргументов и формирование значений](https://python-all.ru/3.13/c-api/arg.html#arg-parsing) и [**PEP 353**](https://python-all.ru/3.13/whatsnew/3.10.html). (Автор: Victor Stinner в [bpo-40943](https://python-all.ru/3.13/whatsnew/3.10.html).)1182- Поскольку [`Py_REFCNT()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_REFCNT) изменена на встраиваемую статическую функцию, `Py_REFCNT(obj) = new_refcnt` должна быть заменена на `Py_SET_REFCNT(obj, new_refcnt)`: см. [`Py_SET_REFCNT()`](https://python-all.ru/3.13/c-api/refcounting.html#c.Py_SET_REFCNT) (доступно начиная с Python 3.9). Для обратной совместимости может использоваться этот макрос:11831184  ```python1185  #if PY_VERSION_HEX < 0x030900A41186  #  define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0)1187  #endif1188  ```11891190  (Автор: Victor Stinner в [bpo-39573](https://python-all.ru/3.13/whatsnew/3.10.html).)1191- Вызов [`PyDict_GetItem()`](https://python-all.ru/3.13/c-api/dict.html#c.PyDict_GetItem) без удержания [GIL](https://python-all.ru/3.13/glossary.html#term-GIL) ранее допускался по историческим причинам. Теперь это запрещено. (Автор: Victor Stinner в [bpo-40839](https://python-all.ru/3.13/whatsnew/3.10.html).)1192- `PyUnicode_FromUnicode(NULL, size)` и `PyUnicode_FromStringAndSize(NULL, size)` теперь возбуждают `DeprecationWarning`. Для выделения объекта Unicode без начальных данных используйте [`PyUnicode_New()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_New). (Автор: Inada Naoki в [bpo-36346](https://python-all.ru/3.13/whatsnew/3.10.html).)1193- Приватная структура `_PyUnicode_Name_CAPI` `unicodedata.ucnhash_CAPI` API PyCapsule перемещена во внутренний C-API. (Автор: Victor Stinner в [bpo-42157](https://python-all.ru/3.13/whatsnew/3.10.html).)1194- Функции [`Py_GetPath()`](https://python-all.ru/3.13/c-api/init.html#c.Py_GetPath), [`Py_GetPrefix()`](https://python-all.ru/3.13/c-api/init.html#c.Py_GetPrefix), [`Py_GetExecPrefix()`](https://python-all.ru/3.13/c-api/init.html#c.Py_GetExecPrefix), [`Py_GetProgramFullPath()`](https://python-all.ru/3.13/c-api/init.html#c.Py_GetProgramFullPath), [`Py_GetPythonHome()`](https://python-all.ru/3.13/c-api/init.html#c.Py_GetPythonHome) и [`Py_GetProgramName()`](https://python-all.ru/3.13/c-api/init.html#c.Py_GetProgramName) теперь возвращают `NULL`, если они вызваны до [`Py_Initialize()`](https://python-all.ru/3.13/c-api/init.html#c.Py_Initialize) (до инициализации Python). Используйте новый API [Начальная конфигурация Python](https://python-all.ru/3.13/c-api/init_config.html#init-config) для получения [Конфигурации путей Python](https://python-all.ru/3.13/c-api/init_config.html#init-path-config). (Автор: Victor Stinner в [bpo-42260](https://python-all.ru/3.13/whatsnew/3.10.html).)1195- Макросы [`PyList_SET_ITEM()`](https://python-all.ru/3.13/c-api/list.html#c.PyList_SET_ITEM), [`PyTuple_SET_ITEM()`](https://python-all.ru/3.13/c-api/tuple.html#c.PyTuple_SET_ITEM) и [`PyCell_SET()`](https://python-all.ru/3.13/c-api/cell.html#c.PyCell_SET) больше нельзя использовать в качестве l-value или r-value. Например, `x = PyList_SET_ITEM(a, b, c)` и `PyList_SET_ITEM(a, b, c) = x` теперь приводят к ошибке компиляции. Это предотвращает ошибки наподобие теста `if (PyList_SET_ITEM (a, b, c) < 0) ...`. (Авторы: Zackery Spytz и Victor Stinner в [bpo-30459](https://python-all.ru/3.13/whatsnew/3.10.html).)1196- Файлы `odictobject.h`, `parser_interface.h`, `picklebufobject.h`, `pyarena.h`, `pyctype.h`, `pydebug.h`, `pyfpe.h` и `pytime.h` (не входящие в ограниченный API) перемещены в каталог `Include/cpython`. Эти файлы не следует включать напрямую, поскольку они уже включены в `Python.h`; см. [Файлы для включения](https://python-all.ru/3.13/c-api/intro.html#api-includes). Если они были включены напрямую, рассмотрите включение `Python.h` вместо этого. (Автор: Nicholas Sim в [bpo-35134](https://python-all.ru/3.13/whatsnew/3.10.html).)1197- Используйте флаг типа [`Py_TPFLAGS_IMMUTABLETYPE`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_IMMUTABLETYPE) для создания неизменяемых объектов типа. Не полагайтесь на [`Py_TPFLAGS_HEAPTYPE`](https://python-all.ru/3.13/c-api/typeobj.html#c.Py_TPFLAGS_HEAPTYPE), чтобы определить, является ли объект типа изменяемым; вместо этого проверяйте, установлен ли `Py_TPFLAGS_IMMUTABLETYPE`. (Авторы: Victor Stinner и Erlend E. Aasland в [bpo-43908](https://python-all.ru/3.13/whatsnew/3.10.html).)1198- Незадокументированная функция `Py_FrozenMain` удалена из ограниченного API. Эта функция в основном полезна для пользовательских сборок Python. (Автор: Petr Viktorin в [bpo-26241](https://python-all.ru/3.13/whatsnew/3.10.html).)11991200### Устарело12011202- Функция `PyUnicode_InternImmortal()` теперь устарела и будет удалена в Python 3.12; используйте [`PyUnicode_InternInPlace()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_InternInPlace) вместо неё. (Автор: Victor Stinner в [bpo-41692](https://python-all.ru/3.13/whatsnew/3.10.html).)12031204### Удалено12051206- Удалены функции `Py_UNICODE_str*`, работающие со строками `Py_UNICODE*`. (Автор: Inada Naoki в [bpo-41123](https://python-all.ru/3.13/whatsnew/3.10.html).)12071208  - `Py_UNICODE_strlen`: используйте [`PyUnicode_GetLength()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_GetLength) или [`PyUnicode_GET_LENGTH`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_GET_LENGTH)1209  - `Py_UNICODE_strcat`: используйте [`PyUnicode_CopyCharacters()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_CopyCharacters) или [`PyUnicode_FromFormat()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_FromFormat)1210  - `Py_UNICODE_strcpy`, `Py_UNICODE_strncpy`: используйте [`PyUnicode_CopyCharacters()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_CopyCharacters) или [`PyUnicode_Substring()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_Substring)1211  - `Py_UNICODE_strcmp`: используйте [`PyUnicode_Compare()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_Compare)1212  - `Py_UNICODE_strncmp`: используйте [`PyUnicode_Tailmatch()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_Tailmatch)1213  - `Py_UNICODE_strchr`, `Py_UNICODE_strrchr`: используйте [`PyUnicode_FindChar()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_FindChar)1214- Удалена `PyUnicode_GetMax()`. Переходите на новые API ([**PEP 393**](https://python-all.ru/3.13/whatsnew/3.10.html)). (Автор: Inada Naoki в [bpo-41103](https://python-all.ru/3.13/whatsnew/3.10.html).)1215- Удалена `PyLong_FromUnicode()`. Переходите на [`PyLong_FromUnicodeObject()`](https://python-all.ru/3.13/c-api/long.html#c.PyLong_FromUnicodeObject). (Автор: Inada Naoki в [bpo-41103](https://python-all.ru/3.13/whatsnew/3.10.html).)1216- Удалено `PyUnicode_AsUnicodeCopy()`. Используйте [`PyUnicode_AsUCS4Copy()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_AsUCS4Copy) или [`PyUnicode_AsWideCharString()`](https://python-all.ru/3.13/c-api/unicode.html#c.PyUnicode_AsWideCharString) (Автор: Inada Naoki, [bpo-41103](https://python-all.ru/3.13/whatsnew/3.10.html).)1217- Удалена переменная `_Py_CheckRecursionLimit`: она заменена на `ceval.recursion_limit` структуры [`PyInterpreterState`](https://python-all.ru/3.13/c-api/init.html#c.PyInterpreterState). (Автор: Victor Stinner, [bpo-41834](https://python-all.ru/3.13/whatsnew/3.10.html).)1218- Удалены недокументированные макросы `Py_ALLOW_RECURSION` и `Py_END_ALLOW_RECURSION`, а также поле `recursion_critical` структуры [`PyInterpreterState`](https://python-all.ru/3.13/c-api/init.html#c.PyInterpreterState). (Автор: Serhiy Storchaka, [bpo-41936](https://python-all.ru/3.13/whatsnew/3.10.html).)1219- Удалена недокументированная функция `PyOS_InitInterrupts()`. При инициализации Python уже неявно устанавливает обработчики сигналов: см. [`PyConfig.install_signal_handlers`](https://python-all.ru/3.13/c-api/init_config.html#c.PyConfig.install_signal_handlers). (Автор: Victor Stinner, [bpo-41713](https://python-all.ru/3.13/whatsnew/3.10.html).)1220- Remove the `PyAST_Validate()` function. It is no longer possible to build a AST object (`mod_ty` type) with the public C API. The function was already excluded from the limited C API ([**PEP 384**](https://python-all.ru/3.13/whatsnew/3.10.html)). (Contributed by Victor Stinner in [bpo-43244](https://python-all.ru/3.13/whatsnew/3.10.html).)1221- Удалены заголовочный файл `symtable.h` и недокументированные функции:12221223  - `PyST_GetScope()`1224  - `PySymtable_Build()`1225  - `PySymtable_BuildObject()`1226  - `PySymtable_Free()`1227  - `Py_SymtableString()`1228  - `Py_SymtableStringObject()`12291230  Функция `Py_SymtableString()` по ошибке была частью стабильного ABI, но не могла использоваться, так как заголовочный файл `symtable.h` был исключён из ограниченного C API.12311232  Вместо этого используйте модуль Python [`symtable`](https://python-all.ru/3.13/library/symtable.html#module-symtable). (Автор: Victor Stinner, [bpo-43244](https://python-all.ru/3.13/whatsnew/3.10.html).)1233- Удалён [`PyOS_ReadlineFunctionPointer()`](https://python-all.ru/3.13/c-api/veryhigh.html#c.PyOS_ReadlineFunctionPointer) из заголовков ограниченного C API и из `python3.dll` (библиотеки, предоставляющей стабильный ABI в Windows). Поскольку функция принимает аргумент `FILE*`, её стабильность ABI не может быть гарантирована. (Автор: Petr Viktorin, [bpo-43868](https://python-all.ru/3.13/whatsnew/3.10.html).)1234- Удалены заголовочные файлы `ast.h`, `asdl.h` и `Python-ast.h`. Эти функции были недокументированы и исключены из ограниченного C API. Большинство имён, определённых в этих заголовочных файлах, не имели префикса `Py` и поэтому могли создавать конфликты имён. Например, `Python-ast.h` определял макрос `Yield`, который конфликтовал с именем `Yield`, используемым заголовком Windows `<winbase.h>`. Вместо этого используйте модуль Python [`ast`](https://python-all.ru/3.13/library/ast.html#module-ast). (Автор: Victor Stinner, [bpo-43244](https://python-all.ru/3.13/whatsnew/3.10.html).)1235- Удалены функции компилятора и парсера, использующие тип `struct _mod`, так как публичный C API для AST был удалён:12361237  - `PyAST_Compile()`1238  - `PyAST_CompileEx()`1239  - `PyAST_CompileObject()`1240  - `PyFuture_FromAST()`1241  - `PyFuture_FromASTObject()`1242  - `PyParser_ASTFromFile()`1243  - `PyParser_ASTFromFileObject()`1244  - `PyParser_ASTFromFilename()`1245  - `PyParser_ASTFromString()`1246  - `PyParser_ASTFromStringObject()`12471248  Эти функции были недокументированы и исключены из ограниченного C API. (Автор: Victor Stinner, [bpo-43244](https://python-all.ru/3.13/whatsnew/3.10.html).)1249- Удалён заголовочный файл `pyarena.h` с функциями:12501251  - `PyArena_New()`1252  - `PyArena_Free()`1253  - `PyArena_Malloc()`1254  - `PyArena_AddPyObject()`12551256  Эти функции были недокументированы, исключены из ограниченного C API и использовались только внутри компилятора. (Автор: Victor Stinner, [bpo-43244](https://python-all.ru/3.13/whatsnew/3.10.html).)1257- Элемент `PyThreadState.use_tracing` удалён для оптимизации Python. (Автор: Mark Shannon, [bpo-43760](https://python-all.ru/3.13/whatsnew/3.10.html).)12581259## Важная функция безопасности в 3.10.712601261Преобразование между [`int`](https://python-all.ru/3.13/library/functions.html#int) и [`str`](https://python-all.ru/3.13/library/stdtypes.html#str) по основаниям, отличным от 2 (двоичное), 4, 8 (восьмеричное), 16 (шестнадцатеричное) или 32, таким как основание 10 (десятичное), теперь вызывает [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError), если количество цифр в строковом представлении превышает лимит, чтобы избежать потенциальных атак типа «отказ в обслуживании» из-за алгоритмической сложности. Это смягчение для [**CVE 2020-10735**](https://python-all.ru/3.13/whatsnew/3.10.html). Этот лимит можно настроить или отключить с помощью переменной окружения, флага командной строки или API [`sys`](https://python-all.ru/3.13/library/sys.html#module-sys). См. документацию [ограничения длины строкового представления целых чисел](https://python-all.ru/3.13/library/stdtypes.html#int-max-str-digits). Лимит по умолчанию – 4300 цифр в строковом представлении.12621263## Важная функция безопасности в 3.10.812641265Устаревший модуль `mailcap` теперь отказывается внедрять небезопасный текст (имена файлов, MIME-типы, параметры) в команды оболочки. Вместо использования такого текста он выдаст предупреждение и будет действовать так, как если бы совпадение не было найдено (или для тестовых команд, как если бы тест провалился). (Автор: Petr Viktorin, [gh-98966](https://python-all.ru/3.13/whatsnew/3.10.html).)12661267## Важные изменения в 3.10.1212681269### tarfile12701271- Методы извлечения в [`tarfile`](https://python-all.ru/3.13/library/tarfile.html#module-tarfile) и [`shutil.unpack_archive()`](https://python-all.ru/3.13/library/shutil.html#shutil.unpack_archive) получили новый аргумент *filter*, позволяющий ограничивать возможности tar, которые могут быть неожиданными или опасными, например создание файлов за пределами целевого каталога. Подробнее см. [Extraction filters](https://python-all.ru/3.13/library/tarfile.html#tarfile-extraction-filter). В Python 3.12 использование без аргумента *filter* вызовет [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning). В Python 3.14 значение по умолчанию будет изменено на `'data'`. (Автор: Petr Viktorin в [**PEP 706**](https://python-all.ru/3.13/whatsnew/3.10.html).)1272