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

3.10.md

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

1> **Источник:** https://python-all.ru/3.12/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.12/whatsnew/changelog.html#changelog).1415## Итоги – основные изменения1617Новые синтаксические возможности:1819- [**PEP 634**](https://python-all.ru/3.12/whatsnew/3.10.html), Структурное сопоставление с образцом: спецификация20- [**PEP 635**](https://python-all.ru/3.12/whatsnew/3.10.html), Структурное сопоставление с образцом: мотивация и обоснование21- [**PEP 636**](https://python-all.ru/3.12/whatsnew/3.10.html), Структурное сопоставление с образцом: руководство22- [bpo-12782](https://python-all.ru/3.12/whatsnew/3.10.html), теперь официально разрешены контекстные менеджеры в скобках.2324Новые возможности в стандартной библиотеке:2526- [**PEP 618**](https://python-all.ru/3.12/whatsnew/3.10.html), добавление опциональной проверки длины в zip.2728Улучшения интерпретатора:2930- [**PEP 626**](https://python-all.ru/3.12/whatsnew/3.10.html), точные номера строк для отладки и других инструментов.3132Новые возможности типизации:3334- [**PEP 604**](https://python-all.ru/3.12/whatsnew/3.10.html), разрешение записи объединённых типов как X | Y35- [**PEP 612**](https://python-all.ru/3.12/whatsnew/3.10.html), переменные спецификации параметров36- [**PEP 613**](https://python-all.ru/3.12/whatsnew/3.10.html), явные псевдонимы типов37- [**PEP 647**](https://python-all.ru/3.12/whatsnew/3.10.html), пользовательские гарды типов3839Важные устаревания, удаления и ограничения:4041- [**PEP 644**](https://python-all.ru/3.12/whatsnew/3.10.html), требуется OpenSSL 1.1.1 или новее42- [**PEP 632**](https://python-all.ru/3.12/whatsnew/3.10.html), устаревание модуля distutils.43- [**PEP 623**](https://python-all.ru/3.12/whatsnew/3.10.html), устаревание и подготовка к удалению элемента wstr в PyUnicodeObject.44- [**PEP 624**](https://python-all.ru/3.12/whatsnew/3.10.html), удаление API кодировщиков Py\_UNICODE45- [**PEP 597**](https://python-all.ru/3.12/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.12/whatsnew/3.10.html).9091(Авторы: Guido van Rossum, Pablo Galindo и Lysandros Nikolaou в [bpo-12782](https://python-all.ru/3.12/whatsnew/3.10.html) и [bpo-40334](https://python-all.ru/3.12/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.12/whatsnew/3.10.html) и Batuhan Taskaya в [bpo-40176](https://python-all.ru/3.12/whatsnew/3.10.html).)128129[`SyntaxError`](https://python-all.ru/3.12/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.12/whatsnew/3.10.html).150151Добавлено значительное количество новых специализированных сообщений для исключений [`SyntaxError`](https://python-all.ru/3.12/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.12/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.12/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.12/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.12/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.12/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.12/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.12/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.12/whatsnew/3.10.html).)258259#### IndentationErrors260261Многие исключения [`IndentationError`](https://python-all.ru/3.12/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.12/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.12/whatsnew/3.10.html).)285286> **Предупреждение**287>288> Обратите внимание: это не будет работать, если `PyErr_Display()` не вызывается для отображения ошибки что может произойти, если используется другая пользовательская функция отображения ошибок. Это обычная ситуация в некоторых интерактивных оболочках, например IPython.289290#### NameErrors291292При выводе [`NameError`](https://python-all.ru/3.12/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.12/whatsnew/3.10.html).)303304> **Предупреждение**305>306> Обратите внимание: это не будет работать, если `PyErr_Display()` не вызывается для отображения ошибки, что может произойти, если используется другая пользовательская функция отображения ошибок. Это обычная ситуация в некоторых интерактивных оболочках, например IPython.307308### PEP 626: Точные номера строк для отладки и других инструментов309310PEP 626 привносит более точные и надёжные номера строк для инструментов отладки, профилирования и покрытия кода. События трассировки с правильным номером строки генерируются для всех выполняемых строк кода и только для выполняемых строк кода.311312Атрибут [`f_lineno`](https://python-all.ru/3.12/reference/datamodel.html#frame.f_lineno) объектов фреймов всегда будет содержать ожидаемый номер строки.313314Атрибут [`co_lnotab`](https://python-all.ru/3.12/reference/datamodel.html#codeobject.co_lnotab) [объектов кода](https://python-all.ru/3.12/reference/datamodel.html#code-objects) устарел и будет удалён в версии 3.12. Коду, которому необходимо преобразовывать смещение в номер строки, следует использовать новый метод [`co_lines()`](https://python-all.ru/3.12/reference/datamodel.html#codeobject.co_lines).315316### PEP 634: Структурное сопоставление с образцом317318Структурное сопоставление с образцом было добавлено в виде *оператора match* и *операторов case* с шаблонами и связанными с ними действиями. Шаблоны состоят из последовательностей, отображений, примитивных типов данных, а также экземпляров классов. Сопоставление с образцом позволяет программам извлекать информацию из сложных типов данных, выполнять ветвление на основе структуры данных и применять конкретные действия в зависимости от формы данных.319320#### Синтаксис и операции321322Общий синтаксис сопоставления с образцом:323324```python325match subject:326    case <pattern_1>:327        <action_1>328    case <pattern_2>:329        <action_2>330    case <pattern_3>:331        <action_3>332    case _:333        <action_wildcard>334```335336Оператор match принимает выражение и сравнивает его значение с последовательными шаблонами, заданными в виде одного или нескольких блоков case. В частности, сопоставление с образцом работает следующим образом:3373381. используя данные с типом и формой (`subject`)3392. вычисляя `subject` в операторе `match`3403. сравнивая проверяемое значение с каждым шаблоном в операторе `case` сверху вниз до подтверждения совпадения.3414. выполняя действие, связанное с шаблоном подтверждённого совпадения3425. Если точное совпадение не подтверждено, последний оператор case, универсальный шаблон `_`, если он предусмотрен, будет использован как совпадающий. Если точное совпадение не подтверждено и универсальный шаблон отсутствует, весь блок match ничего не делает (no-op).343344#### Декларативный подход345346Читатели могут быть знакомы с сопоставлением с образцом по простому примеру сопоставления выражения (объекта данных) с литералом (шаблоном) с помощью оператора switch в C, Java или JavaScript (и многих других языках). Часто оператор switch используется для сравнения объекта/выражения с операторами case, содержащими литералы.347348Более мощные примеры сопоставления с образцом можно найти в таких языках, как Scala и Elixir. При структурном сопоставлении с образцом подход является «декларативным» и явно задаёт условия (шаблоны), которым должны соответствовать данные.349350Хотя «императивный» набор инструкций с вложенными операторами «if» можно использовать для достижения чего-то похожего на структурное сопоставление с образцом, он менее понятен, чем «декларативный» подход. Вместо этого «декларативный» подход задаёт условия для совпадения и более читаем благодаря явным шаблонам. Хотя структурное сопоставление с образцом можно использовать в его простейшей форме – сравнение переменной с литералом в операторе case, его истинная ценность для Python заключается в обработке типа и формы проверяемого значения.351352#### Простой шаблон: сопоставление с литералом353354Рассмотрим этот пример как сопоставление с образцом в его простейшей форме: значение (проверяемое выражение) сопоставляется с несколькими литералами (шаблонами). В примере ниже `status` является проверяемым выражением оператора match. Шаблонами являются каждый из операторов case, где литералы представляют коды статуса запроса. Связанное с оператором case действие выполняется после совпадения:355356```python357def http_error(status):358    match status:359        case 400:360            return "Bad request"361        case 404:362            return "Not found"363        case 418:364            return "I'm a teapot"365        case _:366            return "Something's wrong with the internet"367```368369Если в указанную выше функцию передано `status` со значением 418, возвращается «I’m a teapot». Если передано `status` со значением 500, оператор case с `_` совпадёт как универсальный шаблон, и будет возвращено «Something’s wrong with the internet». Обратите внимание на последний блок: имя переменной `_` действует как *универсальный шаблон* и гарантирует, что проверяемое значение всегда совпадёт. Использование `_` необязательно.370371Можно объединить несколько литералов в одном шаблоне с помощью `|` («или»):372373```python374case 401 | 403 | 404:375    return "Not allowed"376```377378##### Поведение без универсального шаблона379380Если изменить предыдущий пример, удалив последний блок case, пример станет таким:381382```python383def http_error(status):384    match status:385        case 400:386            return "Bad request"387        case 404:388            return "Not found"389        case 418:390            return "I'm a teapot"391```392393Без использования `_` в операторе case совпадения может не быть. Если совпадения нет, поведение – пустая операция (no-op). Например, если передано `status` со значением 500, ничего не происходит.394395#### Шаблоны с литералом и переменной396397Шаблоны могут выглядеть как распаковка в присваивании, и шаблон может использоваться для связывания переменных. В этом примере точка данных может быть распакована на её x-координату и y-координату:398399```python400# point – это кортеж (x, y)401match point:402    case (0, 0):403        print("Origin")404    case (0, y):405        print(f"Y={y}")406    case (x, 0):407        print(f"X={x}")408    case (x, y):409        print(f"X={x}, Y={y}")410    case _:411        raise ValueError("Not a point")412```413414Первый шаблон содержит два литерала, `(0, 0)`, и может рассматриваться как расширение шаблона-литерала, показанного выше. Следующие два шаблона объединяют литерал и переменную, и переменная *связывает* значение из проверяемого выражения (`point`). Четвёртый шаблон захватывает два значения, что делает его концептуально похожим на распаковывающее присваивание `(x, y) = point`.415416#### Шаблоны и классы417418Если для структурирования данных используются классы, в качестве шаблона можно использовать имя класса, за которым следует список аргументов, напоминающий конструктор. Этот шаблон позволяет захватывать атрибуты класса в переменные:419420```python421class Point:422    x: int423    y: int424425def location(point):426    match point:427        case Point(x=0, y=0):428            print("Origin is the point's location.")429        case Point(x=0, y=y):430            print(f"Y={y} and the point is on the y-axis.")431        case Point(x=x, y=0):432            print(f"X={x} and the point is on the x-axis.")433        case Point():434            print("The point is located somewhere else on the plane.")435        case _:436            print("Not a point")437```438439##### Шаблоны с позиционными параметрами440441Вы можете использовать позиционные параметры с некоторыми встроенными классами, которые предоставляют упорядочивание для своих атрибутов (например, dataclasses). Вы также можете определить конкретную позицию для атрибутов в шаблонах, задав специальный атрибут `__match_args__` в своих классах. Если он установлен в (“x”, “y”), следующие шаблоны все эквивалентны (и все связывают атрибут `y` с переменной `var`):442443```python444Point(1, var)445Point(1, y=var)446Point(x=1, y=var)447Point(y=var, x=1)448```449450#### Вложенные шаблоны451452Шаблоны могут быть произвольно вложенными. Например, если наши данные – короткий список точек, их можно сопоставить следующим образом:453454```python455match points:456    case []:457        print("No points in the list.")458    case [Point(0, 0)]:459        print("The origin is the only point in the list.")460    case [Point(x, y)]:461        print(f"A single point {x}, {y} is in the list.")462    case [Point(0, y1), Point(0, y2)]:463        print(f"Two points on the Y axis at {y1}, {y2} are in the list.")464    case _:465        print("Something else is found in the list.")466```467468#### Сложные шаблоны и универсальный шаблон469470До этого момента в примерах использовался `_` отдельно в последнем операторе case. Универсальный шаблон можно использовать в более сложных шаблонах, например `('error', code, _)`. Например:471472```python473match test_variable:474    case ('warning', code, 40):475        print("A warning has been received.")476    case ('error', code, _):477        print(f"An error {code} occurred.")478```479480В приведённом выше случае `test_variable` будет соответствовать (‘error’, code, 100) и (‘error’, code, 800).481482#### Ограничитель483484К шаблону можно добавить предложение `if`, известное как «страж». Если страж ложен, `match` переходит к следующему блоку case. Обратите внимание, что захват значения происходит до вычисления стража:485486```python487match point:488    case Point(x, y) if x == y:489        print(f"The point is located on the diagonal Y=X at {x}.")490    case Point(x, y):491        print(f"Point is not on the diagonal.")492```493494#### Другие ключевые особенности495496Несколько других важных возможностей:497498- Как и при распаковке присваиваний, шаблоны кортежей и списков имеют одинаковый смысл и по сути сопоставляются с произвольными последовательностями. Технически субъект должен быть последовательностью. Поэтому важное исключение: шаблоны не сопоставляются с итераторами. Кроме того, чтобы избежать распространённой ошибки, шаблоны последовательностей не сопоставляются со строками.499- Шаблоны последовательностей поддерживают подстановочные знаки: `[x, y, *rest]` и `(x, y, *rest)` работают аналогично подстановочным знакам при распаковке присваиваний. Имя после `*` также может быть `_`, поэтому `(x, y, *_)` сопоставляется с последовательностью из не менее двух элементов без привязки остальных элементов.500- Шаблоны отображений: `{"bandwidth": b, "latency": l}` захватывает значения `"bandwidth"` и `"latency"` из словаря. В отличие от шаблонов последовательностей, лишние ключи игнорируются. Также поддерживается подстановочный знак `**rest`. (Но `**_` был бы избыточным, поэтому не допускается.)501- Подшаблоны могут быть захвачены с помощью ключевого слова `as`:502503  ```python504  case (Point(x1, y1), Point(x2, y2) as p2): ...505  ```506507  Это связывает x1, y1, x2, y2, как и ожидалось, без пункта `as`, а p2 – со всем вторым элементом субъекта.508- Большинство литералов сравниваются по равенству. Однако синглтоны `True`, `False` и `None` сравниваются по идентичности.509- Именованные константы можно использовать в шаблонах. Они должны быть точечными именами, чтобы константа не интерпретировалась как переменная захвата:510511  ```python512  from enum import Enum513  class Color(Enum):514      RED = 0515      GREEN = 1516      BLUE = 2517518  color = Color.GREEN519  match color:520      case Color.RED:521          print("I see red!")522      case Color.GREEN:523          print("Grass is green")524      case Color.BLUE:525          print("I'm feeling the blues :(")526  ```527528Полную спецификацию см. в [**PEP 634**](https://python-all.ru/3.12/whatsnew/3.10.html). Мотивация и обоснование находятся в [**PEP 635**](https://python-all.ru/3.12/whatsnew/3.10.html), а более подробное руководство – в [**PEP 636**](https://python-all.ru/3.12/whatsnew/3.10.html).529530### Опциональные `EncodingWarning` и `encoding="locale"` параметры531532Кодировка по умолчанию для [`TextIOWrapper`](https://python-all.ru/3.12/library/io.html#io.TextIOWrapper) и [`open()`](https://python-all.ru/3.12/library/functions.html#open) зависит от платформы и локали. Поскольку UTF-8 используется на большинстве платформ Unix, опускание параметра `encoding` при открытии файлов в UTF-8 (например, JSON, YAML, TOML, Markdown) является очень распространённой ошибкой. Например:533534```python535# ОШИБКА: следует использовать режим "rb" или encoding="utf-8".536with open("data.json") as f:537    data = json.load(f)538```539540Для обнаружения такой ошибки добавлен опциональный `EncodingWarning`. Он выдаётся, когда [`sys.flags.warn_default_encoding`](https://python-all.ru/3.12/library/sys.html#sys.flags) истинно и используется кодировка по умолчанию, зависящая от локали.541542Параметр `-X warn_default_encoding` и [`PYTHONWARNDEFAULTENCODING`](https://python-all.ru/3.12/using/cmdline.html#envvar-PYTHONWARNDEFAULTENCODING) добавлены для включения предупреждения.543544См. [Кодировка текста](https://python-all.ru/3.12/library/io.html#io-text-encoding) для получения дополнительной информации.545546## Новые возможности, связанные с аннотациями типов547548Этот раздел охватывает основные изменения, затрагивающие [**PEP 484**](https://python-all.ru/3.12/whatsnew/3.10.html) подсказки типов и модуль [`typing`](https://python-all.ru/3.12/library/typing.html#module-typing).549550### PEP 604: Новый оператор объединения типов551552Был введён новый оператор объединения типов, который позволяет использовать синтаксис `X | Y`. Это даёт более чистый способ выразить «тип X или тип Y» вместо использования [`typing.Union`](https://python-all.ru/3.12/library/typing.html#typing.Union), особенно в аннотациях типов.553554В предыдущих версиях Python для аннотации типов функций, принимающих аргументы нескольких типов, использовался [`typing.Union`](https://python-all.ru/3.12/library/typing.html#typing.Union):555556```python557def square(number: Union[int, float]) -> Union[int, float]:558    return number ** 2559```560561Теперь аннотации типов можно писать более кратко:562563```python564def square(number: int | float) -> int | float:565    return number ** 2566```567568Этот новый синтаксис также принимается в качестве второго аргумента для [`isinstance()`](https://python-all.ru/3.12/library/functions.html#isinstance) и [`issubclass()`](https://python-all.ru/3.12/library/functions.html#issubclass):569570```python571>>> isinstance(1, int | str)572True573```574575См. [Union Type](https://python-all.ru/3.12/library/stdtypes.html#types-union) и [**PEP 604**](https://python-all.ru/3.12/whatsnew/3.10.html) для получения дополнительной информации.576577(Авторы: Maggie Moss и Philippe Prados в [bpo-41428](https://python-all.ru/3.12/whatsnew/3.10.html), с дополнениями от Yurii Karabas и Serhiy Storchaka в [bpo-44490](https://python-all.ru/3.12/whatsnew/3.10.html).)578579### PEP 612: Переменные спецификации параметров580581В модуль [`typing`](https://python-all.ru/3.12/library/typing.html#module-typing) добавлены два новых параметра, улучшающих информацию, предоставляемую статическим анализаторам типов для [**PEP 484**](https://python-all.ru/3.12/whatsnew/3.10.html)'s `Callable`.582583Первая – это переменная спецификации параметров. Она используется для передачи типов параметров одного вызываемого объекта другому – шаблон, часто встречающийся в функциях высшего порядка и декораторах. Примеры использования можно найти в [`typing.ParamSpec`](https://python-all.ru/3.12/library/typing.html#typing.ParamSpec). Ранее не было простого способа аннотировать зависимость типов параметров с такой точностью.584585Второй вариант – новый оператор `Concatenate`. Он используется вместе с переменными спецификации параметров для аннотации типов вызываемого объекта высшего порядка, который добавляет или удаляет параметры другого вызываемого объекта. Примеры использования можно найти в [`typing.Concatenate`](https://python-all.ru/3.12/library/typing.html#typing.Concatenate).586587См. [`typing.Callable`](https://python-all.ru/3.12/library/typing.html#typing.Callable), [`typing.ParamSpec`](https://python-all.ru/3.12/library/typing.html#typing.ParamSpec), [`typing.Concatenate`](https://python-all.ru/3.12/library/typing.html#typing.Concatenate), [`typing.ParamSpecArgs`](https://python-all.ru/3.12/library/typing.html#typing.ParamSpecArgs), [`typing.ParamSpecKwargs`](https://python-all.ru/3.12/library/typing.html#typing.ParamSpecKwargs) и [**PEP 612**](https://python-all.ru/3.12/whatsnew/3.10.html) для получения дополнительной информации.588589(Автор: Ken Jin в [bpo-41559](https://python-all.ru/3.12/whatsnew/3.10.html), с небольшими улучшениями от Jelle Zijlstra в [bpo-43783](https://python-all.ru/3.12/whatsnew/3.10.html). PEP написан Mark Mendoza.)590591### PEP 613: TypeAlias592593[**PEP 484**](https://python-all.ru/3.12/whatsnew/3.10.html) ввёл понятие псевдонимов типов, требуя лишь, чтобы они были присваиваниями верхнего уровня без аннотаций. Эта простота иногда затрудняла для анализаторов типов различие между псевдонимами типов и обычными присваиваниями, особенно когда были задействованы опережающие ссылки или недопустимые типы. Сравните:594595```python596StrCache = 'Cache[str]'  # псевдоним типа597LOG_PREFIX = 'LOG[DEBUG]'  # константа модуля598```599600Теперь в модуле [`typing`](https://python-all.ru/3.12/library/typing.html#module-typing) есть специальное значение [`TypeAlias`](https://python-all.ru/3.12/library/typing.html#typing.TypeAlias), которое позволяет объявлять псевдонимы типов более явно:601602```python603StrCache: TypeAlias = 'Cache[str]'  # псевдоним типа604LOG_PREFIX = 'LOG[DEBUG]'  # константа модуля605```606607См. [**PEP 613**](https://python-all.ru/3.12/whatsnew/3.10.html) для получения дополнительных сведений.608609(Автор: Mikhail Golubev в [bpo-41923](https://python-all.ru/3.12/whatsnew/3.10.html).)610611### PEP 647: Определяемые пользователем стражники типов612613[`TypeGuard`](https://python-all.ru/3.12/library/typing.html#typing.TypeGuard) добавлен в модуль [`typing`](https://python-all.ru/3.12/library/typing.html#module-typing) для аннотирования функций-стражников типов и улучшения информации, передаваемой статическим проверщикам типов при сужении типа. Для получения дополнительной информации см. документацию [`TypeGuard`](https://python-all.ru/3.12/library/typing.html#typing.TypeGuard) и [**PEP 647**](https://python-all.ru/3.12/whatsnew/3.10.html).614615(Авторы: Ken Jin и Guido van Rossum в [bpo-43766](https://python-all.ru/3.12/whatsnew/3.10.html). Автор PEP: Eric Traut.)616617## Прочие изменения языка618619- Тип [`int`](https://python-all.ru/3.12/library/functions.html#int) получил новый метод [`int.bit_count()`](https://python-all.ru/3.12/library/stdtypes.html#int.bit_count), который возвращает количество единиц в двоичном представлении целого числа, также известное как число единиц (population count). (Автор: Niklas Fiekas в [bpo-29882](https://python-all.ru/3.12/whatsnew/3.10.html).)620- Представления, возвращаемые [`dict.keys()`](https://python-all.ru/3.12/library/stdtypes.html#dict.keys), [`dict.values()`](https://python-all.ru/3.12/library/stdtypes.html#dict.values) и [`dict.items()`](https://python-all.ru/3.12/library/stdtypes.html#dict.items), теперь все имеют атрибут `mapping`, предоставляющий объект [`types.MappingProxyType`](https://python-all.ru/3.12/library/types.html#types.MappingProxyType), оборачивающий исходный словарь. (Автор: Dennis Sweeney в [bpo-40890](https://python-all.ru/3.12/whatsnew/3.10.html).)621- [**PEP 618**](https://python-all.ru/3.12/whatsnew/3.10.html): функция [`zip()`](https://python-all.ru/3.12/library/functions.html#zip) теперь имеет необязательный флаг `strict`, используемый для требования, чтобы все итерируемые объекты имели одинаковую длину.622- Встроенные функции и функции расширений, принимающие целочисленные аргументы, больше не принимают [`Decimal`](https://python-all.ru/3.12/library/decimal.html#decimal.Decimal), [`Fraction`](https://python-all.ru/3.12/library/fractions.html#fractions.Fraction) и другие объекты, которые могут быть преобразованы в целые числа только с потерей (например, имеющие метод [`__int__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__int__), но не имеющие метода [`__index__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__index__)). (Автор: Serhiy Storchaka в [bpo-37999](https://python-all.ru/3.12/whatsnew/3.10.html).)623- Если [`object.__ipow__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__ipow__) возвращает [`NotImplemented`](https://python-all.ru/3.12/library/constants.html#NotImplemented), оператор будет корректно возвращаться к [`object.__pow__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__pow__) и [`object.__rpow__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__rpow__), как и ожидается. (Автор: Alex Shkop в [bpo-38302](https://python-all.ru/3.12/whatsnew/3.10.html).)624- Присваивающие выражения теперь можно использовать без скобок внутри литералов множеств и включений множеств, а также в индексах последовательностей (но не в срезах).625- Функции получили новый атрибут `__builtins__`, который используется для поиска встроенных символов при выполнении функции, вместо поиска в `__globals__['__builtins__']`. Атрибут инициализируется из `__globals__["__builtins__"]`, если он существует, иначе из текущих встроенных объектов. (Автор: Mark Shannon в [bpo-42990](https://python-all.ru/3.12/whatsnew/3.10.html).)626- Две новые встроенные функции – [`aiter()`](https://python-all.ru/3.12/library/functions.html#aiter) и [`anext()`](https://python-all.ru/3.12/library/functions.html#anext) были добавлены для предоставления асинхронных аналогов [`iter()`](https://python-all.ru/3.12/library/functions.html#iter) и [`next()`](https://python-all.ru/3.12/library/functions.html#next) соответственно. (Авторы: Joshua Bronson, Daniel Pope и Justin Wang в [bpo-31861](https://python-all.ru/3.12/whatsnew/3.10.html).)627- Статические методы ([`@staticmethod`](https://python-all.ru/3.12/library/functions.html#staticmethod)) и методы классов ([`@classmethod`](https://python-all.ru/3.12/library/functions.html#classmethod)) теперь наследуют атрибуты методов (`__module__`, `__name__`, `__qualname__`, `__doc__`, `__annotations__`) и имеют новый атрибут `__wrapped__`. Более того, статические методы теперь можно вызывать как обычные функции. (Автор: Victor Stinner в [bpo-43682](https://python-all.ru/3.12/whatsnew/3.10.html).)628- Аннотации для сложных целей (всё, кроме целей `simple name`, заданных [**PEP 526**](https://python-all.ru/3.12/whatsnew/3.10.html)) больше не вызывают никаких эффектов во время выполнения при `from __future__ import annotations`. (Автор: Batuhan Taskaya в [bpo-42737](https://python-all.ru/3.12/whatsnew/3.10.html).)629- Объекты классов и модулей теперь лениво создают пустые словари аннотаций по требованию. Словари аннотаций хранятся в `__dict__` объекта для обратной совместимости. Это улучшает лучшие практики работы с `__annotations__`; для получения дополнительной информации см. [Annotations Best Practices](https://python-all.ru/3.12/howto/annotations.html#annotations-howto). (Автор: Larry Hastings в [bpo-43901](https://python-all.ru/3.12/whatsnew/3.10.html).)630- Аннотации, состоящие из `yield`, `yield from`, `await` или именованных выражений, теперь запрещены при `from __future__ import annotations` из-за их побочных эффектов. (Автор: Batuhan Taskaya в [bpo-42725](https://python-all.ru/3.12/whatsnew/3.10.html).)631- Использование несвязанных переменных, `super()` и других выражений, которые могут изменить обработку таблицы символов в качестве аннотаций, теперь не имеет эффекта при `from __future__ import annotations`. (Автор: Batuhan Taskaya в [bpo-42725](https://python-all.ru/3.12/whatsnew/3.10.html).)632- Хеши значений NaN как типа [`float`](https://python-all.ru/3.12/library/functions.html#float), так и типа [`decimal.Decimal`](https://python-all.ru/3.12/library/decimal.html#decimal.Decimal) теперь зависят от идентичности объекта. Раньше они всегда хешировались в `0`, несмотря на то что значения NaN не равны друг другу. Это приводило к потенциально квадратичному поведению во время выполнения из-за чрезмерных коллизий хешей при создании словарей и множеств, содержащих несколько NaN. (Автор: Raymond Hettinger в [bpo-43475](https://python-all.ru/3.12/whatsnew/3.10.html).)633- При удалении константы [`__debug__`](https://python-all.ru/3.12/library/constants.html#debug__) будет возбуждено [`SyntaxError`](https://python-all.ru/3.12/library/exceptions.html#SyntaxError) (вместо [`NameError`](https://python-all.ru/3.12/library/exceptions.html#NameError)). (Автор: Donghee Na в [bpo-45000](https://python-all.ru/3.12/whatsnew/3.10.html).)634- Исключения [`SyntaxError`](https://python-all.ru/3.12/library/exceptions.html#SyntaxError) теперь имеют атрибуты `end_lineno` и `end_offset`. Они будут равны `None`, если не определены. (Автор: Pablo Galindo в [bpo-43914](https://python-all.ru/3.12/whatsnew/3.10.html).)635636## Новые модули637638- Нет.639640## Улучшенные модули641642### asyncio643644Добавлен отсутствующий метод `connect_accepted_socket()`. (Автор: Alex Grönholm в [bpo-41332](https://python-all.ru/3.12/whatsnew/3.10.html).)645646### argparse647648Вводящая в заблуждение фраза «optional arguments» была заменена на «options» в справке argparse. Некоторым тестам может потребоваться адаптация, если они полагаются на точное совпадение вывода. (Автор: Raymond Hettinger в [bpo-9694](https://python-all.ru/3.12/whatsnew/3.10.html).)649650### array651652Метод [`index()`](https://python-all.ru/3.12/library/array.html#array.array.index) у [`array.array`](https://python-all.ru/3.12/library/array.html#array.array) теперь имеет необязательные параметры *start* и *stop*. (Авторы: Anders Lorentsen и Zackery Spytz в [bpo-31956](https://python-all.ru/3.12/whatsnew/3.10.html).)653654### asynchat, asyncore, smtpd655656Эти модули были отмечены как устаревшие в своей документации, начиная с Python 3.6. Теперь во все три модуля добавлено [`DeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#DeprecationWarning) во время импорта.657658### base64659660Добавлены [`base64.b32hexencode()`](https://python-all.ru/3.12/library/base64.html#base64.b32hexencode) и [`base64.b32hexdecode()`](https://python-all.ru/3.12/library/base64.html#base64.b32hexdecode) для поддержки кодирования Base32 с расширенным шестнадцатеричным алфавитом.661662### bdb663664Добавлена `clearBreakpoints()` для сброса всех установленных точек останова. (Предложено Ирит Катриэлем в [bpo-24160](https://python-all.ru/3.12/whatsnew/3.10.html).)665666### bisect667668Добавлена возможность указания функции *key* в API модуля [`bisect`](https://python-all.ru/3.12/library/bisect.html#module-bisect). (Предложено Рэймондом Хеттингером в [bpo-4356](https://python-all.ru/3.12/whatsnew/3.10.html).)669670### codecs671672Добавлена функция [`codecs.unregister()`](https://python-all.ru/3.12/library/codecs.html#codecs.unregister) для отмены регистрации функции поиска кодеков. (Предложено Хай Ши в [bpo-41842](https://python-all.ru/3.12/whatsnew/3.10.html).)673674### collections.abc675676`__args__` у [параметризованных обобщённых типов](https://python-all.ru/3.12/library/stdtypes.html#types-genericalias) для [`collections.abc.Callable`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Callable) теперь согласованы с [`typing.Callable`](https://python-all.ru/3.12/library/typing.html#typing.Callable). [`collections.abc.Callable`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Callable) обобщённый тип теперь упрощает параметры типа, аналогично tому, что делает [`typing.Callable`](https://python-all.ru/3.12/library/typing.html#typing.Callable). Это означает, что `collections.abc.Callable[[int, str], str]` будет иметь `__args__` от `(int, str, str)`; ранее это было `([int, str], str)`. Чтобы обеспечить это изменение, [`types.GenericAlias`](https://python-all.ru/3.12/library/types.html#types.GenericAlias) теперь может быть подклассом, и при индексировании типа [`collections.abc.Callable`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Callable) будет возвращаться подкласс. Обратите внимание, что может возникать [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError) для некорректных форм параметризации [`collections.abc.Callable`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Callable), которые в Python 3.9 могли проходить молча. (Предложено Кеном Джином в [bpo-42195](https://python-all.ru/3.12/whatsnew/3.10.html).)677678### contextlib679680Добавлен менеджер контекста [`contextlib.aclosing()`](https://python-all.ru/3.12/library/contextlib.html#contextlib.aclosing) для безопасного закрытия асинхронных генераторов и объектов, представляющих асинхронно освобождаемые ресурсы. (Предложено Джунги Кимом и Джоном Бельмонте в [bpo-41229](https://python-all.ru/3.12/whatsnew/3.10.html).)681682Добавлена поддержка асинхронного менеджера контекста для [`contextlib.nullcontext()`](https://python-all.ru/3.12/library/contextlib.html#contextlib.nullcontext). (Предложено Томом Грингаузом в [bpo-41543](https://python-all.ru/3.12/whatsnew/3.10.html).)683684Добавлен [`AsyncContextDecorator`](https://python-all.ru/3.12/library/contextlib.html#contextlib.AsyncContextDecorator) для поддержки использования асинхронных менеджеров контекста в качестве декораторов.685686### curses687688Расширенные функции цвета, добавленные в ncurses 6.1, будут прозрачно использоваться [`curses.color_content()`](https://python-all.ru/3.12/library/curses.html#curses.color_content), [`curses.init_color()`](https://python-all.ru/3.12/library/curses.html#curses.init_color), [`curses.init_pair()`](https://python-all.ru/3.12/library/curses.html#curses.init_pair) и [`curses.pair_content()`](https://python-all.ru/3.12/library/curses.html#curses.pair_content). Новая функция [`curses.has_extended_color_support()`](https://python-all.ru/3.12/library/curses.html#curses.has_extended_color_support) указывает, поддерживаются ли расширенные цвета базовой библиотекой ncurses. (Предложено Джеффри Кинчером и Хансом Петтером Янссоном в [bpo-36982](https://python-all.ru/3.12/whatsnew/3.10.html).)689690Константы `BUTTON5_*` теперь доступны в модуле [`curses`](https://python-all.ru/3.12/library/curses.html#module-curses), если они предоставляются базовой библиотекой curses. (Предложено Закери Спайтцем в [bpo-39273](https://python-all.ru/3.12/whatsnew/3.10.html).)691692### dataclasses693694#### \_\_slots\_\_695696Добавлен параметр `slots` в декоратор [`dataclasses.dataclass()`](https://python-all.ru/3.12/library/dataclasses.html#dataclasses.dataclass). (Предложено Юрием Карабасом в [bpo-42269](https://python-all.ru/3.12/whatsnew/3.10.html))697698#### Поля только по ключу699700dataclasses теперь поддерживает поля, которые являются только по ключу в сгенерированном методе \_\_init\_\_. Существует несколько способов указания таких полей.701702Можно указать, что все поля являются только по ключу:703704```python705from dataclasses import dataclass706707@dataclass(kw_only=True)708class Birthday:709    name: str710    birthday: datetime.date711```712713Оба параметра `name` и `birthday` являются только по ключу в сгенерированном методе \_\_init\_\_.714715Можно указать «только по ключу» для каждого поля отдельно:716717```python718from dataclasses import dataclass, field719720@dataclass721class Birthday:722    name: str723    birthday: datetime.date = field(kw_only=True)724```725726Здесь только `birthday` является только по ключу. Если установить `kw_only` для отдельных полей, следует учитывать, что существуют правила переупорядочивания полей: поля только по ключу должны следовать после полей не только по ключу. Подробнее см. в полной документации dataclasses.727728Также можно указать, что все поля, следующие за маркером KW\_ONLY, являются только по ключу. Вероятно, это будет наиболее распространённый способ использования:729730```python731from dataclasses import dataclass, KW_ONLY732733@dataclass734class Point:735    x: float736    y: float737    _: KW_ONLY738    z: float = 0.0739    t: float = 0.0740```741742Здесь `z` и `t` являются параметрами только по ключу, а `x` и `y` – нет. (Предложено Эриком В. Смитом в [bpo-43532](https://python-all.ru/3.12/whatsnew/3.10.html).)743744### distutils745746Весь пакет `distutils` является устаревшим и будет удалён в Python 3.12. Его функциональность для указания сборки пакетов уже полностью заменена сторонними пакетами `setuptools` и `packaging`, а большинство других часто используемых API доступны в других местах стандартной библиотеки (например, [`platform`](https://python-all.ru/3.12/library/platform.html#module-platform), [`shutil`](https://python-all.ru/3.12/library/shutil.html#module-shutil), [`subprocess`](https://python-all.ru/3.12/library/subprocess.html#module-subprocess) или [`sysconfig`](https://python-all.ru/3.12/library/sysconfig.html#module-sysconfig)). Планов по переносу какой-либо другой функциональности из `distutils` нет, и приложения, использующие другие функции, должны рассмотреть создание частных копий кода. Обратитесь к [**PEP 632**](https://python-all.ru/3.12/whatsnew/3.10.html) для обсуждения.747748Команда `bdist_wininst`, устаревшая в Python 3.8, была удалена. Теперь для распространения двоичных пакетов в Windows рекомендуется использовать команду `bdist_wheel`. (Предложено Виктором Стиннером в [bpo-42802](https://python-all.ru/3.12/whatsnew/3.10.html).)749750### doctest751752Если модуль не определяет `__loader__`, используется `__spec__.loader`. (Автор: Brett Cannon в [bpo-42133](https://python-all.ru/3.12/whatsnew/3.10.html).)753754### encodings755756`encodings.normalize_encoding()` теперь игнорирует не-ASCII символы. (Добавлено Хай Ши в [bpo-39337](https://python-all.ru/3.12/whatsnew/3.10.html).)757758### enum759760[`Enum`](https://python-all.ru/3.12/library/enum.html#enum.Enum) [`__repr__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__repr__) теперь возвращает `enum_name.member_name`, а [`__str__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__str__) теперь возвращает `member_name`. Перечисления стандартной библиотеки, доступные как константы модуля, имеют [`repr()`](https://python-all.ru/3.12/library/functions.html#repr), равный `module_name.member_name`. (Добавлено Итаном Фурманом в [bpo-40066](https://python-all.ru/3.12/whatsnew/3.10.html).)761762Добавлен [`enum.StrEnum`](https://python-all.ru/3.12/library/enum.html#enum.StrEnum) для перечислений, все члены которых являются строками. (Добавлено Итаном Фурманом в [bpo-41816](https://python-all.ru/3.12/whatsnew/3.10.html).)763764### fileinput765766Добавлены параметры *encoding* и *errors* в [`fileinput.input()`](https://python-all.ru/3.12/library/fileinput.html#fileinput.input) и [`fileinput.FileInput`](https://python-all.ru/3.12/library/fileinput.html#fileinput.FileInput). (Добавлено Инадой Наоки в [bpo-43712](https://python-all.ru/3.12/whatsnew/3.10.html).)767768[`fileinput.hook_compressed()`](https://python-all.ru/3.12/library/fileinput.html#fileinput.hook_compressed) теперь возвращает объект [`TextIOWrapper`](https://python-all.ru/3.12/library/io.html#io.TextIOWrapper), когда *mode* равен «r», а файл сжат, как и несжатые файлы. (Добавлено Инадой Наоки в [bpo-5758](https://python-all.ru/3.12/whatsnew/3.10.html).)769770### faulthandler771772Модуль [`faulthandler`](https://python-all.ru/3.12/library/faulthandler.html#module-faulthandler) теперь обнаруживает, произошла ли фатальная ошибка во время сборки мусора. (Добавлено Виктором Стиннером в [bpo-44466](https://python-all.ru/3.12/whatsnew/3.10.html).)773774### gc775776Добавлены аудит-хуки для [`gc.get_objects()`](https://python-all.ru/3.12/library/gc.html#gc.get_objects), [`gc.get_referrers()`](https://python-all.ru/3.12/library/gc.html#gc.get_referrers) и [`gc.get_referents()`](https://python-all.ru/3.12/library/gc.html#gc.get_referents). (Добавлено Пабло Галиндо в [bpo-43439](https://python-all.ru/3.12/whatsnew/3.10.html).)777778### glob779780Добавлены параметры *root\_dir* и *dir\_fd* в [`glob()`](https://python-all.ru/3.12/library/glob.html#glob.glob) и [`iglob()`](https://python-all.ru/3.12/library/glob.html#glob.iglob), которые позволяют указать корневой каталог для поиска. (Добавлено Сергеем Сторчакой в [bpo-38144](https://python-all.ru/3.12/whatsnew/3.10.html).)781782### hashlib783784Модуль hashlib требует OpenSSL 1.1.1 или новее. (Добавлено Кристианом Хаймсом в [**PEP 644**](https://python-all.ru/3.12/whatsnew/3.10.html) и [bpo-43669](https://python-all.ru/3.12/whatsnew/3.10.html).)785786Модуль hashlib имеет предварительную поддержку OpenSSL 3.0.0. (Добавлено Кристианом Хаймсом в [bpo-38820](https://python-all.ru/3.12/whatsnew/3.10.html) и других тикетах.)787788Чистая реализация на Python [`pbkdf2_hmac()`](https://python-all.ru/3.12/library/hashlib.html#hashlib.pbkdf2_hmac) объявлена устаревшей. В будущем PBKDF2-HMAC будет доступен только при сборке Python с поддержкой OpenSSL. (Добавлено Кристианом Хаймсом в [bpo-43880](https://python-all.ru/3.12/whatsnew/3.10.html).)789790### hmac791792Модуль hmac теперь использует реализацию HMAC от OpenSSL внутри. (Добавлено Кристианом Хаймсом в [bpo-40645](https://python-all.ru/3.12/whatsnew/3.10.html).)793794### IDLE и idlelib795796IDLE теперь вызывает [`sys.excepthook()`](https://python-all.ru/3.12/library/sys.html#sys.excepthook) (при запуске без «-n»). Ранее пользовательские хуки игнорировались. (Добавлено Кеном Хилтоном в [bpo-43008](https://python-all.ru/3.12/whatsnew/3.10.html).)797798Переработан диалог настроек. Вкладка General разделена на вкладки Windows и Shell/Ed. Источники справки, расширяющие меню Help, перемещены на вкладку Extensions. Освобождено место для новых опций и сокращён диалог. Последнее улучшает отображение диалога на маленьких экранах. (Добавлено Терри Джан Риди в [bpo-40468](https://python-all.ru/3.12/whatsnew/3.10.html).) Настройка отступа (indent space) перенесена с вкладки Font на новую вкладку Windows. (Добавлено Марком Роземаном и Терри Джан Риди в [bpo-33962](https://python-all.ru/3.12/whatsnew/3.10.html).)799800Эти изменения были перенесены в поддерживаемый выпуск 3.9.801802Добавлена боковая панель Shell. Основное приглашение («\>\>\>») перемещено на боковую панель. Вторичные приглашения («…») добавлены на боковую панель. Щелчок левой кнопкой мыши и перетаскивание (опционально) выделяют одну или несколько строк текста, как в боковой панели с номерами строк редактора. Щелчок правой кнопкой после выделения строк текста отображает контекстное меню с пунктом «copy with prompts». Это объединяет приглашения с боковой панели со строками выделенного текста. Этот пункт также появляется в контекстном меню текста. (Добавлено Талем Эйнатом в [bpo-37903](https://python-all.ru/3.12/whatsnew/3.10.html).)803804Используются пробелы вместо табуляции для отступа интерактивного кода. Это делает ввод интерактивного кода «выглядящим правильно». Возможность этого была основной мотивацией для добавления боковой панели Shell. (Добавлено Терри Джан Риди в [bpo-37892](https://python-all.ru/3.12/whatsnew/3.10.html).)805806Подсвечиваются новые [мягкие ключевые слова](https://python-all.ru/3.12/reference/lexical_analysis.html#soft-keywords) [`match`](https://python-all.ru/3.12/reference/compound_stmts.html#match), [`case`](https://python-all.ru/3.12/reference/compound_stmts.html#match) и [`_`](https://python-all.ru/3.12/reference/compound_stmts.html#wildcard-patterns) в операторах сопоставления с образцом. Однако эта подсветка не идеальна и может быть некорректной в некоторых редких случаях, включая некоторые `_` в образцах `case`. (Добавлено Талем Эйнатом в [bpo-44010](https://python-all.ru/3.12/whatsnew/3.10.html).)807808Новое в поддерживаемых выпусках 3.10.809810Применять подсветку синтаксиса для файлов `.pyi`. (Авторы: Alex Waygood и Terry Jan Reedy, [bpo-45447](https://python-all.ru/3.12/whatsnew/3.10.html).)811812Включение приглашений при сохранении содержимого Shell с вводом и выводом. (Автор: Terry Jan Reedy, [gh-95191](https://python-all.ru/3.12/whatsnew/3.10.html).)813814### importlib.metadata815816Функциональная совместимость с `importlib_metadata` 4.6 ([история](https://python-all.ru/3.12/whatsnew/3.10.html)).817818[importlib.metadata entry points](https://python-all.ru/3.12/library/importlib.metadata.html#entry-points) теперь предоставляют более удобный интерфейс для выбора точек входа по группе и имени через новый класс [importlib.metadata.EntryPoints](https://python-all.ru/3.12/library/importlib.metadata.html#entry-points). См. примечание о совместимости в документации для получения дополнительной информации об устаревании и использовании.819820Добавлена [importlib.metadata.packages\_distributions()](https://python-all.ru/3.12/library/importlib.metadata.html#package-distributions) для разрешения модулей и пакетов верхнего уровня Python в их [importlib.metadata.Distribution](https://python-all.ru/3.12/library/importlib.metadata.html#distributions).821822### inspect823824Если модуль не определяет `__loader__`, используется `__spec__.loader`. (Автор: Brett Cannon в [bpo-42133](https://python-all.ru/3.12/whatsnew/3.10.html).)825826Добавлен [`inspect.get_annotations()`](https://python-all.ru/3.12/library/inspect.html#inspect.get_annotations), который безопасно вычисляет аннотации, определённые для объекта. Он обходит особенности доступа к аннотациям для различных типов объектов и делает очень мало предположений об объекте, который исследует. [`inspect.get_annotations()`](https://python-all.ru/3.12/library/inspect.html#inspect.get_annotations) также может корректно преобразовывать строковые аннотации обратно в объекты. [`inspect.get_annotations()`](https://python-all.ru/3.12/library/inspect.html#inspect.get_annotations) теперь считается лучшей практикой для доступа к словарю аннотаций, определённому для любого объекта Python; дополнительную информацию о лучших практиках работы с аннотациями см. в [Лучшие практики для аннотаций](https://python-all.ru/3.12/howto/annotations.html#annotations-howto). Кроме того, [`inspect.signature()`](https://python-all.ru/3.12/library/inspect.html#inspect.signature), [`inspect.Signature.from_callable()`](https://python-all.ru/3.12/library/inspect.html#inspect.Signature.from_callable) и `inspect.Signature.from_function()` теперь вызывают [`inspect.get_annotations()`](https://python-all.ru/3.12/library/inspect.html#inspect.get_annotations) для получения аннотаций. Это означает, что [`inspect.signature()`](https://python-all.ru/3.12/library/inspect.html#inspect.signature) и [`inspect.Signature.from_callable()`](https://python-all.ru/3.12/library/inspect.html#inspect.Signature.from_callable) также теперь могут преобразовывать строковые аннотации обратно в объекты. (Автор: Larry Hastings в [bpo-43817](https://python-all.ru/3.12/whatsnew/3.10.html).)827828### itertools829830Добавлен [`itertools.pairwise()`](https://python-all.ru/3.12/library/itertools.html#itertools.pairwise). (Автор: Raymond Hettinger в [bpo-38200](https://python-all.ru/3.12/whatsnew/3.10.html).)831832### linecache833834Если модуль не определяет `__loader__`, используется `__spec__.loader`. (Автор: Brett Cannon в [bpo-42133](https://python-all.ru/3.12/whatsnew/3.10.html).)835836### os837838Добавлена поддержка [`os.cpu_count()`](https://python-all.ru/3.12/library/os.html#os.cpu_count) для VxWorks RTOS. (Автор: Peixing Xin в [bpo-41440](https://python-all.ru/3.12/whatsnew/3.10.html).)839840Добавлена новая функция [`os.eventfd()`](https://python-all.ru/3.12/library/os.html#os.eventfd) и вспомогательные функции для обёртки системного вызова `eventfd2` в Linux. (Автор: Christian Heimes в [bpo-41001](https://python-all.ru/3.12/whatsnew/3.10.html).)841842Добавлен [`os.splice()`](https://python-all.ru/3.12/library/os.html#os.splice), который позволяет перемещать данные между двумя файловыми дескрипторами без копирования между адресным пространством ядра и пользовательским адресным пространством, причём один из файловых дескрипторов должен ссылаться на канал. (Автор: Pablo Galindo в [bpo-41625](https://python-all.ru/3.12/whatsnew/3.10.html).)843844Добавлены [`O_EVTONLY`](https://python-all.ru/3.12/library/os.html#os.O_EVTONLY), [`O_FSYNC`](https://python-all.ru/3.12/library/os.html#os.O_FSYNC), [`O_SYMLINK`](https://python-all.ru/3.12/library/os.html#os.O_SYMLINK) и [`O_NOFOLLOW_ANY`](https://python-all.ru/3.12/library/os.html#os.O_NOFOLLOW_ANY) для macOS. (Автор: Donghee Na в [bpo-43106](https://python-all.ru/3.12/whatsnew/3.10.html).)845846### os.path847848[`os.path.realpath()`](https://python-all.ru/3.12/library/os.path.html#os.path.realpath) теперь принимает именованный аргумент *strict*. Если установлено значение `True`, [`OSError`](https://python-all.ru/3.12/library/exceptions.html#OSError) возбуждается, если путь не существует или обнаружен цикл символической ссылки. (Автор: Barney Gale в [bpo-43757](https://python-all.ru/3.12/whatsnew/3.10.html).)849850### pathlib851852Добавлена поддержка срезов для [`PurePath.parents`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath.parents). (Автор: Joshua Cannon в [bpo-35498](https://python-all.ru/3.12/whatsnew/3.10.html).)853854Добавлена поддержка отрицательной индексации для [`PurePath.parents`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath.parents). (Автор: Yaroslav Pankovych в [bpo-21041](https://python-all.ru/3.12/whatsnew/3.10.html).)855856Добавлен метод [`Path.hardlink_to`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.hardlink_to), который заменяет `link_to()`. Новый метод имеет тот же порядок аргументов, что и [`symlink_to()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.symlink_to). (Автор: Barney Gale в [bpo-39950](https://python-all.ru/3.12/whatsnew/3.10.html).)857858[`pathlib.Path.stat()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.stat) и [`chmod()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.chmod) теперь принимают именованный аргумент *follow\_symlinks* для согласованности с соответствующими функциями в модуле [`os`](https://python-all.ru/3.12/library/os.html#module-os). (Автор: Barney Gale в [bpo-39906](https://python-all.ru/3.12/whatsnew/3.10.html).)859860### platform861862Добавлен [`platform.freedesktop_os_release()`](https://python-all.ru/3.12/library/platform.html#platform.freedesktop_os_release) для получения идентификации операционной системы из стандартного файла [freedesktop.org os-release](https://python-all.ru/3.12/whatsnew/3.10.html). (Автор: Christian Heimes в [bpo-28468](https://python-all.ru/3.12/whatsnew/3.10.html).)863864### pprint865866[`pprint.pprint()`](https://python-all.ru/3.12/library/pprint.html#pprint.pprint) теперь принимает новый именованный аргумент `underscore_numbers`. (Автор: sblondon в [bpo-42914](https://python-all.ru/3.12/whatsnew/3.10.html).)867868[`pprint`](https://python-all.ru/3.12/library/pprint.html#module-pprint) теперь может красиво печатать экземпляры [`dataclasses.dataclass`](https://python-all.ru/3.12/library/dataclasses.html#dataclasses.dataclass). (Автор: Lewis Gaul в [bpo-43080](https://python-all.ru/3.12/whatsnew/3.10.html).)869870### py\_compile871872Добавлена опция `--quiet` в интерфейс командной строки [`py_compile`](https://python-all.ru/3.12/library/py_compile.html#module-py_compile). (Автор: Gregory Schevchenko в [bpo-38731](https://python-all.ru/3.12/whatsnew/3.10.html).)873874### pyclbr875876Добавлен атрибут `end_lineno` в объекты `Function` и `Class` в дереве, возвращаемом [`pyclbr.readmodule()`](https://python-all.ru/3.12/library/pyclbr.html#pyclbr.readmodule) и [`pyclbr.readmodule_ex()`](https://python-all.ru/3.12/library/pyclbr.html#pyclbr.readmodule_ex). Он соответствует существующему (начальному) `lineno`. (Автор: Aviral Srivastava в [bpo-38307](https://python-all.ru/3.12/whatsnew/3.10.html).)877878### shelve879880Модуль [`shelve`](https://python-all.ru/3.12/library/shelve.html#module-shelve) теперь по умолчанию использует [`pickle.DEFAULT_PROTOCOL`](https://python-all.ru/3.12/library/pickle.html#pickle.DEFAULT_PROTOCOL) вместо протокола [`pickle`](https://python-all.ru/3.12/library/pickle.html#module-pickle) `3` при создании shelves. (Автор: Zackery Spytz в [bpo-34204](https://python-all.ru/3.12/whatsnew/3.10.html).)881882### statistics883884Добавлены функции [`covariance()`](https://python-all.ru/3.12/library/statistics.html#statistics.covariance), [`correlation()`](https://python-all.ru/3.12/library/statistics.html#statistics.correlation) Пирсона и простая [`linear_regression()`](https://python-all.ru/3.12/library/statistics.html#statistics.linear_regression). (Автор: Tymoteusz Wołodźko в [bpo-38490](https://python-all.ru/3.12/whatsnew/3.10.html).)885886### site887888Если модуль не определяет `__loader__`, используется `__spec__.loader`. (Автор: Brett Cannon в [bpo-42133](https://python-all.ru/3.12/whatsnew/3.10.html).)889890### socket891892Исключение [`socket.timeout`](https://python-all.ru/3.12/library/socket.html#socket.timeout) теперь является псевдонимом [`TimeoutError`](https://python-all.ru/3.12/library/exceptions.html#TimeoutError). (Автор: Christian Heimes в [bpo-42413](https://python-all.ru/3.12/whatsnew/3.10.html).)893894Добавлена возможность создавать MPTCP-сокеты с `IPPROTO_MPTCP` (Автор: Rui Cunha в [bpo-43571](https://python-all.ru/3.12/whatsnew/3.10.html).)895896Добавлена опция `IP_RECVTOS` для получения поля Type of Service (ToS) или DSCP/ECN (Автор: Georg Sauthoff в [bpo-44077](https://python-all.ru/3.12/whatsnew/3.10.html).)897898### ssl899900Модуль ssl требует OpenSSL 1.1.1 или новее. (Автор: Christian Heimes в [**PEP 644**](https://python-all.ru/3.12/whatsnew/3.10.html) и [bpo-43669](https://python-all.ru/3.12/whatsnew/3.10.html).)901902Модуль ssl получил предварительную поддержку OpenSSL 3.0.0 и новую опцию [`OP_IGNORE_UNEXPECTED_EOF`](https://python-all.ru/3.12/library/ssl.html#ssl.OP_IGNORE_UNEXPECTED_EOF). (Автор: Christian Heimes в [bpo-38820](https://python-all.ru/3.12/whatsnew/3.10.html), [bpo-43794](https://python-all.ru/3.12/whatsnew/3.10.html), [bpo-43788](https://python-all.ru/3.12/whatsnew/3.10.html), [bpo-43791](https://python-all.ru/3.12/whatsnew/3.10.html), [bpo-43799](https://python-all.ru/3.12/whatsnew/3.10.html), [bpo-43920](https://python-all.ru/3.12/whatsnew/3.10.html), [bpo-43789](https://python-all.ru/3.12/whatsnew/3.10.html) и [bpo-43811](https://python-all.ru/3.12/whatsnew/3.10.html).)903904Устаревшие функции и использование устаревших констант теперь приводят к [`DeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#DeprecationWarning). У [`ssl.SSLContext.options`](https://python-all.ru/3.12/library/ssl.html#ssl.SSLContext.options) по умолчанию установлены [`OP_NO_SSLv2`](https://python-all.ru/3.12/library/ssl.html#ssl.OP_NO_SSLv2) и [`OP_NO_SSLv3`](https://python-all.ru/3.12/library/ssl.html#ssl.OP_NO_SSLv3), поэтому он не может предупредить о повторной установке флага. В [разделе об устаревших возможностях](https://python-all.ru/3.12/whatsnew/3.10.html#whatsnew310-deprecated) приведён список устаревших функций. (Автор: Christian Heimes в [bpo-43880](https://python-all.ru/3.12/whatsnew/3.10.html).)905906Модуль ssl теперь использует более безопасные настройки по умолчанию. Шифры без прямой секретности (forward secrecy) или с MAC SHA-1 отключены по умолчанию. Уровень безопасности 2 запрещает слабые ключи RSA, DH и ECC с надёжностью менее 112 бит. [`SSLContext`](https://python-all.ru/3.12/library/ssl.html#ssl.SSLContext) по умолчанию использует минимальную версию протокола TLS 1.2. Настройки основаны на исследовании Hynek Schlawack. (Автор: Christian Heimes в [bpo-43998](https://python-all.ru/3.12/whatsnew/3.10.html).)907908Устаревшие протоколы SSL 3.0, TLS 1.0 и TLS 1.1 больше официально не поддерживаются. Python активно их не блокирует. Однако параметры сборки OpenSSL, настройки дистрибутивов, патчи вендоров и наборы шифров могут препятствовать успешному рукопожатию.909910Добавлен параметр *timeout* в функцию [`ssl.get_server_certificate()`](https://python-all.ru/3.12/library/ssl.html#ssl.get_server_certificate). (Автор: Zackery Spytz в [bpo-31870](https://python-all.ru/3.12/whatsnew/3.10.html).)911912Модуль ssl использует heap-типы и многофазную инициализацию. (Автор: Christian Heimes в [bpo-42333](https://python-all.ru/3.12/whatsnew/3.10.html).)913914Добавлен новый флаг проверки [`VERIFY_X509_PARTIAL_CHAIN`](https://python-all.ru/3.12/library/ssl.html#ssl.VERIFY_X509_PARTIAL_CHAIN). (Автор: l0x в [bpo-40849](https://python-all.ru/3.12/whatsnew/3.10.html).)915916### sqlite3917918Добавлены события аудита для `connect/handle()`, [`enable_load_extension()`](https://python-all.ru/3.12/library/sqlite3.html#sqlite3.Connection.enable_load_extension) и [`load_extension()`](https://python-all.ru/3.12/library/sqlite3.html#sqlite3.Connection.load_extension). (Автор: Erlend E. Aasland в [bpo-43762](https://python-all.ru/3.12/whatsnew/3.10.html).)919920### sys921922Добавлен атрибут [`sys.orig_argv`](https://python-all.ru/3.12/library/sys.html#sys.orig_argv): список исходных аргументов командной строки, переданных исполняемому файлу Python. (Автор: Victor Stinner в [bpo-23427](https://python-all.ru/3.12/whatsnew/3.10.html).)923924Добавлен [`sys.stdlib_module_names`](https://python-all.ru/3.12/library/sys.html#sys.stdlib_module_names), содержащий список имён модулей стандартной библиотеки. (Автор: Victor Stinner в [bpo-42955](https://python-all.ru/3.12/whatsnew/3.10.html).)925926### \_thread927928[`_thread.interrupt_main()`](https://python-all.ru/3.12/library/_thread.html#thread.interrupt_main) теперь принимает необязательный номер сигнала для имитации (по умолчанию по-прежнему [`signal.SIGINT`](https://python-all.ru/3.12/library/signal.html#signal.SIGINT)). (Автор: Antoine Pitrou в [bpo-43356](https://python-all.ru/3.12/whatsnew/3.10.html).)929930### threading931932Добавлены [`threading.gettrace()`](https://python-all.ru/3.12/library/threading.html#threading.gettrace) и [`threading.getprofile()`](https://python-all.ru/3.12/library/threading.html#threading.getprofile) для получения функций, установленных [`threading.settrace()`](https://python-all.ru/3.12/library/threading.html#threading.settrace) и [`threading.setprofile()`](https://python-all.ru/3.12/library/threading.html#threading.setprofile) соответственно. (Автор: Mario Corchero в [bpo-42251](https://python-all.ru/3.12/whatsnew/3.10.html).)933934Добавлен [`threading.__excepthook__`](https://python-all.ru/3.12/library/threading.html#threading.__excepthook__) для получения исходного значения [`threading.excepthook()`](https://python-all.ru/3.12/library/threading.html#threading.excepthook), если оно установлено в сломанное или другое значение. (Автор: Mario Corchero в [bpo-42308](https://python-all.ru/3.12/whatsnew/3.10.html).)935936### traceback937938Функции [`format_exception()`](https://python-all.ru/3.12/library/traceback.html#traceback.format_exception), [`format_exception_only()`](https://python-all.ru/3.12/library/traceback.html#traceback.format_exception_only) и [`print_exception()`](https://python-all.ru/3.12/library/traceback.html#traceback.print_exception) теперь могут принимать объект исключения в качестве позиционного аргумента (только позиционный). (Авторы: Zackery Spytz и Matthias Bussonnier в [bpo-26389](https://python-all.ru/3.12/whatsnew/3.10.html).)939940### types941942Повторно введены классы [`types.EllipsisType`](https://python-all.ru/3.12/library/types.html#types.EllipsisType), [`types.NoneType`](https://python-all.ru/3.12/library/types.html#types.NoneType) и [`types.NotImplementedType`](https://python-all.ru/3.12/library/types.html#types.NotImplementedType), предоставляющие новый набор типов, легко интерпретируемых средствами проверки типов. (Автор: Bas van Beek в [bpo-41810](https://python-all.ru/3.12/whatsnew/3.10.html).)943944### typing945946Основные изменения см. в [новых возможностях, связанных с аннотациями типов](https://python-all.ru/3.12/whatsnew/3.10.html#new-feat-related-type-hints).947948Поведение [`typing.Literal`](https://python-all.ru/3.12/library/typing.html#typing.Literal) было изменено в соответствии с [**PEP 586**](https://python-all.ru/3.12/whatsnew/3.10.html) и для соответствия поведению статических анализаторов типов, описанному в PEP.9499501. `Literal` теперь удаляет дубликаты параметров.9512. Проверки равенства между объектами `Literal` теперь не зависят от порядка.9523. Сравнения `Literal` теперь учитывают типы. Например, `Literal[0] == Literal[False]` ранее давало `True`. Теперь это `False`. Для поддержки этого изменения внутренний кеш типов теперь поддерживает различение типов.9534. Объекты `Literal` теперь будут вызывать исключение [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError) при проверке равенства, если какой-либо из их параметров не является [хешируемым](https://python-all.ru/3.12/glossary.html#term-hashable). Обратите внимание, что объявление `Literal` с нехешируемыми параметрами не вызовет ошибку:954955   ```python956   >>> from typing import Literal957   >>> Literal[{0}]958   >>> Literal[{0}] == Literal[{False}]959   Traceback (most recent call last):960     File "<stdin>", line 1, in <module>961   TypeError: unhashable type: 'set'962   ```963964(Предложено Юрием Карабасом в [bpo-42345](https://python-all.ru/3.12/whatsnew/3.10.html).)965966Добавлена новая функция [`typing.is_typeddict()`](https://python-all.ru/3.12/library/typing.html#typing.is_typeddict) для проверки, является ли аннотация типом [`typing.TypedDict`](https://python-all.ru/3.12/library/typing.html#typing.TypedDict). (Предложено Патриком Ридером в [bpo-41792](https://python-all.ru/3.12/whatsnew/3.10.html).)967968Подклассы `typing.Protocol`, которые объявляют только переменные данных, теперь будут вызывать `TypeError` при проверке с помощью `isinstance`, если они не декорированы [`runtime_checkable()`](https://python-all.ru/3.12/library/typing.html#typing.runtime_checkable). Ранее такие проверки проходили молча. Пользователям следует декорировать свои подклассы декоратором `runtime_checkable()`,\\если они хотят использовать протоколы времени выполнения. (Предложено Юрием Карабасом в [bpo-38908](https://python-all.ru/3.12/whatsnew/3.10.html).)969970Импорт из подмодулей `typing.io` и `typing.re` теперь будет вызывать [`DeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#DeprecationWarning). Эти подмодули устарели начиная с Python 3.8 и будут удалены в будущей версии Python. Все, что принадлежит этим подмодулям, следует импортировать напрямую из [`typing`](https://python-all.ru/3.12/library/typing.html#module-typing). (Предложено Sebastian Rittau в [bpo-38291](https://python-all.ru/3.12/whatsnew/3.10.html).)971972### unittest973974Добавлен новый метод [`assertNoLogs()`](https://python-all.ru/3.12/library/unittest.html#unittest.TestCase.assertNoLogs) в дополнение к существующему [`assertLogs()`](https://python-all.ru/3.12/library/unittest.html#unittest.TestCase.assertLogs). (Предложено Kit Yan Choi в [bpo-39385](https://python-all.ru/3.12/whatsnew/3.10.html).)975976### urllib.parse977978В версиях Python ниже 3.10 допускалось использование как `;`, так и `&` в качестве разделителей параметров запроса в [`urllib.parse.parse_qs()`](https://python-all.ru/3.12/library/urllib.parse.html#urllib.parse.parse_qs) и [`urllib.parse.parse_qsl()`](https://python-all.ru/3.12/library/urllib.parse.html#urllib.parse.parse_qsl). Из соображений безопасности и для соответствия новым рекомендациям W3C теперь разрешен только один разделитель, по умолчанию `&`. Это изменение также затрагивает [`cgi.parse()`](https://python-all.ru/3.12/library/cgi.html#cgi.parse) и [`cgi.parse_multipart()`](https://python-all.ru/3.12/library/cgi.html#cgi.parse_multipart), так как они внутренне используют затронутые функции. Подробнее см. в их документации. (Предложено Adam Goldschmidt, Senthil Kumaran и Ken Jin в [bpo-42967](https://python-all.ru/3.12/whatsnew/3.10.html).)979980Наличие символов новой строки или табуляции в частях URL допускает некоторые формы атак. Следуя спецификации WHATWG, обновляющей [**RFC 3986**](https://python-all.ru/3.12/whatsnew/3.10.html), символы ASCII новой строки `\n`, `\r` и табуляции `\t` удаляются из URL анализатором в [`urllib.parse`](https://python-all.ru/3.12/library/urllib.parse.html#module-urllib.parse), предотвращая такие атаки. Удаляемые символы контролируются новой переменной уровня модуля `urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE`. (См. [gh-88048](https://python-all.ru/3.12/whatsnew/3.10.html))981982### xml983984Добавлен класс [`LexicalHandler`](https://python-all.ru/3.12/library/xml.sax.handler.html#xml.sax.handler.LexicalHandler) в модуль [`xml.sax.handler`](https://python-all.ru/3.12/library/xml.sax.handler.html#module-xml.sax.handler). (Предложено Jonathan Gossage и Zackery Spytz в [bpo-35018](https://python-all.ru/3.12/whatsnew/3.10.html).)985986### zipimport987988Добавлены методы, связанные с [**PEP 451**](https://python-all.ru/3.12/whatsnew/3.10.html): [`find_spec()`](https://python-all.ru/3.12/library/zipimport.html#zipimport.zipimporter.find_spec), [`zipimport.zipimporter.create_module()`](https://python-all.ru/3.12/library/zipimport.html#zipimport.zipimporter.create_module) и [`zipimport.zipimporter.exec_module()`](https://python-all.ru/3.12/library/zipimport.html#zipimport.zipimporter.exec_module). (Предложено Brett Cannon в [bpo-42131](https://python-all.ru/3.12/whatsnew/3.10.html).)989990Добавлен метод [`invalidate_caches()`](https://python-all.ru/3.12/library/zipimport.html#zipimport.zipimporter.invalidate_caches). (Предложено Desmond Cheong в [bpo-14678](https://python-all.ru/3.12/whatsnew/3.10.html).)991992## Оптимизации993994- Конструкторы [`str()`](https://python-all.ru/3.12/library/stdtypes.html#str), [`bytes()`](https://python-all.ru/3.12/library/stdtypes.html#bytes) и [`bytearray()`](https://python-all.ru/3.12/library/stdtypes.html#bytearray) теперь работают быстрее (примерно на 30–40% для маленьких объектов). (Предложено Serhiy Storchaka в [bpo-41334](https://python-all.ru/3.12/whatsnew/3.10.html).)995- Модуль [`runpy`](https://python-all.ru/3.12/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.12/whatsnew/3.10.html) и [bpo-41718](https://python-all.ru/3.12/whatsnew/3.10.html).)996- Инструкция `LOAD_ATTR` теперь использует новый механизм «per opcode cache». Она работает примерно на 36% быстрее для обычных атрибутов и на 44% быстрее для слотов. (Предложено Pablo Galindo и Yury Selivanov в [bpo-42093](https://python-all.ru/3.12/whatsnew/3.10.html) и Guido van Rossum в [bpo-42927](https://python-all.ru/3.12/whatsnew/3.10.html), на основе идей, первоначально реализованных в PyPy и MicroPython.)997- При сборке Python с [`--enable-optimizations`](https://python-all.ru/3.12/using/configure.html#cmdoption-enable-optimizations) теперь `-fno-semantic-interposition` добавляется как в команду компиляции, так и в команду компоновки. Это ускоряет сборку интерпретатора Python, созданного с помощью [`--enable-shared`](https://python-all.ru/3.12/using/configure.html#cmdoption-enable-shared) с `gcc`, до 30%. См. [эту статью](https://python-all.ru/3.12/whatsnew/3.10.html) для подробностей. (Предложено Victor Stinner и Pablo Galindo в [bpo-38980](https://python-all.ru/3.12/whatsnew/3.10.html).)998- Используется новый код управления выходным буфером для модулей [`bz2`](https://python-all.ru/3.12/library/bz2.html#module-bz2) / [`lzma`](https://python-all.ru/3.12/library/lzma.html#module-lzma) / [`zlib`](https://python-all.ru/3.12/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.12/whatsnew/3.10.html))999- При использовании строковых аннотаций словари аннотаций для функций больше не создаются при создании функции. Вместо этого они хранятся в виде кортежа строк, и объект функции лениво преобразует его в словарь аннотаций по требованию. Эта оптимизация сокращает время CPU, необходимое для определения аннотированной функции, вдвое. (Предложено Yurii Karabas и Inada Naoki в [bpo-42202](https://python-all.ru/3.12/whatsnew/3.10.html).)1000- Функции поиска подстроки, такие как `str1 in str2` и `str2.find(str1)`, теперь иногда используют алгоритм поиска строк «Two-Way» Крочемора и Перрина, чтобы избежать квадратичного поведения на длинных строках. (Предложено Dennis Sweeney в [bpo-41972](https://python-all.ru/3.12/whatsnew/3.10.html))1001- Добавлены микрооптимизации в `_PyType_Lookup()` для улучшения производительности поиска в кеше атрибутов типа в типичном случае попадания в кеш. Это делает интерпретатор в среднем в 1,04 раза быстрее. (Предложено Dino Viehland в [bpo-43452](https://python-all.ru/3.12/whatsnew/3.10.html).)1002- Следующие встроенные функции теперь поддерживают более быстрый соглашение вызова [**PEP 590**](https://python-all.ru/3.12/whatsnew/3.10.html) vectorcall: [`map()`](https://python-all.ru/3.12/library/functions.html#map), [`filter()`](https://python-all.ru/3.12/library/functions.html#filter), [`reversed()`](https://python-all.ru/3.12/library/functions.html#reversed), [`bool()`](https://python-all.ru/3.12/library/functions.html#bool) и [`float()`](https://python-all.ru/3.12/library/functions.html#float). (Предложено Donghee Na и Jeroen Demeyer в [bpo-43575](https://python-all.ru/3.12/whatsnew/3.10.html), [bpo-43287](https://python-all.ru/3.12/whatsnew/3.10.html), [bpo-41922](https://python-all.ru/3.12/whatsnew/3.10.html), [bpo-41873](https://python-all.ru/3.12/whatsnew/3.10.html) и [bpo-41870](https://python-all.ru/3.12/whatsnew/3.10.html).)1003- Производительность [`BZ2File`](https://python-all.ru/3.12/library/bz2.html#bz2.BZ2File) улучшена за счет удаления внутренних `RLock`. Это делает `BZ2File` потоконебезопасным при наличии нескольких одновременных читателей или писателей, как и его эквивалентные классы в [`gzip`](https://python-all.ru/3.12/library/gzip.html#module-gzip) и [`lzma`](https://python-all.ru/3.12/library/lzma.html#module-lzma) всегда были. (Предложено Inada Naoki в [bpo-43785](https://python-all.ru/3.12/whatsnew/3.10.html).)10041005## Устарело10061007- В настоящее время 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.12/reference/expressions.html#and), [`else`](https://python-all.ru/3.12/reference/compound_stmts.html#else), [`for`](https://python-all.ru/3.12/reference/compound_stmts.html#for), [`if`](https://python-all.ru/3.12/reference/compound_stmts.html#if), [`in`](https://python-all.ru/3.12/reference/expressions.html#in), [`is`](https://python-all.ru/3.12/reference/expressions.html#is) и [`or`](https://python-all.ru/3.12/reference/expressions.html#or), выдаётся предупреждение об устаревании. В будущих выпусках оно будет заменено на синтаксическое предупреждение, а затем на синтаксическую ошибку. (Предложено Сергеем Сторчакой в [bpo-43833](https://python-all.ru/3.12/whatsnew/3.10.html).)1008- Начиная с этого выпуска будет предпринята согласованная работа по очистке старой семантики импорта, которая сохранялась для совместимости с Python 2.7. В частности, `find_loader()`/`find_module()` (заменено на [`find_spec()`](https://python-all.ru/3.12/library/importlib.html#importlib.abc.MetaPathFinder.find_spec)), [`load_module()`](https://python-all.ru/3.12/library/importlib.html#importlib.abc.Loader.load_module) (заменено на [`exec_module()`](https://python-all.ru/3.12/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.12/library/importlib.html#module-importlib)). При необходимости будут выдаваться [`ImportWarning`](https://python-all.ru/3.12/library/exceptions.html#ImportWarning) и/или [`DeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#DeprecationWarning), чтобы помочь определить код, требующий обновления в ходе этого перехода.1009- Всё пространство имён `distutils` объявлено устаревшим и будет удалено в Python 3.12. Подробнее см. в разделе [изменения модулей](https://python-all.ru/3.12/whatsnew/3.10.html#distutils-deprecated).1010- Нецелочисленные аргументы для [`random.randrange()`](https://python-all.ru/3.12/library/random.html#random.randrange) объявлены устаревшими. [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError) устарел в пользу [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError). (Предложено Сергеем Сторчакой и Раймондом Хеттингером в [bpo-37319](https://python-all.ru/3.12/whatsnew/3.10.html).)1011- Различные методы `load_module()` класса [`importlib`](https://python-all.ru/3.12/library/importlib.html#module-importlib) были задокументированы как устаревшие, начиная с Python 3.6, но теперь они также будут вызывать [`DeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#DeprecationWarning). Используйте вместо них [`exec_module()`](https://python-all.ru/3.12/library/importlib.html#importlib.abc.Loader.exec_module). (Предложено Бреттом Кэнноном в [bpo-26131](https://python-all.ru/3.12/whatsnew/3.10.html).)1012- `zimport.zipimporter.load_module()` объявлен устаревшим в пользу [`exec_module()`](https://python-all.ru/3.12/library/zipimport.html#zipimport.zipimporter.exec_module). (Предложено Бреттом Кэнноном в [bpo-26131](https://python-all.ru/3.12/whatsnew/3.10.html).)1013- Использование [`load_module()`](https://python-all.ru/3.12/library/importlib.html#importlib.abc.Loader.load_module) системой импорта теперь вызывает [`ImportWarning`](https://python-all.ru/3.12/library/exceptions.html#ImportWarning), поскольку предпочтительнее использовать [`exec_module()`](https://python-all.ru/3.12/library/importlib.html#importlib.abc.Loader.exec_module). (Предложено Бреттом Кэнноном в [bpo-26131](https://python-all.ru/3.12/whatsnew/3.10.html).)1014- Использование `importlib.abc.MetaPathFinder.find_module()` и `importlib.abc.PathEntryFinder.find_module()` системой импорта теперь вызывает [`ImportWarning`](https://python-all.ru/3.12/library/exceptions.html#ImportWarning), поскольку предпочтительнее использовать [`importlib.abc.MetaPathFinder.find_spec()`](https://python-all.ru/3.12/library/importlib.html#importlib.abc.MetaPathFinder.find_spec) и [`importlib.abc.PathEntryFinder.find_spec()`](https://python-all.ru/3.12/library/importlib.html#importlib.abc.PathEntryFinder.find_spec) соответственно. Для помощи в переносе можно использовать [`importlib.util.spec_from_loader()`](https://python-all.ru/3.12/library/importlib.html#importlib.util.spec_from_loader). (Предложено Бреттом Кэнноном в [bpo-42134](https://python-all.ru/3.12/whatsnew/3.10.html).)1015- Использование `importlib.abc.PathEntryFinder.find_loader()` системой импорта теперь вызывает [`ImportWarning`](https://python-all.ru/3.12/library/exceptions.html#ImportWarning), поскольку предпочтительнее использовать [`importlib.abc.PathEntryFinder.find_spec()`](https://python-all.ru/3.12/library/importlib.html#importlib.abc.PathEntryFinder.find_spec). Для помощи в переносе можно использовать [`importlib.util.spec_from_loader()`](https://python-all.ru/3.12/library/importlib.html#importlib.util.spec_from_loader). (Предложено Бреттом Кэнноном в [bpo-43672](https://python-all.ru/3.12/whatsnew/3.10.html).)1016- Различные реализации `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.12/library/exceptions.html#DeprecationWarning) и планируются к удалению в Python 3.12 (ранее они были задокументированы как устаревшие в Python 3.4). (Предложено Бреттом Кэнноном в [bpo-42135](https://python-all.ru/3.12/whatsnew/3.10.html).)1017- `importlib.abc.Finder` объявлен устаревшим (включая его единственный метод `find_module()`). Оба класса [`importlib.abc.MetaPathFinder`](https://python-all.ru/3.12/library/importlib.html#importlib.abc.MetaPathFinder) и [`importlib.abc.PathEntryFinder`](https://python-all.ru/3.12/library/importlib.html#importlib.abc.PathEntryFinder) больше не наследуются от этого класса. Вместо этого следует наследовать от одного из этих двух классов по ситуации. (Предложено Бреттом Кэнноном в [bpo-42135](https://python-all.ru/3.12/whatsnew/3.10.html).)1018- Уведомления об устаревании для `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.12/library/exceptions.html#DeprecationWarning)). (Предложено Бреттом Кэнноном в [bpo-43720](https://python-all.ru/3.12/whatsnew/3.10.html).)1019- Система импорта теперь использует атрибут `__spec__` у модулей, прежде чем обратиться к `module_repr()` для метода `__repr__()` модуля. Удаление использования `module_repr()` запланировано на Python 3.12. (Предложено Бреттом Кэнноном в [bpo-42137](https://python-all.ru/3.12/whatsnew/3.10.html).)1020- `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.12/whatsnew/3.10.html).)1021- `sqlite3.OptimizedUnicode` не документирован и считается устаревшим начиная с Python 3.3, когда он стал псевдонимом для [`str`](https://python-all.ru/3.12/library/stdtypes.html#str). Теперь он объявлен устаревшим и запланирован к удалению в Python 3.12. (Предложено Эрлендом Э. Осландом в [bpo-42264](https://python-all.ru/3.12/whatsnew/3.10.html).)1022- Не документированная встроенная функция `sqlite3.enable_shared_cache` теперь объявлена устаревшей и запланирована к удалению в Python 3.12. Документация SQLite3 настоятельно не рекомендует её использовать. Подробнее см. в [документации SQLite3](https://python-all.ru/3.12/whatsnew/3.10.html). Если необходимо использовать общий кеш, откройте базу данных в режиме URI с помощью параметра запроса `cache=shared`. (Предложено Эрлендом Э. Осландом в [bpo-24464](https://python-all.ru/3.12/whatsnew/3.10.html).)1023- Следующие методы `threading` теперь объявлены устаревшими:10241025  - `threading.currentThread` =\> [`threading.current_thread()`](https://python-all.ru/3.12/library/threading.html#threading.current_thread)1026  - `threading.activeCount` =\> [`threading.active_count()`](https://python-all.ru/3.12/library/threading.html#threading.active_count)1027  - `threading.Condition.notifyAll` =\> [`threading.Condition.notify_all()`](https://python-all.ru/3.12/library/threading.html#threading.Condition.notify_all)1028  - `threading.Event.isSet` =\> [`threading.Event.is_set()`](https://python-all.ru/3.12/library/threading.html#threading.Event.is_set)1029  - `threading.Thread.setName` =\> [`threading.Thread.name`](https://python-all.ru/3.12/library/threading.html#threading.Thread.name)1030  - `threading.thread.getName` =\> [`threading.Thread.name`](https://python-all.ru/3.12/library/threading.html#threading.Thread.name)1031  - `threading.Thread.isDaemon` =\> [`threading.Thread.daemon`](https://python-all.ru/3.12/library/threading.html#threading.Thread.daemon)1032  - `threading.Thread.setDaemon` =\> [`threading.Thread.daemon`](https://python-all.ru/3.12/library/threading.html#threading.Thread.daemon)10331034  (Предложено Йелле Зейлстрой в [gh-87889](https://python-all.ru/3.12/whatsnew/3.10.html).)1035- `pathlib.Path.link_to()` объявлен устаревшим и запланирован к удалению в Python 3.12. Вместо него используйте [`pathlib.Path.hardlink_to()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.hardlink_to). (Предложено Барни Гейлом в [bpo-39950](https://python-all.ru/3.12/whatsnew/3.10.html).)1036- `cgi.log()` объявлен устаревшим и запланирован к удалению в Python 3.12. (Предложено Инадой Наоки в [bpo-41139](https://python-all.ru/3.12/whatsnew/3.10.html).)1037- Следующие возможности [`ssl`](https://python-all.ru/3.12/library/ssl.html#module-ssl) объявлены устаревшими начиная с Python 3.6, Python 3.7 или OpenSSL 1.1.0 и будут удалены в 3.11:10381039  - `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.12/library/ssl.html#ssl.SSLContext.minimum_version) и [`maximum_version`](https://python-all.ru/3.12/library/ssl.html#ssl.SSLContext.maximum_version).1040  - `PROTOCOL_SSLv2`, `PROTOCOL_SSLv3`, `PROTOCOL_SSLv23`, `PROTOCOL_TLSv1`, `PROTOCOL_TLSv1_1`, `PROTOCOL_TLSv1_2` и `PROTOCOL_TLS` объявлены устаревшими в пользу [`PROTOCOL_TLS_CLIENT`](https://python-all.ru/3.12/library/ssl.html#ssl.PROTOCOL_TLS_CLIENT) и [`PROTOCOL_TLS_SERVER`](https://python-all.ru/3.12/library/ssl.html#ssl.PROTOCOL_TLS_SERVER)1041  - `wrap_socket()` заменяется на [`ssl.SSLContext.wrap_socket()`](https://python-all.ru/3.12/library/ssl.html#ssl.SSLContext.wrap_socket)1042  - `match_hostname()`1043  - `RAND_pseudo_bytes()`, `RAND_egd()`1044  - Возможности NPN, такие как [`ssl.SSLSocket.selected_npn_protocol()`](https://python-all.ru/3.12/library/ssl.html#ssl.SSLSocket.selected_npn_protocol) и [`ssl.SSLContext.set_npn_protocols()`](https://python-all.ru/3.12/library/ssl.html#ssl.SSLContext.set_npn_protocols), заменяются на ALPN.1045- Отладка потоков (переменная окружения `PYTHONTHREADDEBUG`) объявлена устаревшей в Python 3.10 и будет удалена в Python 3.12. Эта возможность требует [отладочной сборки Python](https://python-all.ru/3.12/using/configure.html#debug-build). (Предложено Виктором Стиннером в [bpo-44584](https://python-all.ru/3.12/whatsnew/3.10.html).)1046- Импорт из подмодулей `typing.io` и `typing.re` теперь будет вызывать [`DeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#DeprecationWarning). Эти подмодули будут удалены в будущей версии Python. Всё, что относится к этим подмодулям, следует импортировать напрямую из [`typing`](https://python-all.ru/3.12/library/typing.html#module-typing). (Предложено Себастьяном Риттау в [bpo-38291](https://python-all.ru/3.12/whatsnew/3.10.html).)10471048## Удалено10491050- Удалены специальные методы `__int__`, `__float__`, `__floordiv__`, `__mod__`, `__divmod__`, `__rfloordiv__`, `__rmod__` и `__rdivmod__` класса [`complex`](https://python-all.ru/3.12/library/functions.html#complex). Они всегда вызывали [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError). (Предложено Сергеем Сторчакой в [bpo-41974](https://python-all.ru/3.12/whatsnew/3.10.html).)1051- Метод `ParserBase.error()` из приватного и недокументированного модуля `_markupbase` был удалён. [`html.parser.HTMLParser`](https://python-all.ru/3.12/library/html.parser.html#html.parser.HTMLParser) – единственный подкласс `ParserBase`, и его реализация `error()` уже была удалена в Python 3.5. (Предложено Беркером Пексагом в [bpo-31844](https://python-all.ru/3.12/whatsnew/3.10.html).)1052- Удалён атрибут `unicodedata.ucnhash_CAPI`, который был внутренним объектом PyCapsule. Соответствующая приватная структура `_PyUnicode_Name_CAPI` была перемещена во внутренний C API. (Предложено Виктором Стиннером в [bpo-42157](https://python-all.ru/3.12/whatsnew/3.10.html).)1053- Удалён модуль `parser`, который был объявлен устаревшим в версии 3.9 из-за перехода на новый PEG-парсер, а также все исходные C-файлы и заголовочные файлы, которые использовались только старым парсером, включая `node.h`, `parser.h`, `graminit.h` и `grammar.h`.1054- Удалены функции публичного C API `PyParser_SimpleParseStringFlags`, `PyParser_SimpleParseStringFlagsFilename`, `PyParser_SimpleParseFileFlags` и `PyNode_Compile`, которые были объявлены устаревшими в версии 3.9 из-за перехода на новый PEG-парсер.1055- Удалён модуль `formatter`, который был объявлен устаревшим в Python 3.4. Он несколько устарел, мало используется и не тестируется. Изначально его планировали удалить в Python 3.6, но такие удаления были отложены до окончания поддержки Python 2.7. Существующим пользователям следует скопировать используемые ими классы в свой код. (Авторы: Donghee Na и Terry J. Reedy в [bpo-42299](https://python-all.ru/3.12/whatsnew/3.10.html).)1056- Удалена функция `PyModule_GetWarningsModule()`, которая стала бесполезной после того, как модуль `_warnings` был преобразован во встроенный модуль в версии 2.6. (Автор: Hai Shi в [bpo-42599](https://python-all.ru/3.12/whatsnew/3.10.html).)1057- Удалены устаревшие псевдонимы для [абстрактных базовых классов коллекций](https://python-all.ru/3.12/library/collections.abc.html#collections-abstract-base-classes) из модуля [`collections`](https://python-all.ru/3.12/library/collections.html#module-collections). (Автор: Victor Stinner в [bpo-37324](https://python-all.ru/3.12/whatsnew/3.10.html).)1058- Параметр `loop` был удалён из большинства [высокоуровневого API](https://python-all.ru/3.12/library/asyncio-api-index.html) [`asyncio`](https://python-all.ru/3.12/library/asyncio.html#module-asyncio) после объявления устаревшим в Python 3.8. Причины этого изменения многообразны:10591060  1. Это упрощает высокоуровневый API.1061  2. Функции высокоуровневого API неявно получают работающий цикл событий текущего потока, начиная с Python 3.7. В большинстве обычных случаев нет необходимости передавать цикл событий в API.1062  3. Передача цикла событий чревата ошибками, особенно при работе с циклами, выполняющимися в разных потоках.10631064  Обратите внимание: низкоуровневый API по-прежнему принимает `loop`. Примеры замены существующего кода см. в разделе [Изменения в Python API](https://python-all.ru/3.12/whatsnew/3.10.html#changes-python-api).10651066  (Авторы: Yurii Karabas, Andrew Svetlov, Yury Selivanov и Kyle Stanley в [bpo-42392](https://python-all.ru/3.12/whatsnew/3.10.html).)10671068## Перенос на Python 3.1010691070В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.10711072### Изменения в синтаксисе Python10731074- Теперь выдаётся предупреждение об устаревании при компиляции ранее допустимого синтаксиса, если числовой литерал непосредственно предшествует ключевому слову (как в `0in x`). В будущих версиях это станет синтаксическим предупреждением, а затем синтаксической ошибкой. Чтобы избавиться от предупреждения и обеспечить совместимость с будущими версиями, просто добавьте пробел между числовым литералом и следующим ключевым словом. (Автор: Serhiy Storchaka в [bpo-43833](https://python-all.ru/3.12/whatsnew/3.10.html).)10751076### Изменения в Python API10771078- Параметры *etype* функций [`format_exception()`](https://python-all.ru/3.12/library/traceback.html#traceback.format_exception), [`format_exception_only()`](https://python-all.ru/3.12/library/traceback.html#traceback.format_exception_only) и [`print_exception()`](https://python-all.ru/3.12/library/traceback.html#traceback.print_exception) в модуле [`traceback`](https://python-all.ru/3.12/library/traceback.html#module-traceback) переименованы в *exc*. (Авторы: Zackery Spytz и Matthias Bussonnier в [bpo-26389](https://python-all.ru/3.12/whatsnew/3.10.html).)1079- [`atexit`](https://python-all.ru/3.12/library/atexit.html#module-atexit): При завершении Python, если колбэк, зарегистрированный с помощью [`atexit.register()`](https://python-all.ru/3.12/library/atexit.html#atexit.register), завершается ошибкой, его исключение теперь записывается в журнал. Ранее регистрировались только некоторые исключения, а последнее исключение всегда молча игнорировалось. (Автор: Victor Stinner в [bpo-42639](https://python-all.ru/3.12/whatsnew/3.10.html).)1080- Обобщённый тип [`collections.abc.Callable`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Callable) теперь уплощает параметры типа, аналогично тому, что делает [`typing.Callable`](https://python-all.ru/3.12/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.12/library/typing.html#typing.get_args) или `__args__`, должен учитывать это изменение. Кроме того, [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError) может быть возбуждено для некорректных форм параметризации [`collections.abc.Callable`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Callable), которые в Python 3.9 могли проходить незамеченными. (Автор: Ken Jin в [bpo-42195](https://python-all.ru/3.12/whatsnew/3.10.html).)1081- [`socket.htons()`](https://python-all.ru/3.12/library/socket.html#socket.htons) и [`socket.ntohs()`](https://python-all.ru/3.12/library/socket.html#socket.ntohs) теперь возбуждают [`OverflowError`](https://python-all.ru/3.12/library/exceptions.html#OverflowError) вместо [`DeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#DeprecationWarning), если заданный параметр не помещается в 16-битное целое без знака. (Автор: Erlend E. Aasland в [bpo-42393](https://python-all.ru/3.12/whatsnew/3.10.html).)1082- Параметр `loop` был удалён из большинства [высокоуровневого API](https://python-all.ru/3.12/library/asyncio-api-index.html) [`asyncio`](https://python-all.ru/3.12/library/asyncio.html#module-asyncio) после объявления устаревшим в Python 3.8.10831084  Корутина, которая сейчас выглядит так:10851086  ```python1087  async def foo(loop):1088      await asyncio.sleep(1, loop=loop)1089  ```10901091  Должна быть заменена на:10921093  ```python1094  async def foo():1095      await asyncio.sleep(1)1096  ```10971098  Если `foo()` была специально спроектирована *не* для работы в работающем цикле событий текущего потока (например, для работы в цикле событий другого потока), рассмотрите возможность использования [`asyncio.run_coroutine_threadsafe()`](https://python-all.ru/3.12/library/asyncio-task.html#asyncio.run_coroutine_threadsafe) вместо этого.10991100  (Авторы: Yurii Karabas, Andrew Svetlov, Yury Selivanov и Kyle Stanley в [bpo-42392](https://python-all.ru/3.12/whatsnew/3.10.html).)1101- Конструктор [`types.FunctionType`](https://python-all.ru/3.12/library/types.html#types.FunctionType) теперь наследует текущие встроенные функции, если словарь *globals* не содержит ключа `"__builtins__"`, вместо использования `{"None": None}` в качестве встроенных функций: такое же поведение, как у функций [`eval()`](https://python-all.ru/3.12/library/functions.html#eval) и [`exec()`](https://python-all.ru/3.12/library/functions.html#exec). Определение функции с помощью `def function(...): ...` в Python не затрагивается, глобальные переменные не могут быть переопределены этим синтаксисом: он также наследует текущие встроенные функции. (Автор: Victor Stinner в [bpo-42990](https://python-all.ru/3.12/whatsnew/3.10.html).)11021103### Изменения в C API11041105- Функции C API `PyParser_SimpleParseStringFlags`, `PyParser_SimpleParseStringFlagsFilename`, `PyParser_SimpleParseFileFlags`, `PyNode_Compile` и тип, используемый этими функциями, `struct _node`, были удалены из-за перехода на новый PEG-парсер.11061107  Исходный код теперь следует компилировать непосредственно в объект кода, например, с помощью [`Py_CompileString()`](https://python-all.ru/3.12/c-api/veryhigh.html#c.Py_CompileString). Полученный объект кода затем можно выполнить, например, с помощью [`PyEval_EvalCode()`](https://python-all.ru/3.12/c-api/veryhigh.html#c.PyEval_EvalCode).11081109  В частности:11101111  - Вызов `PyParser_SimpleParseStringFlags` с последующим `PyNode_Compile` можно заменить вызовом [`Py_CompileString()`](https://python-all.ru/3.12/c-api/veryhigh.html#c.Py_CompileString).1112  - Прямой замены для `PyParser_SimpleParseFileFlags` не существует. Чтобы скомпилировать код из аргумента `FILE *`, вам нужно будет прочитать файл на C и передать полученный буфер в [`Py_CompileString()`](https://python-all.ru/3.12/c-api/veryhigh.html#c.Py_CompileString).1113  - Чтобы скомпилировать файл по заданному имени файла `char *`, необходимо явно открыть файл, прочитать его и скомпилировать результат. Один из способов – использовать модуль [`io`](https://python-all.ru/3.12/library/io.html#module-io) с функциями [`PyImport_ImportModule()`](https://python-all.ru/3.12/c-api/import.html#c.PyImport_ImportModule), [`PyObject_CallMethod()`](https://python-all.ru/3.12/c-api/call.html#c.PyObject_CallMethod), [`PyBytes_AsString()`](https://python-all.ru/3.12/c-api/bytes.html#c.PyBytes_AsString) и [`Py_CompileString()`](https://python-all.ru/3.12/c-api/veryhigh.html#c.Py_CompileString), как показано ниже. (Объявления и обработка ошибок опущены.)11141115    ```python1116    io_module = Import_ImportModule("io");1117    fileobject = PyObject_CallMethod(io_module, "open", "ss", filename, "rb");1118    source_bytes_object = PyObject_CallMethod(fileobject, "read", "");1119    result = PyObject_CallMethod(fileobject, "close", "");1120    source_buf = PyBytes_AsString(source_bytes_object);1121    code = Py_CompileString(source_buf, filename, Py_file_input);1122    ```1123  - Для объектов `FrameObject` член [`f_lasti`](https://python-all.ru/3.12/reference/datamodel.html#frame.f_lasti) теперь представляет смещение в wordcode, а не просто смещение в строке байткода. Это означает, что это число необходимо умножить на 2 для использования с API, которые ожидают смещение в байтах (например, [`PyCode_Addr2Line()`](https://python-all.ru/3.12/c-api/code.html#c.PyCode_Addr2Line)). Также обратите внимание, что член `f_lasti` объектов `FrameObject` не считается стабильным: используйте вместо него [`PyFrame_GetLineNumber()`](https://python-all.ru/3.12/c-api/frame.html#c.PyFrame_GetLineNumber).11241125## Изменения байткода CPython11261127- Инструкция `MAKE_FUNCTION` теперь принимает в качестве аннотаций функции либо словарь, либо кортеж строк. (Предложено Юрием Карабасом и Инадой Наоки в [bpo-42202](https://python-all.ru/3.12/whatsnew/3.10.html).)11281129## Изменения сборки11301131- [**PEP 644**](https://python-all.ru/3.12/whatsnew/3.10.html): Python теперь требует OpenSSL 1.1.1 или новее. OpenSSL 1.0.2 больше не поддерживается. (Предложено Кристианом Хаймсом в [bpo-43669](https://python-all.ru/3.12/whatsnew/3.10.html).)1132- Для сборки Python теперь требуются функции C99 `snprintf()` и `vsnprintf()`. (Предложено Виктором Штиннером в [bpo-36020](https://python-all.ru/3.12/whatsnew/3.10.html).)1133- [`sqlite3`](https://python-all.ru/3.12/library/sqlite3.html#module-sqlite3) требует SQLite 3.7.15 или выше. (Предложено Сергеем Федосеевым и Эрлендом Э. Аасландом в [bpo-40744](https://python-all.ru/3.12/whatsnew/3.10.html) и [bpo-40810](https://python-all.ru/3.12/whatsnew/3.10.html).)1134- Модуль [`atexit`](https://python-all.ru/3.12/library/atexit.html#module-atexit) теперь всегда должен быть встроенным модулем. (Предложено Виктором Штиннером в [bpo-42639](https://python-all.ru/3.12/whatsnew/3.10.html).)1135- Добавлена опция [`--disable-test-modules`](https://python-all.ru/3.12/using/configure.html#cmdoption-disable-test-modules) в скрипт `configure`: не собирать и не устанавливать тестовые модули. (Предложено Ксавье де Гаем, Томасом Петаззони и Пейсином Сином в [bpo-27640](https://python-all.ru/3.12/whatsnew/3.10.html).)1136- Добавлен [`--with-wheel-pkg-dir=PATH option`](https://python-all.ru/3.12/using/configure.html#cmdoption-with-wheel-pkg-dir) в скрипт `./configure`. Если указано, модуль [`ensurepip`](https://python-all.ru/3.12/library/ensurepip.html#module-ensurepip) ищет колесные пакеты `setuptools` и `pip` в этом каталоге: если оба присутствуют, эти колесные пакеты используются вместо встроенных колесных пакетов ensurepip.11371138  Некоторые политики упаковки дистрибутивов Linux рекомендуют не включать зависимости. Например, Fedora устанавливает пакеты wheel в каталог `/usr/share/python-wheels/` и не устанавливает пакет `ensurepip._bundled`.11391140  (Предложено Виктором Штиннером в [bpo-42856](https://python-all.ru/3.12/whatsnew/3.10.html).)1141- Добавлена новая [`configure --without-static-libpython option`](https://python-all.ru/3.12/using/configure.html#cmdoption-without-static-libpython), чтобы не собирать статическую библиотеку `libpythonMAJOR.MINOR.a` и не устанавливать объектный файл `python.o`.11421143  (Предложено Виктором Штиннером в [bpo-43103](https://python-all.ru/3.12/whatsnew/3.10.html).)1144- Скрипт `configure` теперь использует утилиту `pkg-config`, если она доступна, для определения местоположения заголовков и библиотек Tcl/Tk. Как и раньше, эти местоположения можно указать явно с помощью опций конфигурации `--with-tcltk-includes` и `--with-tcltk-libs`. (Предложено Манолисом Стаматогианнакисом в [bpo-42603](https://python-all.ru/3.12/whatsnew/3.10.html).)1145- Добавлена опция [`--with-openssl-rpath`](https://python-all.ru/3.12/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.12/whatsnew/3.10.html).)11461147## Изменения C API11481149### PEP 652: Поддержание стабильного ABI11501151Стабильный ABI (интерфейс двоичного кода приложений) для модулей расширения или встраивания Python теперь явно определён. [Стабильность C API](https://python-all.ru/3.12/c-api/stable.html#stable) описывает гарантии стабильности C API и ABI, а также лучшие практики использования стабильного ABI.11521153(Предложено Петром Викториным в [**PEP 652**](https://python-all.ru/3.12/whatsnew/3.10.html) и [bpo-43795](https://python-all.ru/3.12/whatsnew/3.10.html).)11541155### Новые возможности11561157- Результат [`PyNumber_Index()`](https://python-all.ru/3.12/c-api/number.html#c.PyNumber_Index) теперь всегда имеет точный тип [`int`](https://python-all.ru/3.12/library/functions.html#int). Ранее результатом мог быть экземпляр подкласса `int`. (Предложено Сергеем Сторчакой в [bpo-40792](https://python-all.ru/3.12/whatsnew/3.10.html).)1158- Добавлен новый член [`orig_argv`](https://python-all.ru/3.12/c-api/init_config.html#c.PyConfig.orig_argv) в структуру [`PyConfig`](https://python-all.ru/3.12/c-api/init_config.html#c.PyConfig): список исходных аргументов командной строки, переданных исполняемому файлу Python. (Предложено Виктором Штиннером в [bpo-23427](https://python-all.ru/3.12/whatsnew/3.10.html).)1159- Добавлены макросы [`PyDateTime_DATE_GET_TZINFO()`](https://python-all.ru/3.12/c-api/datetime.html#c.PyDateTime_DATE_GET_TZINFO) и [`PyDateTime_TIME_GET_TZINFO()`](https://python-all.ru/3.12/c-api/datetime.html#c.PyDateTime_TIME_GET_TZINFO) для доступа к атрибутам `tzinfo` объектов [`datetime.datetime`](https://python-all.ru/3.12/library/datetime.html#datetime.datetime) и [`datetime.time`](https://python-all.ru/3.12/library/datetime.html#datetime.time). (Предложено Закери Спайтцем в [bpo-30155](https://python-all.ru/3.12/whatsnew/3.10.html).)1160- Добавлена функция [`PyCodec_Unregister()`](https://python-all.ru/3.12/c-api/codec.html#c.PyCodec_Unregister) для отмены регистрации функции поиска кодеков. (Предложено Хай Ши в [bpo-41842](https://python-all.ru/3.12/whatsnew/3.10.html).)1161- Добавлена функция [`PyIter_Send()`](https://python-all.ru/3.12/c-api/iter.html#c.PyIter_Send), позволяющая отправить значение в итератор без возбуждения исключения `StopIteration`. (Предложено Владимиром Матвеевым в [bpo-41756](https://python-all.ru/3.12/whatsnew/3.10.html).)1162- Добавлен [`PyUnicode_AsUTF8AndSize()`](https://python-all.ru/3.12/c-api/unicode.html#c.PyUnicode_AsUTF8AndSize) в ограниченный C API. (Предложено Алексом Гейнором в [bpo-41784](https://python-all.ru/3.12/whatsnew/3.10.html).)1163- Добавлена функция [`PyModule_AddObjectRef()`](https://python-all.ru/3.12/c-api/module.html#c.PyModule_AddObjectRef): похожа на [`PyModule_AddObject()`](https://python-all.ru/3.12/c-api/module.html#c.PyModule_AddObject), но не крадёт ссылку на значение при успехе. (Предложено Виктором Штиннером в [bpo-1635741](https://python-all.ru/3.12/whatsnew/3.10.html).)1164- Добавлены функции [`Py_NewRef()`](https://python-all.ru/3.12/c-api/refcounting.html#c.Py_NewRef) и [`Py_XNewRef()`](https://python-all.ru/3.12/c-api/refcounting.html#c.Py_XNewRef) для увеличения счётчика ссылок объекта и возврата объекта. (Предложено Виктором Штиннером в [bpo-42262](https://python-all.ru/3.12/whatsnew/3.10.html).)1165- Функции [`PyType_FromSpecWithBases()`](https://python-all.ru/3.12/c-api/type.html#c.PyType_FromSpecWithBases) и [`PyType_FromModuleAndSpec()`](https://python-all.ru/3.12/c-api/type.html#c.PyType_FromModuleAndSpec) теперь принимают один класс в качестве аргумента *bases*. (Предложено Сергеем Сторчакой в [bpo-42423](https://python-all.ru/3.12/whatsnew/3.10.html).)1166- Функция [`PyType_FromModuleAndSpec()`](https://python-all.ru/3.12/c-api/type.html#c.PyType_FromModuleAndSpec) теперь принимает NULL-слот `tp_doc`. (Предложено Хай Ши в [bpo-41832](https://python-all.ru/3.12/whatsnew/3.10.html).)1167- Функция [`PyType_GetSlot()`](https://python-all.ru/3.12/c-api/type.html#c.PyType_GetSlot) может принимать [статические типы](https://python-all.ru/3.12/c-api/typeobj.html#static-types). (Предложено Хай Ши и Петром Викториным в [bpo-41073](https://python-all.ru/3.12/whatsnew/3.10.html).)1168- Добавлена новая функция [`PySet_CheckExact()`](https://python-all.ru/3.12/c-api/set.html#c.PySet_CheckExact) в C-API, проверяющая, является ли объект экземпляром [`set`](https://python-all.ru/3.12/library/stdtypes.html#set), но не экземпляром подтипа. (Автор: Pablo Galindo в [bpo-43277](https://python-all.ru/3.12/whatsnew/3.10.html).)1169- Добавлена функция [`PyErr_SetInterruptEx()`](https://python-all.ru/3.12/c-api/exceptions.html#c.PyErr_SetInterruptEx), позволяющая передавать номер сигнала для имитации. (Автор: Antoine Pitrou в [bpo-43356](https://python-all.ru/3.12/whatsnew/3.10.html).)1170- Ограниченный C-API теперь поддерживается, если [Python собран в режиме отладки](https://python-all.ru/3.12/using/configure.html#debug-build) (если определён макрос `Py_DEBUG`). В ограниченном C-API функции [`Py_INCREF()`](https://python-all.ru/3.12/c-api/refcounting.html#c.Py_INCREF) и [`Py_DECREF()`](https://python-all.ru/3.12/c-api/refcounting.html#c.Py_DECREF) теперь реализованы как вызовы непрозрачных функций, а не как прямой доступ к члену [`PyObject.ob_refcnt`](https://python-all.ru/3.12/c-api/typeobj.html#c.PyObject.ob_refcnt), если Python собран в режиме отладки и макрос `Py_LIMITED_API` нацелен на Python 3.10 или новее. Поддержка ограниченного C-API в режиме отладки стала возможна благодаря тому, что структура [`PyObject`](https://python-all.ru/3.12/c-api/structures.html#c.PyObject) одинакова в релизном и отладочном режимах начиная с Python 3.8 (см. [bpo-36465](https://python-all.ru/3.12/whatsnew/3.10.html)).11711172  Ограниченный C-API по-прежнему не поддерживается в специальной сборке [`--with-trace-refs`](https://python-all.ru/3.12/using/configure.html#cmdoption-with-trace-refs) (макрос `Py_TRACE_REFS`). (Автор: Victor Stinner в [bpo-43688](https://python-all.ru/3.12/whatsnew/3.10.html).)1173- Добавлена функция [`Py_Is(x, y)`](https://python-all.ru/3.12/c-api/structures.html#c.Py_Is) для проверки, является ли объект *x* тем же объектом *y*, что аналогично `x is y` в Python. Также добавлены функции [`Py_IsNone()`](https://python-all.ru/3.12/c-api/structures.html#c.Py_IsNone), [`Py_IsTrue()`](https://python-all.ru/3.12/c-api/structures.html#c.Py_IsTrue), [`Py_IsFalse()`](https://python-all.ru/3.12/c-api/structures.html#c.Py_IsFalse) для проверки, является ли объект соответственно синглтоном `None`, синглтоном `True` или синглтоном `False`. (Автор: Victor Stinner в [bpo-43753](https://python-all.ru/3.12/whatsnew/3.10.html).)1174- Добавлены новые функции для управления сборщиком мусора из C-кода: [`PyGC_Enable()`](https://python-all.ru/3.12/c-api/gcsupport.html#c.PyGC_Enable), [`PyGC_Disable()`](https://python-all.ru/3.12/c-api/gcsupport.html#c.PyGC_Disable), [`PyGC_IsEnabled()`](https://python-all.ru/3.12/c-api/gcsupport.html#c.PyGC_IsEnabled). Эти функции позволяют активировать, деактивировать и запрашивать состояние сборщика мусора из C-кода без необходимости импорта модуля [`gc`](https://python-all.ru/3.12/library/gc.html#module-gc).1175- Добавлен новый флаг типа [`Py_TPFLAGS_DISALLOW_INSTANTIATION`](https://python-all.ru/3.12/c-api/typeobj.html#c.Py_TPFLAGS_DISALLOW_INSTANTIATION) для запрета создания экземпляров типа. (Автор: Victor Stinner в [bpo-43916](https://python-all.ru/3.12/whatsnew/3.10.html).)1176- Добавлен новый флаг типа [`Py_TPFLAGS_IMMUTABLETYPE`](https://python-all.ru/3.12/c-api/typeobj.html#c.Py_TPFLAGS_IMMUTABLETYPE) для создания неизменяемых объектов типа: атрибуты типа нельзя ни установить, ни удалить. (Авторы: Victor Stinner и Erlend E. Aasland в [bpo-43908](https://python-all.ru/3.12/whatsnew/3.10.html).)11771178### Перенос на Python 3.1011791180- Теперь для использования форматов [`PyArg_ParseTuple()`](https://python-all.ru/3.12/c-api/arg.html#c.PyArg_ParseTuple) и [`Py_BuildValue()`](https://python-all.ru/3.12/c-api/arg.html#c.Py_BuildValue), которые используют `#`, должен быть определён макрос `PY_SSIZE_T_CLEAN`: `es#`, `et#`, `s#`, `u#`, `y#`, `z#`, `U#` и `Z#`. См. [Разбор аргументов и формирование значений](https://python-all.ru/3.12/c-api/arg.html#arg-parsing) и [**PEP 353**](https://python-all.ru/3.12/whatsnew/3.10.html). (Автор: Victor Stinner в [bpo-40943](https://python-all.ru/3.12/whatsnew/3.10.html).)1181- Поскольку [`Py_REFCNT()`](https://python-all.ru/3.12/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.12/c-api/refcounting.html#c.Py_SET_REFCNT) (доступно начиная с Python 3.9). Для обратной совместимости может использоваться этот макрос:11821183  ```python1184  #if PY_VERSION_HEX < 0x030900A41185  #  define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0)1186  #endif1187  ```11881189  (Автор: Victor Stinner в [bpo-39573](https://python-all.ru/3.12/whatsnew/3.10.html).)1190- Вызов [`PyDict_GetItem()`](https://python-all.ru/3.12/c-api/dict.html#c.PyDict_GetItem) без удержания [GIL](https://python-all.ru/3.12/glossary.html#term-GIL) ранее допускался по историческим причинам. Теперь это запрещено. (Автор: Victor Stinner в [bpo-40839](https://python-all.ru/3.12/whatsnew/3.10.html).)1191- `PyUnicode_FromUnicode(NULL, size)` и `PyUnicode_FromStringAndSize(NULL, size)` теперь возбуждают `DeprecationWarning`. Для выделения объекта Unicode без начальных данных используйте [`PyUnicode_New()`](https://python-all.ru/3.12/c-api/unicode.html#c.PyUnicode_New). (Автор: Inada Naoki в [bpo-36346](https://python-all.ru/3.12/whatsnew/3.10.html).)1192- Приватная структура `_PyUnicode_Name_CAPI` `unicodedata.ucnhash_CAPI` API PyCapsule перемещена во внутренний C-API. (Автор: Victor Stinner в [bpo-42157](https://python-all.ru/3.12/whatsnew/3.10.html).)1193- Функции [`Py_GetPath()`](https://python-all.ru/3.12/c-api/init.html#c.Py_GetPath), [`Py_GetPrefix()`](https://python-all.ru/3.12/c-api/init.html#c.Py_GetPrefix), [`Py_GetExecPrefix()`](https://python-all.ru/3.12/c-api/init.html#c.Py_GetExecPrefix), [`Py_GetProgramFullPath()`](https://python-all.ru/3.12/c-api/init.html#c.Py_GetProgramFullPath), [`Py_GetPythonHome()`](https://python-all.ru/3.12/c-api/init.html#c.Py_GetPythonHome) и [`Py_GetProgramName()`](https://python-all.ru/3.12/c-api/init.html#c.Py_GetProgramName) теперь возвращают `NULL`, если они вызваны до [`Py_Initialize()`](https://python-all.ru/3.12/c-api/init.html#c.Py_Initialize) (до инициализации Python). Используйте новый API [Начальная конфигурация Python](https://python-all.ru/3.12/c-api/init_config.html#init-config) для получения [Конфигурации путей Python](https://python-all.ru/3.12/c-api/init_config.html#init-path-config). (Автор: Victor Stinner в [bpo-42260](https://python-all.ru/3.12/whatsnew/3.10.html).)1194- Макросы [`PyList_SET_ITEM()`](https://python-all.ru/3.12/c-api/list.html#c.PyList_SET_ITEM), [`PyTuple_SET_ITEM()`](https://python-all.ru/3.12/c-api/tuple.html#c.PyTuple_SET_ITEM) и [`PyCell_SET()`](https://python-all.ru/3.12/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.12/whatsnew/3.10.html).)1195- Файлы `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.12/c-api/intro.html#api-includes). Если они были включены напрямую, рассмотрите включение `Python.h` вместо этого. (Автор: Nicholas Sim в [bpo-35134](https://python-all.ru/3.12/whatsnew/3.10.html).)1196- Используйте флаг типа [`Py_TPFLAGS_IMMUTABLETYPE`](https://python-all.ru/3.12/c-api/typeobj.html#c.Py_TPFLAGS_IMMUTABLETYPE) для создания неизменяемых объектов типа. Не полагайтесь на [`Py_TPFLAGS_HEAPTYPE`](https://python-all.ru/3.12/c-api/typeobj.html#c.Py_TPFLAGS_HEAPTYPE), чтобы определить, является ли объект типа изменяемым; вместо этого проверяйте, установлен ли [`Py_TPFLAGS_IMMUTABLETYPE`](https://python-all.ru/3.12/c-api/typeobj.html#c.Py_TPFLAGS_IMMUTABLETYPE). (Авторы: Victor Stinner и Erlend E. Aasland в [bpo-43908](https://python-all.ru/3.12/whatsnew/3.10.html).)1197- Незадокументированная функция `Py_FrozenMain` удалена из ограниченного API. Эта функция в основном полезна для пользовательских сборок Python. (Автор: Petr Viktorin в [bpo-26241](https://python-all.ru/3.12/whatsnew/3.10.html).)11981199### Устарело12001201- Функция `PyUnicode_InternImmortal()` теперь устарела и будет удалена в Python 3.12; используйте [`PyUnicode_InternInPlace()`](https://python-all.ru/3.12/c-api/unicode.html#c.PyUnicode_InternInPlace) вместо неё. (Автор: Victor Stinner в [bpo-41692](https://python-all.ru/3.12/whatsnew/3.10.html).)12021203### Удалено12041205- Удалены функции `Py_UNICODE_str*`, работающие со строками `Py_UNICODE*`. (Автор: Inada Naoki в [bpo-41123](https://python-all.ru/3.12/whatsnew/3.10.html).)12061207  - `Py_UNICODE_strlen`: используйте [`PyUnicode_GetLength()`](https://python-all.ru/3.12/c-api/unicode.html#c.PyUnicode_GetLength) или [`PyUnicode_GET_LENGTH`](https://python-all.ru/3.12/c-api/unicode.html#c.PyUnicode_GET_LENGTH)1208  - `Py_UNICODE_strcat`: используйте [`PyUnicode_CopyCharacters()`](https://python-all.ru/3.12/c-api/unicode.html#c.PyUnicode_CopyCharacters) или [`PyUnicode_FromFormat()`](https://python-all.ru/3.12/c-api/unicode.html#c.PyUnicode_FromFormat)1209  - `Py_UNICODE_strcpy`, `Py_UNICODE_strncpy`: используйте [`PyUnicode_CopyCharacters()`](https://python-all.ru/3.12/c-api/unicode.html#c.PyUnicode_CopyCharacters) или [`PyUnicode_Substring()`](https://python-all.ru/3.12/c-api/unicode.html#c.PyUnicode_Substring)1210  - `Py_UNICODE_strcmp`: используйте [`PyUnicode_Compare()`](https://python-all.ru/3.12/c-api/unicode.html#c.PyUnicode_Compare)1211  - `Py_UNICODE_strncmp`: используйте [`PyUnicode_Tailmatch()`](https://python-all.ru/3.12/c-api/unicode.html#c.PyUnicode_Tailmatch)1212  - `Py_UNICODE_strchr`, `Py_UNICODE_strrchr`: используйте [`PyUnicode_FindChar()`](https://python-all.ru/3.12/c-api/unicode.html#c.PyUnicode_FindChar)1213- Удалена `PyUnicode_GetMax()`. Переходите на новые API ([**PEP 393**](https://python-all.ru/3.12/whatsnew/3.10.html)). (Автор: Inada Naoki в [bpo-41103](https://python-all.ru/3.12/whatsnew/3.10.html).)1214- Удалена `PyLong_FromUnicode()`. Переходите на [`PyLong_FromUnicodeObject()`](https://python-all.ru/3.12/c-api/long.html#c.PyLong_FromUnicodeObject). (Автор: Inada Naoki в [bpo-41103](https://python-all.ru/3.12/whatsnew/3.10.html).)1215- Удалено `PyUnicode_AsUnicodeCopy()`. Используйте [`PyUnicode_AsUCS4Copy()`](https://python-all.ru/3.12/c-api/unicode.html#c.PyUnicode_AsUCS4Copy) или [`PyUnicode_AsWideCharString()`](https://python-all.ru/3.12/c-api/unicode.html#c.PyUnicode_AsWideCharString) (Автор: Inada Naoki, [bpo-41103](https://python-all.ru/3.12/whatsnew/3.10.html).)1216- Удалена переменная `_Py_CheckRecursionLimit`: она заменена на `ceval.recursion_limit` структуры [`PyInterpreterState`](https://python-all.ru/3.12/c-api/init.html#c.PyInterpreterState). (Автор: Victor Stinner, [bpo-41834](https://python-all.ru/3.12/whatsnew/3.10.html).)1217- Удалены недокументированные макросы `Py_ALLOW_RECURSION` и `Py_END_ALLOW_RECURSION`, а также поле `recursion_critical` структуры [`PyInterpreterState`](https://python-all.ru/3.12/c-api/init.html#c.PyInterpreterState). (Автор: Serhiy Storchaka, [bpo-41936](https://python-all.ru/3.12/whatsnew/3.10.html).)1218- Удалена недокументированная функция `PyOS_InitInterrupts()`. При инициализации Python уже неявно устанавливает обработчики сигналов: см. [`PyConfig.install_signal_handlers`](https://python-all.ru/3.12/c-api/init_config.html#c.PyConfig.install_signal_handlers). (Автор: Victor Stinner, [bpo-41713](https://python-all.ru/3.12/whatsnew/3.10.html).)1219- 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.12/whatsnew/3.10.html)). (Contributed by Victor Stinner in [bpo-43244](https://python-all.ru/3.12/whatsnew/3.10.html).)1220- Удалены заголовочный файл `symtable.h` и недокументированные функции:12211222  - `PyST_GetScope()`1223  - `PySymtable_Build()`1224  - `PySymtable_BuildObject()`1225  - `PySymtable_Free()`1226  - `Py_SymtableString()`1227  - `Py_SymtableStringObject()`12281229  Функция `Py_SymtableString()` по ошибке была частью стабильного ABI, но не могла использоваться, так как заголовочный файл `symtable.h` был исключён из ограниченного C API.12301231  Вместо этого используйте модуль Python [`symtable`](https://python-all.ru/3.12/library/symtable.html#module-symtable). (Автор: Victor Stinner, [bpo-43244](https://python-all.ru/3.12/whatsnew/3.10.html).)1232- Удалён [`PyOS_ReadlineFunctionPointer()`](https://python-all.ru/3.12/c-api/veryhigh.html#c.PyOS_ReadlineFunctionPointer) из заголовков ограниченного C API и из `python3.dll` (библиотеки, предоставляющей стабильный ABI в Windows). Поскольку функция принимает аргумент `FILE*`, её стабильность ABI не может быть гарантирована. (Автор: Petr Viktorin, [bpo-43868](https://python-all.ru/3.12/whatsnew/3.10.html).)1233- Удалены заголовочные файлы `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.12/library/ast.html#module-ast). (Автор: Victor Stinner, [bpo-43244](https://python-all.ru/3.12/whatsnew/3.10.html).)1234- Удалены функции компилятора и парсера, использующие тип `struct _mod`, так как публичный C API для AST был удалён:12351236  - `PyAST_Compile()`1237  - `PyAST_CompileEx()`1238  - `PyAST_CompileObject()`1239  - `PyFuture_FromAST()`1240  - `PyFuture_FromASTObject()`1241  - `PyParser_ASTFromFile()`1242  - `PyParser_ASTFromFileObject()`1243  - `PyParser_ASTFromFilename()`1244  - `PyParser_ASTFromString()`1245  - `PyParser_ASTFromStringObject()`12461247  Эти функции были недокументированы и исключены из ограниченного C API. (Автор: Victor Stinner, [bpo-43244](https://python-all.ru/3.12/whatsnew/3.10.html).)1248- Удалён заголовочный файл `pyarena.h` с функциями:12491250  - `PyArena_New()`1251  - `PyArena_Free()`1252  - `PyArena_Malloc()`1253  - `PyArena_AddPyObject()`12541255  Эти функции были недокументированы, исключены из ограниченного C API и использовались только внутри компилятора. (Автор: Victor Stinner, [bpo-43244](https://python-all.ru/3.12/whatsnew/3.10.html).)1256- Элемент `PyThreadState.use_tracing` удалён для оптимизации Python. (Автор: Mark Shannon, [bpo-43760](https://python-all.ru/3.12/whatsnew/3.10.html).)12571258## Важная функция безопасности в 3.10.712591260Преобразование между [`int`](https://python-all.ru/3.12/library/functions.html#int) и [`str`](https://python-all.ru/3.12/library/stdtypes.html#str) по основаниям, отличным от 2 (двоичное), 4, 8 (восьмеричное), 16 (шестнадцатеричное) или 32, таким как основание 10 (десятичное), теперь вызывает [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError), если количество цифр в строковом представлении превышает лимит, чтобы избежать потенциальных атак типа «отказ в обслуживании» из-за алгоритмической сложности. Это смягчение для [**CVE 2020-10735**](https://python-all.ru/3.12/whatsnew/3.10.html). Этот лимит можно настроить или отключить с помощью переменной окружения, флага командной строки или API [`sys`](https://python-all.ru/3.12/library/sys.html#module-sys). См. документацию [ограничения длины строкового представления целых чисел](https://python-all.ru/3.12/library/stdtypes.html#int-max-str-digits). Лимит по умолчанию – 4300 цифр в строковом представлении.12611262## Важная функция безопасности в 3.10.812631264Устаревший модуль `mailcap` теперь отказывается внедрять небезопасный текст (имена файлов, MIME-типы, параметры) в команды оболочки. Вместо использования такого текста он выдаст предупреждение и будет действовать так, как если бы совпадение не было найдено (или для тестовых команд, как если бы тест провалился). (Автор: Petr Viktorin, [gh-98966](https://python-all.ru/3.12/whatsnew/3.10.html).)12651266## Важные изменения в 3.10.1212671268### tarfile12691270- Методы извлечения в [`tarfile`](https://python-all.ru/3.12/library/tarfile.html#module-tarfile) и [`shutil.unpack_archive()`](https://python-all.ru/3.12/library/shutil.html#shutil.unpack_archive) получили новый аргумент *filter*, позволяющий ограничивать возможности tar, которые могут быть неожиданными или опасными, например создание файлов за пределами целевого каталога. Подробнее см. [Extraction filters](https://python-all.ru/3.12/library/tarfile.html#tarfile-extraction-filter). В Python 3.12 использование без аргумента *filter* вызовет [`DeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#DeprecationWarning). В Python 3.14 значение по умолчанию будет изменено на `'data'`. (Автор: Petr Viktorin в [**PEP 706**](https://python-all.ru/3.12/whatsnew/3.10.html).)1271