Содержание страницы
Что нового в Python 3.10¶What’s New In Python 3.10
- Редактор:
Pablo Galindo Salgado
В этой статье описаны новые возможности Python 3.10 по сравнению с 3.9. Python 3.10 был выпущен 4 октября 2021 года. Полную информацию см. в журнале изменений.
Итоги – основные изменения¶Summary – Release highlights
Новые синтаксические возможности:
PEP 634, Структурное сопоставление с образцом: спецификация
PEP 635, Структурное сопоставление с образцом: мотивация и обоснование
PEP 636, Структурное сопоставление с образцом: руководство
bpo-12782, теперь официально разрешены контекстные менеджеры в скобках.
Новые возможности в стандартной библиотеке:
PEP 618, добавление опциональной проверки длины в zip.
Улучшения интерпретатора:
PEP 626, точные номера строк для отладки и других инструментов.
Новые возможности типизации:
PEP 604, разрешение записи объединённых типов как X | Y
PEP 612, переменные спецификации параметров
PEP 613, явные псевдонимы типов
PEP 647, пользовательские гарды типов
Важные устаревания, удаления и ограничения:
Новые возможности¶New Features
Контекстные менеджеры в скобках¶Parenthesized context managers
Теперь поддерживается использование круглых скобок для переноса на несколько строк в контекстных менеджерах. Это позволяет форматировать длинный набор контекстных менеджеров на нескольких строках аналогично тому, как это было возможно ранее с операторами import. Например, все эти примеры теперь являются допустимыми:
with (CtxManager() as example):
...
with (
CtxManager1(),
CtxManager2()
):
...
with (CtxManager1() as example,
CtxManager2()):
...
with (CtxManager1(),
CtxManager2() as example):
...
with (
CtxManager1() as example1,
CtxManager2() as example2
):
...
также можно использовать завершающую запятую в конце заключённой группы:
with (
CtxManager1() as example1,
CtxManager2() as example2,
CtxManager3() as example3,
):
...
Этот новый синтаксис использует не LL(1) возможности нового парсера. Подробнее см. PEP 617.
(Авторы: Guido van Rossum, Pablo Galindo и Lysandros Nikolaou в bpo-12782 и bpo-40334.)
Улучшенные сообщения об ошибках¶Better error messages
SyntaxErrors¶
При разборе кода, содержащего незакрытые скобки или квадратные скобки, интерпретатор теперь указывает местоположение незакрытой скобки вместо отображения SyntaxError: unexpected EOF while parsing или указания на некорректное местоположение. Например, рассмотрим следующий код (обратите внимание на незакрытую ‘{‘):
expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6,
some_other_code = foo()
Предыдущие версии интерпретатора сообщали о запутанных местах как о местоположении синтаксической ошибки:
File "example.py", line 3
some_other_code = foo()
^
SyntaxError: invalid syntax
но в Python 3.10 выводится более информативная ошибка:
File "example.py", line 1
expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
^
SyntaxError: '{' was never closed
Аналогично, ошибки, связанные с незакрытыми строковыми литералами (одинарные и тройные кавычки), теперь указывают на начало строки вместо сообщения EOF/EOL.
Эти улучшения вдохновлены предыдущей работой в интерпретаторе PyPy.
(Авторы: Pablo Galindo в bpo-42864 и Batuhan Taskaya в bpo-40176.)
SyntaxError исключения, вызываемые интерпретатором, теперь будут подсвечивать
полный диапазон выражения, которое составляет саму синтаксическую ошибку,
а не только место, где обнаружена проблема. Таким образом, вместо отображения
(до Python 3.10):
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^
SyntaxError: Generator expression must be parenthesized
теперь Python 3.10 будет отображать исключение как:
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized
Это улучшение было предложено Пабло Галиндо в bpo-43914.
Добавлено значительное количество новых специализированных сообщений для исключений SyntaxError.
Наиболее примечательные из них:
Пропущен
:перед блоками:>>> if rocket.position > event_horizon File "<stdin>", line 1 if rocket.position > event_horizon ^ SyntaxError: expected ':'
(Предложено Пабло Галиндо в bpo-42997.)
Кортежи без скобок в целях (targets) генераторов:
>>> {x,y for x,y in zip('abcd', '1234')} File "<stdin>", line 1 {x,y for x,y in zip('abcd', '1234')} ^ SyntaxError: did you forget parentheses around the comprehension target?
(Предложено Пабло Галиндо в bpo-43017.)
Отсутствуют запятые в литералах коллекций и между выражениями:
>>> items = { ... x: 1, ... y: 2 ... z: 3, File "<stdin>", line 3 y: 2 ^ SyntaxError: invalid syntax. Perhaps you forgot a comma?
(Предложено Пабло Галиндо в bpo-43822.)
Несколько типов исключений без скобок:
>>> try: ... build_dyson_sphere() ... except NotEnoughScienceError, NotEnoughResourcesError: File "<stdin>", line 3 except NotEnoughScienceError, NotEnoughResourcesError: ^ SyntaxError: multiple exception types must be parenthesized
(Предложено Пабло Галиндо в bpo-43149.)
Отсутствуют
:и значения в литералах словарей:>>> values = { ... x: 1, ... y: 2, ... z: ... } File "<stdin>", line 4 z: ^ SyntaxError: expression expected after dictionary key and ':' >>> values = {x:1, y:2, z w:3} File "<stdin>", line 1 values = {x:1, y:2, z w:3} ^ SyntaxError: ':' expected after dictionary key
(Предложено Пабло Галиндо в bpo-43823.)
Блоки
tryбез блоковexceptилиfinally:>>> try: ... x = 2 ... something = 3 File "<stdin>", line 3 something = 3 ^^^^^^^^^ SyntaxError: expected 'except' or 'finally' block
(Предложено Пабло Галиндо в bpo-44305.)
Использование
=вместо==в сравнениях:>>> if rocket.position = event_horizon: File "<stdin>", line 1 if rocket.position = event_horizon: ^ SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?
(Предложено Пабло Галиндо в bpo-43797.)
Использование
*в f-строках:>>> f"Black holes {*all_black_holes} and revelations" File "<stdin>", line 1 (*all_black_holes) ^ SyntaxError: f-string: cannot use starred expression here
(Предложено Пабло Галиндо в bpo-41064.)
IndentationErrors¶
Многие исключения IndentationError теперь содержат больше контекста о том, какой блок
ожидал отступа, включая местоположение инструкции:
>>> def foo():
... if lel:
... x = 2
File "<stdin>", line 3
x = 2
^
IndentationError: expected an indented block after 'if' statement in line 2
AttributeErrors¶
При выводе AttributeError, PyErr_Display() будет предлагать
имена похожих атрибутов в объекте, в котором возникло исключение:
>>> collections.namedtoplo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?
(Предложено Пабло Галиндо в bpo-38530.)
Предупреждение
Обратите внимание: это не будет работать, если PyErr_Display() не вызывается для отображения ошибки
что может произойти, если используется другая пользовательская функция отображения ошибок. Это обычная
ситуация в некоторых интерактивных оболочках, например IPython.
NameErrors¶
При выводе NameError, вызванного интерпретатором, PyErr_Display()
будет предлагать имена похожих переменных в функции, в которой возникло исключение:
>>> schwarzschild_black_hole = None
>>> schwarschild_black_hole
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'schwarschild_black_hole' is not defined. Did you mean: schwarzschild_black_hole?
(Предложено Пабло Галиндо в bpo-38530.)
Предупреждение
Обратите внимание: это не будет работать, если PyErr_Display() не вызывается для отображения ошибки,
что может произойти, если используется другая пользовательская функция отображения ошибок. Это обычная
ситуация в некоторых интерактивных оболочках, например IPython.
PEP 626: Точные номера строк для отладки и других инструментов ¶PEP 626: Precise line numbers for debugging and other tools
PEP 626 привносит более точные и надёжные номера строк для инструментов отладки, профилирования и покрытия кода. События трассировки с правильным номером строки генерируются для всех выполняемых строк кода и только для выполняемых строк кода.
Атрибут f_lineno объектов фреймов всегда будет содержать
ожидаемый номер строки.
Атрибут co_lnotab
объектов кода устарел и
будет удалён в версии 3.12.
Коду, которому необходимо преобразовывать смещение в номер строки, следует использовать новый
метод co_lines().
PEP 634: Структурное сопоставление с образцом¶PEP 634: Structural Pattern Matching
Структурное сопоставление с образцом было добавлено в виде оператора match и операторов case с шаблонами и связанными с ними действиями. Шаблоны состоят из последовательностей, отображений, примитивных типов данных, а также экземпляров классов. Сопоставление с образцом позволяет программам извлекать информацию из сложных типов данных, выполнять ветвление на основе структуры данных и применять конкретные действия в зависимости от формы данных.
Синтаксис и операции¶Syntax and operations
Общий синтаксис сопоставления с образцом:
match subject:
case <pattern_1>:
<action_1>
case <pattern_2>:
<action_2>
case <pattern_3>:
<action_3>
case _:
<action_wildcard>
Оператор match принимает выражение и сравнивает его значение с последовательными шаблонами, заданными в виде одного или нескольких блоков case. В частности, сопоставление с образцом работает следующим образом:
используя данные с типом и формой (
subject)вычисляя
subjectв оператореmatchсравнивая проверяемое значение с каждым шаблоном в операторе
caseсверху вниз до подтверждения совпадения.выполняя действие, связанное с шаблоном подтверждённого совпадения
Если точное совпадение не подтверждено, последний оператор case, универсальный шаблон
_, если он предусмотрен, будет использован как совпадающий. Если точное совпадение не подтверждено и универсальный шаблон отсутствует, весь блок match ничего не делает (no-op).
Декларативный подход¶Declarative approach
Читатели могут быть знакомы с сопоставлением с образцом по простому примеру сопоставления выражения (объекта данных) с литералом (шаблоном) с помощью оператора switch в C, Java или JavaScript (и многих других языках). Часто оператор switch используется для сравнения объекта/выражения с операторами case, содержащими литералы.
Более мощные примеры сопоставления с образцом можно найти в таких языках, как Scala и Elixir. При структурном сопоставлении с образцом подход является «декларативным» и явно задаёт условия (шаблоны), которым должны соответствовать данные.
Хотя «императивный» набор инструкций с вложенными операторами «if» можно использовать для достижения чего-то похожего на структурное сопоставление с образцом, он менее понятен, чем «декларативный» подход. Вместо этого «декларативный» подход задаёт условия для совпадения и более читаем благодаря явным шаблонам. Хотя структурное сопоставление с образцом можно использовать в его простейшей форме – сравнение переменной с литералом в операторе case, его истинная ценность для Python заключается в обработке типа и формы проверяемого значения.
Простой шаблон: сопоставление с литералом¶Simple pattern: match to a literal
Рассмотрим этот пример как сопоставление с образцом в его простейшей форме: значение
(проверяемое выражение) сопоставляется с несколькими литералами (шаблонами). В примере
ниже status является проверяемым выражением оператора match. Шаблонами являются
каждый из операторов case, где литералы представляют коды статуса запроса.
Связанное с оператором case действие выполняется после совпадения:
def http_error(status):
match status:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
case _:
return "Something's wrong with the internet"
Если в указанную выше функцию передано status со значением 418, возвращается «I’m a teapot».
Если передано status со значением 500, оператор case с _ совпадёт
как универсальный шаблон, и будет возвращено «Something’s wrong with the internet».
Обратите внимание на последний блок: имя переменной _ действует как универсальный шаблон и гарантирует,
что проверяемое значение всегда совпадёт. Использование _ необязательно.
Можно объединить несколько литералов в одном шаблоне с помощью | («или»):
case 401 | 403 | 404:
return "Not allowed"
Поведение без универсального шаблона¶Behavior without the wildcard
Если изменить предыдущий пример, удалив последний блок case, пример станет таким:
def http_error(status):
match status:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
Без использования _ в операторе case совпадения может не быть. Если совпадения
нет, поведение – пустая операция (no-op). Например, если передано status со значением 500,
ничего не происходит.
Шаблоны с литералом и переменной¶Patterns with a literal and variable
Шаблоны могут выглядеть как распаковка в присваивании, и шаблон может использоваться для связывания переменных. В этом примере точка данных может быть распакована на её x-координату и y-координату:
# point – это кортеж (x, y)
match point:
case (0, 0):
print("Origin")
case (0, y):
print(f"Y={y}")
case (x, 0):
print(f"X={x}")
case (x, y):
print(f"X={x}, Y={y}")
case _:
raise ValueError("Not a point")
Первый шаблон содержит два литерала, (0, 0), и может рассматриваться как
расширение шаблона-литерала, показанного выше. Следующие два шаблона объединяют
литерал и переменную, и переменная связывает значение из проверяемого выражения
(point). Четвёртый шаблон захватывает два значения, что делает его
концептуально похожим на распаковывающее присваивание (x, y) = point.
Шаблоны и классы¶Patterns and classes
Если вы используете классы для структурирования данных, вы можете использовать в качестве шаблона имя класса, за которым следует список аргументов, напоминающий конструктор. Этот шаблон позволяет захватывать атрибуты экземпляра в переменные:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def location(point):
match point:
case Point(x=0, y=0):
print("Origin is the point's location.")
case Point(x=0, y=y):
print(f"Y={y} and the point is on the y-axis.")
case Point(x=x, y=0):
print(f"X={x} and the point is on the x-axis.")
case Point():
print("The point is located somewhere else on the plane.")
case _:
print("Not a point")
Шаблоны с позиционными параметрами¶Patterns with positional parameters
Вы можете использовать позиционные параметры с некоторыми встроенными классами, которые предоставляют
упорядочивание для своих атрибутов (например, dataclasses). Вы также можете определить конкретную
позицию для атрибутов в шаблонах, задав специальный атрибут __match_args__
в своих классах. Если он установлен в (“x”, “y”), следующие шаблоны
все эквивалентны (и все связывают атрибут y с переменной var):
Point(1, var)
Point(1, y=var)
Point(x=1, y=var)
Point(y=var, x=1)
Вложенные шаблоны¶Nested patterns
Шаблоны могут быть произвольно вложенными. Например, если наши данные – короткий список точек, их можно сопоставить следующим образом:
match points:
case []:
print("No points in the list.")
case [Point(0, 0)]:
print("The origin is the only point in the list.")
case [Point(x, y)]:
print(f"A single point {x}, {y} is in the list.")
case [Point(0, y1), Point(0, y2)]:
print(f"Two points on the Y axis at {y1}, {y2} are in the list.")
case _:
print("Something else is found in the list.")
Сложные шаблоны и универсальный шаблон¶Complex patterns and the wildcard
До этого момента в примерах использовался _ отдельно в последнем операторе case.
Универсальный шаблон можно использовать в более сложных шаблонах, например ('error', code, _).
Например:
match test_variable:
case ('warning', code, 40):
print("A warning has been received.")
case ('error', code, _):
print(f"An error {code} occurred.")
В приведённом выше случае test_variable будет соответствовать (‘error’, code, 100) и
(‘error’, code, 800).
Ограничитель¶Guard
К шаблону можно добавить предложение if, известное как «страж». Если
страж ложен, match переходит к следующему блоку case. Обратите внимание,
что захват значения происходит до вычисления стража:
match point:
case Point(x, y) if x == y:
print(f"The point is located on the diagonal Y=X at {x}.")
case Point(x, y):
print(f"Point is not on the diagonal.")
Другие ключевые особенности¶Other Key Features
Несколько других важных возможностей:
Как и при распаковке присваиваний, шаблоны кортежей и списков имеют одинаковый смысл и по сути сопоставляются с произвольными последовательностями. Технически субъект должен быть последовательностью. Поэтому важное исключение: шаблоны не сопоставляются с итераторами. Кроме того, чтобы избежать распространённой ошибки, шаблоны последовательностей не сопоставляются со строками.
Шаблоны последовательностей поддерживают подстановочные знаки:
[x, y, *rest]и(x, y, *rest)работают аналогично подстановочным знакам при распаковке присваиваний. Имя после*также может быть_, поэтому(x, y, *_)сопоставляется с последовательностью из не менее двух элементов без привязки остальных элементов.Шаблоны отображений:
{"bandwidth": b, "latency": l}захватывает значения"bandwidth"и"latency"из словаря. В отличие от шаблонов последовательностей, лишние ключи игнорируются. Также поддерживается подстановочный знак**rest. (Но**_был бы избыточным, поэтому не допускается.)Подшаблоны могут быть захвачены с помощью ключевого слова
as:case (Point(x1, y1), Point(x2, y2) as p2): ...
Это связывает x1, y1, x2, y2, как и ожидалось, без пункта
as, а p2 – со всем вторым элементом субъекта.Большинство литералов сравниваются по равенству. Однако синглтоны
True,FalseиNoneсравниваются по идентичности.Именованные константы можно использовать в шаблонах. Они должны быть точечными именами, чтобы константа не интерпретировалась как переменная захвата:
from enum import Enum class Color(Enum): RED = 0 GREEN = 1 BLUE = 2 color = Color.GREEN match color: case Color.RED: print("I see red!") case Color.GREEN: print("Grass is green") case Color.BLUE: print("I'm feeling the blues :(")
Полную спецификацию см. в PEP 634. Мотивация и обоснование находятся в PEP 635, а более подробное руководство – в PEP 636.
Опциональные EncodingWarning и encoding="locale" параметры¶Optional EncodingWarning and encoding="locale" option
Кодировка по умолчанию для TextIOWrapper и open() зависит от платформы и локали. Поскольку UTF-8 используется на большинстве платформ Unix, опускание параметра encoding при открытии файлов в UTF-8 (например, JSON, YAML, TOML, Markdown) является очень распространённой ошибкой. Например:
# ОШИБКА: следует использовать режим "rb" или encoding="utf-8".
with open("data.json") as f:
data = json.load(f)
Для обнаружения такой ошибки добавлен опциональный EncodingWarning. Он выдаётся, когда sys.flags.warn_default_encoding истинно и используется кодировка по умолчанию, зависящая от локали.
Параметр -X warn_default_encoding и PYTHONWARNDEFAULTENCODING добавлены для включения предупреждения.
См. Кодировка текста для получения дополнительной информации.
Прочие изменения языка ¶Other Language Changes
Тип
intполучил новый методint.bit_count(), который возвращает количество единиц в двоичном представлении целого числа, также известное как число единиц (population count). (Автор: Niklas Fiekas в bpo-29882.)Представления, возвращаемые
dict.keys(),dict.values()иdict.items(), теперь все имеют атрибутmapping, предоставляющий объектtypes.MappingProxyType, оборачивающий исходный словарь. (Автор: Dennis Sweeney в bpo-40890.)PEP 618: функция
zip()теперь имеет необязательный флагstrict, используемый для требования, чтобы все итерируемые объекты имели одинаковую длину.Встроенные функции и функции расширений, принимающие целочисленные аргументы, больше не принимают
Decimal,Fractionи другие объекты, которые могут быть преобразованы в целые числа только с потерей (например, имеющие метод__int__(), но не имеющие метода__index__()). (Автор: Serhiy Storchaka в bpo-37999.)Если
object.__ipow__()возвращаетNotImplemented, оператор будет корректно возвращаться кobject.__pow__()иobject.__rpow__(), как и ожидается. (Автор: Alex Shkop в bpo-38302.)Присваивающие выражения теперь можно использовать без скобок внутри литералов множеств и включений множеств, а также в индексах последовательностей (но не в срезах).
Функции получили новый атрибут
__builtins__, который используется для поиска встроенных символов при выполнении функции, вместо поиска в__globals__['__builtins__']. Атрибут инициализируется из__globals__["__builtins__"], если он существует, иначе из текущих встроенных объектов. (Автор: Mark Shannon в bpo-42990.)Две новые встроенные функции –
aiter()иanext()были добавлены для предоставления асинхронных аналоговiter()иnext()соответственно. (Авторы: Joshua Bronson, Daniel Pope и Justin Wang в bpo-31861.)Статические методы (
@staticmethod) и методы классов (@classmethod) теперь наследуют атрибуты методов (__module__,__name__,__qualname__,__doc__,__annotations__) и имеют новый атрибут__wrapped__. Более того, статические методы теперь можно вызывать как обычные функции. (Автор: Victor Stinner в bpo-43682.)Аннотации для сложных целей (всё, кроме целей
simple name, заданных PEP 526) больше не вызывают никаких эффектов во время выполнения приfrom __future__ import annotations. (Автор: Batuhan Taskaya в bpo-42737.)Объекты классов и модулей теперь лениво создают пустые словари аннотаций по требованию. Словари аннотаций хранятся в
__dict__объекта для обратной совместимости. Это улучшает лучшие практики работы с__annotations__; для получения дополнительной информации см. Annotations Best Practices. (Автор: Larry Hastings в bpo-43901.)Аннотации, состоящие из
yield,yield from,awaitили именованных выражений, теперь запрещены приfrom __future__ import annotationsиз-за их побочных эффектов. (Автор: Batuhan Taskaya в bpo-42725.)Использование несвязанных переменных,
super()и других выражений, которые могут изменить обработку таблицы символов в качестве аннотаций, теперь не имеет эффекта приfrom __future__ import annotations. (Автор: Batuhan Taskaya в bpo-42725.)Хеши значений NaN как типа
float, так и типаdecimal.Decimalтеперь зависят от идентичности объекта. Раньше они всегда хешировались в0, несмотря на то что значения NaN не равны друг другу. Это приводило к потенциально квадратичному поведению во время выполнения из-за чрезмерных коллизий хешей при создании словарей и множеств, содержащих несколько NaN. (Автор: Raymond Hettinger в bpo-43475.)При удалении константы
__debug__будет возбужденоSyntaxError(вместоNameError). (Автор: Donghee Na в bpo-45000.)Исключения
SyntaxErrorтеперь имеют атрибутыend_linenoиend_offset. Они будут равныNone, если не определены. (Автор: Pablo Galindo в bpo-43914.)
Новые модули¶New Modules
Нет.
Улучшенные модули¶Improved Modules
asyncio¶
Добавлен отсутствующий метод connect_accepted_socket().
(Автор: Alex Grönholm в bpo-41332.)
argparse¶
Вводящая в заблуждение фраза «optional arguments» была заменена на «options» в справке argparse. Некоторым тестам может потребоваться адаптация, если они полагаются на точное совпадение вывода. (Автор: Raymond Hettinger в bpo-9694.)
array¶
Метод index() у array.array теперь имеет
необязательные параметры start и stop.
(Авторы: Anders Lorentsen и Zackery Spytz в bpo-31956.)
asynchat, asyncore, smtpd¶
Эти модули были отмечены как устаревшие в своей документации, начиная с Python 3.6. Теперь во все три модуля добавлено DeprecationWarning во время импорта.
base64¶
Добавлены base64.b32hexencode() и base64.b32hexdecode() для поддержки
кодирования Base32 с расширенным шестнадцатеричным алфавитом.
bdb¶
Добавлена clearBreakpoints() для сброса всех установленных точек останова.
(Предложено Ирит Катриэлем в bpo-24160.)
bisect¶
Добавлена возможность указания функции key в API модуля bisect.
(Предложено Рэймондом Хеттингером в bpo-4356.)
codecs¶
Добавлена функция codecs.unregister() для отмены регистрации функции поиска кодеков.
(Предложено Хай Ши в bpo-41842.)
collections.abc¶
__args__ у параметризованных обобщённых типов для
collections.abc.Callable теперь согласованы с typing.Callable.
collections.abc.Callable обобщённый тип теперь упрощает параметры типа, аналогично
tому, что делает typing.Callable. Это означает, что
collections.abc.Callable[[int, str], str] будет иметь __args__ от
(int, str, str); ранее это было ([int, str], str). Чтобы обеспечить это
изменение, types.GenericAlias теперь может быть подклассом, и при индексировании типа collections.abc.Callable будет возвращаться подкласс. Обратите внимание,
что может возникать TypeError для некорректных форм параметризации
collections.abc.Callable, которые в Python 3.9 могли проходить молча.
(Предложено Кеном Джином в bpo-42195.)
contextlib¶
Добавлен менеджер контекста contextlib.aclosing() для безопасного закрытия асинхронных генераторов
и объектов, представляющих асинхронно освобождаемые ресурсы.
(Предложено Джунги Кимом и Джоном Бельмонте в bpo-41229.)
Добавлена поддержка асинхронного менеджера контекста для contextlib.nullcontext().
(Предложено Томом Грингаузом в bpo-41543.)
Добавлен AsyncContextDecorator для поддержки использования асинхронных
менеджеров контекста в качестве декораторов.
curses¶
Расширенные функции цвета, добавленные в ncurses 6.1, будут прозрачно использоваться
curses.color_content(), curses.init_color(),
curses.init_pair() и curses.pair_content(). Новая функция
curses.has_extended_color_support() указывает, поддерживаются ли расширенные цвета
базовой библиотекой ncurses.
(Предложено Джеффри Кинчером и Хансом Петтером Янссоном в bpo-36982.)
Константы BUTTON5_* теперь доступны в модуле curses, если
они предоставляются базовой библиотекой curses.
(Предложено Закери Спайтцем в bpo-39273.)
dataclasses¶
__slots__¶
Добавлен параметр slots в декоратор dataclasses.dataclass().
(Предложено Юрием Карабасом в bpo-42269)
Поля только по ключу¶Keyword-only fields
dataclasses теперь поддерживает поля, которые являются только по ключу в сгенерированном методе __init__. Существует несколько способов указания таких полей.
Можно указать, что все поля являются только по ключу:
from dataclasses import dataclass
@dataclass(kw_only=True)
class Birthday:
name: str
birthday: datetime.date
Оба параметра name и birthday являются только по ключу в
сгенерированном методе __init__.
Можно указать «только по ключу» для каждого поля отдельно:
from dataclasses import dataclass, field
@dataclass
class Birthday:
name: str
birthday: datetime.date = field(kw_only=True)
Здесь только birthday является только по ключу. Если установить kw_only для
отдельных полей, следует учитывать, что существуют правила переупорядочивания
полей: поля только по ключу должны следовать после полей не только по ключу. Подробнее см. в полной документации dataclasses.
Также можно указать, что все поля, следующие за маркером KW_ONLY, являются только по ключу. Вероятно, это будет наиболее распространённый способ использования:
from dataclasses import dataclass, KW_ONLY
@dataclass
class Point:
x: float
y: float
_: KW_ONLY
z: float = 0.0
t: float = 0.0
Здесь z и t являются параметрами только по ключу, а x и
y – нет.
(Предложено Эриком В. Смитом в bpo-43532.)
distutils¶
Весь пакет distutils является устаревшим и будет удалён в Python
3.12. Его функциональность для указания сборки пакетов уже полностью
заменена сторонними пакетами setuptools и
packaging, а большинство других часто используемых API доступны в других местах
стандартной библиотеки (например, platform, shutil,
subprocess или sysconfig). Планов по переносу какой-либо другой функциональности из
distutils нет, и приложения, использующие другие функции, должны рассмотреть создание частных копий кода.
Обратитесь к PEP 632 для обсуждения.
Команда bdist_wininst, устаревшая в Python 3.8, была удалена.
Теперь для распространения двоичных пакетов в Windows рекомендуется использовать команду bdist_wheel.
(Предложено Виктором Стиннером в bpo-42802.)
doctest¶
Если модуль не определяет __loader__, используется __spec__.loader.
(Автор: Brett Cannon в bpo-42133.)
encodings¶
encodings.normalize_encoding() теперь игнорирует не-ASCII символы.
(Добавлено Хай Ши в bpo-39337.)
enum¶
Enum __repr__() теперь возвращает enum_name.member_name, а
__str__() теперь возвращает member_name. Перечисления стандартной библиотеки, доступные как
константы модуля, имеют repr(), равный module_name.member_name.
(Добавлено Итаном Фурманом в bpo-40066.)
Добавлен enum.StrEnum для перечислений, все члены которых являются строками.
(Добавлено Итаном Фурманом в bpo-41816.)
fileinput¶
Добавлены параметры encoding и errors в fileinput.input() и
fileinput.FileInput.
(Добавлено Инадой Наоки в bpo-43712.)
fileinput.hook_compressed() теперь возвращает объект TextIOWrapper,
когда mode равен «r», а файл сжат, как и несжатые файлы.
(Добавлено Инадой Наоки в bpo-5758.)
faulthandler ¶
Модуль faulthandler теперь обнаруживает, произошла ли фатальная ошибка во время
сборки мусора.
(Добавлено Виктором Стиннером в bpo-44466.)
gc¶
Добавлены аудит-хуки для gc.get_objects(), gc.get_referrers() и
gc.get_referents(). (Добавлено Пабло Галиндо в bpo-43439.)
glob¶
Добавлены параметры root_dir и dir_fd в glob() и
iglob(), которые позволяют указать корневой каталог для поиска.
(Добавлено Сергеем Сторчакой в bpo-38144.)
hashlib¶
Модуль hashlib требует OpenSSL 1.1.1 или новее. (Добавлено Кристианом Хаймсом в PEP 644 и bpo-43669.)
Модуль hashlib имеет предварительную поддержку OpenSSL 3.0.0. (Добавлено Кристианом Хаймсом в bpo-38820 и других тикетах.)
Чистая реализация на Python pbkdf2_hmac() объявлена устаревшей. В
будущем PBKDF2-HMAC будет доступен только при сборке Python с поддержкой
OpenSSL.
(Добавлено Кристианом Хаймсом в bpo-43880.)
hmac¶
Модуль hmac теперь использует реализацию HMAC от OpenSSL внутри. (Добавлено Кристианом Хаймсом в bpo-40645.)
IDLE и idlelib¶IDLE and idlelib
IDLE теперь вызывает sys.excepthook() (при запуске без «-n»).
Ранее пользовательские хуки игнорировались. (Добавлено Кеном Хилтоном в
bpo-43008.)
Переработан диалог настроек. Вкладка General разделена на вкладки Windows и Shell/Ed. Источники справки, расширяющие меню Help, перемещены на вкладку Extensions. Освобождено место для новых опций и сокращён диалог. Последнее улучшает отображение диалога на маленьких экранах. (Добавлено Терри Джан Риди в bpo-40468.) Настройка отступа (indent space) перенесена с вкладки Font на новую вкладку Windows. (Добавлено Марком Роземаном и Терри Джан Риди в bpo-33962.)
Эти изменения были перенесены в поддерживаемый выпуск 3.9.
Добавлена боковая панель Shell. Основное приглашение («>>>») перемещено на боковую панель. Вторичные приглашения («…») добавлены на боковую панель. Щелчок левой кнопкой мыши и перетаскивание (опционально) выделяют одну или несколько строк текста, как в боковой панели с номерами строк редактора. Щелчок правой кнопкой после выделения строк текста отображает контекстное меню с пунктом «copy with prompts». Это объединяет приглашения с боковой панели со строками выделенного текста. Этот пункт также появляется в контекстном меню текста. (Добавлено Талем Эйнатом в bpo-37903.)
Используются пробелы вместо табуляции для отступа интерактивного кода. Это делает ввод интерактивного кода «выглядящим правильно». Возможность этого была основной мотивацией для добавления боковой панели Shell. (Добавлено Терри Джан Риди в bpo-37892.)
Подсвечиваются новые мягкие ключевые слова match,
case и _ в
операторах сопоставления с образцом. Однако эта подсветка не идеальна
и может быть некорректной в некоторых редких случаях, включая некоторые _ в
образцах case. (Добавлено Талем Эйнатом в bpo-44010.)
Новое в поддерживаемых выпусках 3.10.
Применять подсветку синтаксиса для файлов .pyi. (Авторы: Alex Waygood и Terry Jan Reedy, bpo-45447.)
Включение приглашений при сохранении содержимого Shell с вводом и выводом. (Автор: Terry Jan Reedy, gh-95191.)
importlib.metadata¶
Функциональная совместимость с importlib_metadata 4.6
(история).
importlib.metadata entry points теперь предоставляют более удобный интерфейс для выбора точек входа по группе и имени через новый класс importlib.metadata.EntryPoints. См. примечание о совместимости в документации для получения дополнительной информации об устаревании и использовании.
Добавлена importlib.metadata.packages_distributions() для разрешения модулей и пакетов верхнего уровня Python в их importlib.metadata.Distribution.
inspect¶
Если модуль не определяет __loader__, используется __spec__.loader.
(Автор: Brett Cannon в bpo-42133.)
Добавлен inspect.get_annotations(), который безопасно вычисляет аннотации,
определённые для объекта. Он обходит особенности доступа к аннотациям
для различных типов объектов и делает очень мало предположений об объекте,
который исследует. inspect.get_annotations() также может корректно преобразовывать
строковые аннотации обратно в объекты. inspect.get_annotations() теперь считается
лучшей практикой для доступа к словарю аннотаций, определённому для любого объекта Python;
дополнительную информацию о лучших практиках работы с аннотациями см. в
Лучшие практики для аннотаций.
Кроме того, inspect.signature(),
inspect.Signature.from_callable() и inspect.Signature.from_function()
теперь вызывают inspect.get_annotations() для получения аннотаций. Это означает,
что inspect.signature() и inspect.Signature.from_callable()
также теперь могут преобразовывать строковые аннотации обратно в объекты.
(Автор: Larry Hastings в bpo-43817.)
itertools¶
Добавлен itertools.pairwise().
(Автор: Raymond Hettinger в bpo-38200.)
linecache¶
Если модуль не определяет __loader__, используется __spec__.loader.
(Автор: Brett Cannon в bpo-42133.)
os¶
Добавлена поддержка os.cpu_count() для VxWorks RTOS.
(Автор: Peixing Xin в bpo-41440.)
Добавлена новая функция os.eventfd() и вспомогательные функции для обёртки системного вызова
eventfd2 в Linux.
(Автор: Christian Heimes в bpo-41001.)
Добавлен os.splice(), который позволяет перемещать данные между двумя файловыми
дескрипторами без копирования между адресным пространством ядра и пользовательским
адресным пространством, причём один из файловых дескрипторов должен ссылаться на
канал. (Автор: Pablo Galindo в bpo-41625.)
Добавлены O_EVTONLY, O_FSYNC, O_SYMLINK
и O_NOFOLLOW_ANY для macOS.
(Автор: Donghee Na в bpo-43106.)
os.path¶
os.path.realpath() теперь принимает именованный аргумент strict. Если установлено
значение True, OSError возбуждается, если путь не существует или обнаружен цикл
символической ссылки.
(Автор: Barney Gale в bpo-43757.)
pathlib¶
Добавлена поддержка срезов для PurePath.parents.
(Автор: Joshua Cannon в bpo-35498.)
Добавлена поддержка отрицательной индексации для PurePath.parents.
(Автор: Yaroslav Pankovych в bpo-21041.)
Добавлен метод Path.hardlink_to, который
заменяет link_to(). Новый метод имеет тот же порядок
аргументов, что и symlink_to().
(Автор: Barney Gale в bpo-39950.)
pathlib.Path.stat() и chmod() теперь принимают именованный аргумент
follow_symlinks для согласованности с соответствующими
функциями в модуле os.
(Автор: Barney Gale в bpo-39906.)
platform¶
Добавлен platform.freedesktop_os_release() для получения идентификации операционной
системы из стандартного файла freedesktop.org os-release.
(Автор: Christian Heimes в bpo-28468.)
pprint¶
pprint.pprint() теперь принимает новый именованный аргумент underscore_numbers.
(Автор: sblondon в bpo-42914.)
pprint теперь может красиво печатать экземпляры dataclasses.dataclass.
(Автор: Lewis Gaul в bpo-43080.)
py_compile¶
Добавлена опция --quiet в интерфейс командной строки py_compile.
(Автор: Gregory Schevchenko в bpo-38731.)
pyclbr¶
Добавлен атрибут end_lineno в объекты Function и Class
в дереве, возвращаемом pyclbr.readmodule() и
pyclbr.readmodule_ex(). Он соответствует существующему (начальному) lineno.
(Автор: Aviral Srivastava в bpo-38307.)
shelve¶
Модуль shelve теперь по умолчанию использует pickle.DEFAULT_PROTOCOL
вместо протокола pickle 3 при создании shelves.
(Автор: Zackery Spytz в bpo-34204.)
statistics¶
Добавлены функции covariance(), correlation()
Пирсона и простая linear_regression().
(Автор: Tymoteusz Wołodźko в bpo-38490.)
site¶
Если модуль не определяет __loader__, используется __spec__.loader.
(Автор: Brett Cannon в bpo-42133.)
socket¶
Исключение socket.timeout теперь является псевдонимом TimeoutError.
(Автор: Christian Heimes в bpo-42413.)
Добавлена возможность создавать MPTCP-сокеты с IPPROTO_MPTCP
(Автор: Rui Cunha в bpo-43571.)
Добавлена опция IP_RECVTOS для получения поля Type of Service (ToS) или DSCP/ECN
(Автор: Georg Sauthoff в bpo-44077.)
ssl¶
Модуль ssl требует OpenSSL 1.1.1 или новее. (Автор: Christian Heimes в PEP 644 и bpo-43669.)
Модуль ssl получил предварительную поддержку OpenSSL 3.0.0 и новую опцию
OP_IGNORE_UNEXPECTED_EOF.
(Автор: Christian Heimes в bpo-38820, bpo-43794,
bpo-43788, bpo-43791, bpo-43799, bpo-43920,
bpo-43789 и bpo-43811.)
Устаревшие функции и использование устаревших констант теперь приводят к
DeprecationWarning. У ssl.SSLContext.options по умолчанию установлены
OP_NO_SSLv2 и OP_NO_SSLv3, поэтому он не может
предупредить о повторной установке флага. В
разделе об устаревших возможностях приведён список устаревших
функций.
(Автор: Christian Heimes в bpo-43880.)
Модуль ssl теперь использует более безопасные настройки по умолчанию. Шифры без прямой секретности (forward secrecy) или с MAC SHA-1 отключены по умолчанию. Уровень безопасности 2 запрещает слабые ключи RSA, DH и ECC с надёжностью менее 112 бит.
SSLContext по умолчанию использует минимальную версию протокола TLS 1.2.
Настройки основаны на исследовании Hynek Schlawack.
(Автор: Christian Heimes в bpo-43998.)
Устаревшие протоколы SSL 3.0, TLS 1.0 и TLS 1.1 больше официально не поддерживаются. Python активно их не блокирует. Однако параметры сборки OpenSSL, настройки дистрибутивов, патчи вендоров и наборы шифров могут препятствовать успешному рукопожатию.
Добавлен параметр timeout в функцию ssl.get_server_certificate().
(Автор: Zackery Spytz в bpo-31870.)
Модуль ssl использует heap-типы и многофазную инициализацию. (Автор: Christian Heimes в bpo-42333.)
Добавлен новый флаг проверки VERIFY_X509_PARTIAL_CHAIN.
(Автор: l0x в bpo-40849.)
sqlite3¶
Добавлены события аудита для connect(),
enable_load_extension() и
load_extension().
(Автор: Erlend E. Aasland в bpo-43762.)
sys¶
Добавлен атрибут sys.orig_argv: список исходных аргументов командной строки,
переданных исполняемому файлу Python.
(Автор: Victor Stinner в bpo-23427.)
Добавлен sys.stdlib_module_names, содержащий список имён модулей стандартной библиотеки.
(Автор: Victor Stinner в bpo-42955.)
_thread¶
_thread.interrupt_main() теперь принимает необязательный номер сигнала для
имитации (по умолчанию по-прежнему signal.SIGINT).
(Автор: Antoine Pitrou в bpo-43356.)
threading¶
Добавлены threading.gettrace() и threading.getprofile() для
получения функций, установленных threading.settrace() и
threading.setprofile() соответственно.
(Автор: Mario Corchero в bpo-42251.)
Добавлен threading.__excepthook__ для получения исходного значения
threading.excepthook(), если оно установлено в сломанное или другое
значение.
(Автор: Mario Corchero в bpo-42308.)
traceback¶
Функции format_exception(),
format_exception_only() и
print_exception() теперь могут принимать объект исключения
в качестве позиционного аргумента (только позиционный).
(Авторы: Zackery Spytz и Matthias Bussonnier в bpo-26389.)
types¶
Повторно введены классы types.EllipsisType, types.NoneType
и types.NotImplementedType, предоставляющие новый набор
типов, легко интерпретируемых средствами проверки типов.
(Автор: Bas van Beek в bpo-41810.)
typing¶
Основные изменения см. в новых возможностях, связанных с аннотациями типов.
Поведение typing.Literal было изменено в соответствии с PEP 586
и для соответствия поведению статических анализаторов типов, описанному в PEP.
Literalтеперь удаляет дубликаты параметров.Проверки равенства между объектами
Literalтеперь не зависят от порядка.Сравнения
Literalтеперь учитывают типы. Например,Literal[0] == Literal[False]ранее давалоTrue. Теперь этоFalse. Для поддержки этого изменения внутренний кеш типов теперь поддерживает различение типов.Объекты
Literalтеперь будут вызывать исключениеTypeErrorпри проверке равенства, если какой-либо из их параметров не является хешируемым. Обратите внимание, что объявлениеLiteralс нехешируемыми параметрами не вызовет ошибку:>>> from typing import Literal >>> Literal[{0}] >>> Literal[{0}] == Literal[{False}] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'set'
(Предложено Юрием Карабасом в bpo-42345.)
Добавлена новая функция typing.is_typeddict() для проверки, является ли аннотация
типом typing.TypedDict.
(Предложено Патриком Ридером в bpo-41792.)
Подклассы typing.Protocol, которые объявляют только переменные данных,
теперь будут вызывать TypeError при проверке с помощью isinstance, если они не
декорированы runtime_checkable(). Ранее такие проверки
проходили молча. Пользователям следует декорировать свои
подклассы декоратором runtime_checkable(),\если они хотят использовать протоколы времени выполнения.
(Предложено Юрием Карабасом в bpo-38908.)
Импорт из подмодулей typing.io и typing.re теперь будет вызывать
DeprecationWarning. Эти подмодули устарели начиная с
Python 3.8 и будут удалены в будущей версии Python. Все, что
принадлежит этим подмодулям, следует импортировать напрямую из
typing.
(Предложено Sebastian Rittau в bpo-38291.)
unittest¶
Добавлен новый метод assertNoLogs() в дополнение к существующему
assertLogs(). (Предложено Kit Yan Choi
в bpo-39385.)
urllib.parse¶
В версиях Python ниже 3.10 допускалось использование как ;, так и & в качестве
разделителей параметров запроса в urllib.parse.parse_qs() и
urllib.parse.parse_qsl(). Из соображений безопасности и для соответствия
новым рекомендациям W3C теперь разрешен только один
разделитель, по умолчанию &. Это изменение также затрагивает
cgi.parse() и cgi.parse_multipart(), так как они внутренне используют затронутые функции.
Подробнее см. в их документации.
(Предложено Adam Goldschmidt, Senthil Kumaran и Ken Jin в bpo-42967.)
Наличие символов новой строки или табуляции в частях URL допускает некоторые формы
атак. Следуя спецификации WHATWG, обновляющей RFC 3986,
символы ASCII новой строки \n, \r и табуляции \t удаляются из
URL анализатором в urllib.parse, предотвращая такие атаки. Удаляемые
символы контролируются новой переменной уровня модуля
urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE. (См. gh-88048)
xml¶
Добавлен класс LexicalHandler в модуль
xml.sax.handler.
(Предложено Jonathan Gossage и Zackery Spytz в bpo-35018.)
zipimport¶
Добавлены методы, связанные с PEP 451: find_spec(),
zipimport.zipimporter.create_module() и
zipimport.zipimporter.exec_module().
(Предложено Brett Cannon в bpo-42131.)
Добавлен метод invalidate_caches().
(Предложено Desmond Cheong в bpo-14678.)
Оптимизации¶Optimizations
Конструкторы
str(),bytes()иbytearray()теперь работают быстрее (примерно на 30–40% для маленьких объектов). (Предложено Serhiy Storchaka в bpo-41334.)Модуль
runpyтеперь импортирует меньше модулей. Время запуска командыpython3 -m module-nameв среднем в 1,4 раза быстрее. На Linuxpython3 -I -m module-nameимпортирует 69 модулей в Python 3.9, тогда как в Python 3.10 импортирует только 51 модуль (-18). (Предложено Victor Stinner в bpo-41006 и bpo-41718.)Инструкция
LOAD_ATTRтеперь использует новый механизм «per opcode cache». Она работает примерно на 36% быстрее для обычных атрибутов и на 44% быстрее для слотов. (Предложено Pablo Galindo и Yury Selivanov в bpo-42093 и Guido van Rossum в bpo-42927, на основе идей, первоначально реализованных в PyPy и MicroPython.)При сборке Python с
--enable-optimizationsтеперь-fno-semantic-interpositionдобавляется как в команду компиляции, так и в команду компоновки. Это ускоряет сборку интерпретатора Python, созданного с помощью--enable-sharedсgcc, до 30%. См. эту статью для подробностей. (Предложено Victor Stinner и Pablo Galindo в bpo-38980.)Используется новый код управления выходным буфером для модулей
bz2/lzma/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)При использовании строковых аннотаций словари аннотаций для функций больше не создаются при создании функции. Вместо этого они хранятся в виде кортежа строк, и объект функции лениво преобразует его в словарь аннотаций по требованию. Эта оптимизация сокращает время CPU, необходимое для определения аннотированной функции, вдвое. (Предложено Yurii Karabas и Inada Naoki в bpo-42202.)
Функции поиска подстроки, такие как
str1 in str2иstr2.find(str1), теперь иногда используют алгоритм поиска строк «Two-Way» Крочемора и Перрина, чтобы избежать квадратичного поведения на длинных строках. (Предложено Dennis Sweeney в bpo-41972)Добавлены микрооптимизации в
_PyType_Lookup()для улучшения производительности поиска в кеше атрибутов типа в типичном случае попадания в кеш. Это делает интерпретатор в среднем в 1,04 раза быстрее. (Предложено Dino Viehland в bpo-43452.)Следующие встроенные функции теперь поддерживают более быстрый соглашение вызова PEP 590 vectorcall:
map(),filter(),reversed(),bool()иfloat(). (Предложено Donghee Na и Jeroen Demeyer в bpo-43575, bpo-43287, bpo-41922, bpo-41873 и bpo-41870.)Производительность
BZ2Fileулучшена за счет удаления внутреннихRLock. Это делаетBZ2Fileпотоконебезопасным при наличии нескольких одновременных читателей или писателей, как и его эквивалентные классы вgzipиlzmaвсегда были. (Предложено Inada Naoki в bpo-43785.)
Устарело¶Deprecated
В настоящее время Python допускает числовые литералы, непосредственно после которых следуют ключевые слова, например
0in x,1or x,0if 1else 2. Это приводит к появлению сбивающих с толку и неоднозначных выражений, таких как[0x1for x in y](которые можно рассматривать как[0x1 for x in y]или[0x1f or x in y]). Начиная с этого выпуска, если за числовым литералом непосредственно следует одно из ключевых словand,else,for,if,in,isиor, выдаётся предупреждение об устаревании. В будущих выпусках оно будет заменено на синтаксическое предупреждение, а затем на синтаксическую ошибку. (Предложено Сергеем Сторчакой в bpo-43833.)Начиная с этого выпуска будет предпринята согласованная работа по очистке старой семантики импорта, которая сохранялась для совместимости с Python 2.7. В частности,
find_loader()/find_module()(заменено наfind_spec()),load_module()(заменено наexec_module()),module_repr()(о чём система импорта заботится сама), атрибут__package__(заменён на__spec__.parent), атрибут__loader__(заменён на__spec__.loader) и атрибут__cached__(заменён на__spec__.cached) будут постепенно удалены (а также другие классы и методы вimportlib). При необходимости будут выдаватьсяImportWarningи/илиDeprecationWarning, чтобы помочь определить код, требующий обновления в ходе этого перехода.Всё пространство имён
distutilsобъявлено устаревшим и будет удалено в Python 3.12. Подробнее см. в разделе изменения модулей.Нецелочисленные аргументы для
random.randrange()объявлены устаревшими.ValueErrorустарел в пользуTypeError. (Предложено Сергеем Сторчакой и Раймондом Хеттингером в bpo-37319.)Различные методы
load_module()классаimportlibбыли задокументированы как устаревшие, начиная с Python 3.6, но теперь они также будут вызыватьDeprecationWarning. Используйте вместо нихexec_module(). (Предложено Бреттом Кэнноном в bpo-26131.)zimport.zipimporter.load_module()объявлен устаревшим в пользуexec_module(). (Предложено Бреттом Кэнноном в bpo-26131.)Использование
load_module()системой импорта теперь вызываетImportWarning, поскольку предпочтительнее использоватьexec_module(). (Предложено Бреттом Кэнноном в bpo-26131.)Использование
importlib.abc.MetaPathFinder.find_module()иimportlib.abc.PathEntryFinder.find_module()системой импорта теперь вызываетImportWarning, поскольку предпочтительнее использоватьimportlib.abc.MetaPathFinder.find_spec()иimportlib.abc.PathEntryFinder.find_spec()соответственно. Для помощи в переносе можно использоватьimportlib.util.spec_from_loader(). (Предложено Бреттом Кэнноном в bpo-42134.)Использование
importlib.abc.PathEntryFinder.find_loader()системой импорта теперь вызываетImportWarning, поскольку предпочтительнее использоватьimportlib.abc.PathEntryFinder.find_spec(). Для помощи в переносе можно использоватьimportlib.util.spec_from_loader(). (Предложено Бреттом Кэнноном в bpo-43672.)Различные реализации
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и планируются к удалению в Python 3.12 (ранее они были задокументированы как устаревшие в Python 3.4). (Предложено Бреттом Кэнноном в bpo-42135.)importlib.abc.Finderобъявлен устаревшим (включая его единственный методfind_module()). Оба классаimportlib.abc.MetaPathFinderиimportlib.abc.PathEntryFinderбольше не наследуются от этого класса. Вместо этого следует наследовать от одного из этих двух классов по ситуации. (Предложено Бреттом Кэнноном в bpo-42135.)Уведомления об устаревании для
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). (Предложено Бреттом Кэнноном в bpo-43720.)Система импорта теперь использует атрибут
__spec__у модулей, прежде чем обратиться кmodule_repr()для метода__repr__()модуля. Удаление использованияmodule_repr()запланировано на Python 3.12. (Предложено Бреттом Кэнноном в bpo-42137.)importlib.abc.Loader.module_repr(),importlib.machinery.FrozenLoader.module_repr()иimportlib.machinery.BuiltinLoader.module_repr()объявлены устаревшими и планируются к удалению в Python 3.12. (Предложено Бреттом Кэнноном в bpo-42136.)sqlite3.OptimizedUnicodeне документирован и считается устаревшим начиная с Python 3.3, когда он стал псевдонимом дляstr. Теперь он объявлен устаревшим и запланирован к удалению в Python 3.12. (Предложено Эрлендом Э. Осландом в bpo-42264.)Не документированная встроенная функция
sqlite3.enable_shared_cacheтеперь объявлена устаревшей и запланирована к удалению в Python 3.12. Документация SQLite3 настоятельно не рекомендует её использовать. Подробнее см. в документации SQLite3. Если необходимо использовать общий кеш, откройте базу данных в режиме URI с помощью параметра запросаcache=shared. (Предложено Эрлендом Э. Осландом в bpo-24464.)Следующие методы
threadingтеперь объявлены устаревшими:threading.currentThread=>threading.current_thread()threading.activeCount=>threading.active_count()threading.Condition.notifyAll=>threading.Condition.notify_all()threading.Event.isSet=>threading.Event.is_set()threading.Thread.setName=>threading.Thread.namethreading.thread.getName=>threading.Thread.namethreading.Thread.isDaemon=>threading.Thread.daemonthreading.Thread.setDaemon=>threading.Thread.daemon
(Предложено Йелле Зейлстрой в gh-87889.)
pathlib.Path.link_to()объявлен устаревшим и запланирован к удалению в Python 3.12. Вместо него используйтеpathlib.Path.hardlink_to(). (Предложено Барни Гейлом в bpo-39950.)cgi.log()объявлен устаревшим и запланирован к удалению в Python 3.12. (Предложено Инадой Наоки в bpo-41139.)Следующие возможности
sslобъявлены устаревшими начиная с Python 3.6, Python 3.7 или OpenSSL 1.1.0 и будут удалены в 3.11:OP_NO_SSLv2,OP_NO_SSLv3,OP_NO_TLSv1,OP_NO_TLSv1_1,OP_NO_TLSv1_2иOP_NO_TLSv1_3заменяются наminimum_versionиmaximum_version.PROTOCOL_SSLv2,PROTOCOL_SSLv3,PROTOCOL_SSLv23,PROTOCOL_TLSv1,PROTOCOL_TLSv1_1,PROTOCOL_TLSv1_2иPROTOCOL_TLSобъявлены устаревшими в пользуPROTOCOL_TLS_CLIENTиPROTOCOL_TLS_SERVERwrap_socket()заменяется наssl.SSLContext.wrap_socket()match_hostname()RAND_pseudo_bytes(),RAND_egd()Возможности NPN, такие как
ssl.SSLSocket.selected_npn_protocol()иssl.SSLContext.set_npn_protocols(), заменяются на ALPN.
Отладка потоков (переменная окружения
PYTHONTHREADDEBUG) объявлена устаревшей в Python 3.10 и будет удалена в Python 3.12. Эта возможность требует отладочной сборки Python. (Предложено Виктором Стиннером в bpo-44584.)Импорт из подмодулей
typing.ioиtyping.reтеперь будет вызыватьDeprecationWarning. Эти подмодули будут удалены в будущей версии Python. Всё, что относится к этим подмодулям, следует импортировать напрямую изtyping. (Предложено Себастьяном Риттау в bpo-38291.)
Удалено¶Removed
Удалены специальные методы
__int__,__float__,__floordiv__,__mod__,__divmod__,__rfloordiv__,__rmod__и__rdivmod__классаcomplex. Они всегда вызывалиTypeError. (Предложено Сергеем Сторчакой в bpo-41974.)Метод
ParserBase.error()из приватного и недокументированного модуля_markupbaseбыл удалён.html.parser.HTMLParser– единственный подклассParserBase, и его реализацияerror()уже была удалена в Python 3.5. (Предложено Беркером Пексагом в bpo-31844.)Удалён атрибут
unicodedata.ucnhash_CAPI, который был внутренним объектом PyCapsule. Соответствующая приватная структура_PyUnicode_Name_CAPIбыла перемещена во внутренний C API. (Предложено Виктором Стиннером в bpo-42157.)Удалён модуль
parser, который был объявлен устаревшим в версии 3.9 из-за перехода на новый PEG-парсер, а также все исходные C-файлы и заголовочные файлы, которые использовались только старым парсером, включаяnode.h,parser.h,graminit.hиgrammar.h.Удалены функции публичного C API
PyParser_SimpleParseStringFlags,PyParser_SimpleParseStringFlagsFilename,PyParser_SimpleParseFileFlagsиPyNode_Compile, которые были объявлены устаревшими в версии 3.9 из-за перехода на новый PEG-парсер.Удалён модуль
formatter, который был объявлен устаревшим в Python 3.4. Он несколько устарел, мало используется и не тестируется. Изначально его планировали удалить в Python 3.6, но такие удаления были отложены до окончания поддержки Python 2.7. Существующим пользователям следует скопировать используемые ими классы в свой код. (Авторы: Donghee Na и Terry J. Reedy в bpo-42299.)Удалена функция
PyModule_GetWarningsModule(), которая стала бесполезной после того, как модуль_warningsбыл преобразован во встроенный модуль в версии 2.6. (Автор: Hai Shi в bpo-42599.)Удалены устаревшие псевдонимы для абстрактных базовых классов коллекций из модуля
collections. (Автор: Victor Stinner в bpo-37324.)Параметр
loopбыл удалён из большинства высокоуровневого APIasyncioпосле объявления устаревшим в Python 3.8. Причины этого изменения многообразны:Это упрощает высокоуровневый API.
Функции высокоуровневого API неявно получают работающий цикл событий текущего потока, начиная с Python 3.7. В большинстве обычных случаев нет необходимости передавать цикл событий в API.
Передача цикла событий чревата ошибками, особенно при работе с циклами, выполняющимися в разных потоках.
Обратите внимание: низкоуровневый API по-прежнему принимает
loop. Примеры замены существующего кода см. в разделе Изменения в Python API.(Авторы: Yurii Karabas, Andrew Svetlov, Yury Selivanov и Kyle Stanley в bpo-42392.)
Перенос на Python 3.10¶Porting to Python 3.10
В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.
Изменения в синтаксисе Python¶Changes in the Python syntax
Теперь выдаётся предупреждение об устаревании при компиляции ранее допустимого синтаксиса, если числовой литерал непосредственно предшествует ключевому слову (как в
0in x). В будущих версиях это станет синтаксическим предупреждением, а затем синтаксической ошибкой. Чтобы избавиться от предупреждения и обеспечить совместимость с будущими версиями, просто добавьте пробел между числовым литералом и следующим ключевым словом. (Автор: Serhiy Storchaka в bpo-43833.)
Изменения в Python API¶Changes in the Python API
Параметры etype функций
format_exception(),format_exception_only()иprint_exception()в модулеtracebackпереименованы в exc. (Авторы: Zackery Spytz и Matthias Bussonnier в bpo-26389.)atexit: При завершении Python, если колбэк, зарегистрированный с помощьюatexit.register(), завершается ошибкой, его исключение теперь записывается в журнал. Ранее регистрировались только некоторые исключения, а последнее исключение всегда молча игнорировалось. (Автор: Victor Stinner в bpo-42639.)Обобщённый тип
collections.abc.Callableтеперь уплощает параметры типа, аналогично тому, что делаетtyping.Callable. Это означает, чтоcollections.abc.Callable[[int, str], str]будет иметь__args__из(int, str, str); ранее это было([int, str], str). Код, обращающийся к аргументам черезtyping.get_args()или__args__, должен учитывать это изменение. Кроме того,TypeErrorможет быть возбуждено для некорректных форм параметризацииcollections.abc.Callable, которые в Python 3.9 могли проходить незамеченными. (Автор: Ken Jin в bpo-42195.)socket.htons()иsocket.ntohs()теперь возбуждаютOverflowErrorвместоDeprecationWarning, если заданный параметр не помещается в 16-битное целое без знака. (Автор: Erlend E. Aasland в bpo-42393.)Параметр
loopбыл удалён из большинства высокоуровневого APIasyncioпосле объявления устаревшим в Python 3.8.Корутина, которая сейчас выглядит так:
async def foo(loop): await asyncio.sleep(1, loop=loop)
Должна быть заменена на:
async def foo(): await asyncio.sleep(1)
Если
foo()была специально спроектирована не для работы в работающем цикле событий текущего потока (например, для работы в цикле событий другого потока), рассмотрите возможность использованияasyncio.run_coroutine_threadsafe()вместо этого.(Авторы: Yurii Karabas, Andrew Svetlov, Yury Selivanov и Kyle Stanley в bpo-42392.)
Конструктор
types.FunctionTypeтеперь наследует текущие встроенные функции, если словарь globals не содержит ключа"__builtins__", вместо использования{"None": None}в качестве встроенных функций: такое же поведение, как у функцийeval()иexec(). Определение функции с помощьюdef function(...): ...в Python не затрагивается, глобальные переменные не могут быть переопределены этим синтаксисом: он также наследует текущие встроенные функции. (Автор: Victor Stinner в bpo-42990.)
Изменения в C API¶Changes in the C API
Функции C API
PyParser_SimpleParseStringFlags,PyParser_SimpleParseStringFlagsFilename,PyParser_SimpleParseFileFlags,PyNode_Compileи тип, используемый этими функциями,struct _node, были удалены из-за перехода на новый PEG-парсер.Исходный код теперь следует компилировать непосредственно в объект кода, например, с помощью
Py_CompileString(). Полученный объект кода затем можно выполнить, например, с помощьюPyEval_EvalCode().В частности:
Вызов
PyParser_SimpleParseStringFlagsс последующимPyNode_Compileможно заменить вызовомPy_CompileString().Прямой замены для
PyParser_SimpleParseFileFlagsне существует. Чтобы скомпилировать код из аргументаFILE *, вам нужно будет прочитать файл на C и передать полученный буфер вPy_CompileString().Чтобы скомпилировать файл по заданному имени файла
char *, необходимо явно открыть файл, прочитать его и скомпилировать результат. Один из способов – использовать модульioс функциямиPyImport_ImportModule(),PyObject_CallMethod(),PyBytes_AsString()иPy_CompileString(), как показано ниже. (Объявления и обработка ошибок опущены.)io_module = Import_ImportModule("io"); fileobject = PyObject_CallMethod(io_module, "open", "ss", filename, "rb"); source_bytes_object = PyObject_CallMethod(fileobject, "read", ""); result = PyObject_CallMethod(fileobject, "close", ""); source_buf = PyBytes_AsString(source_bytes_object); code = Py_CompileString(source_buf, filename, Py_file_input);
Для объектов
FrameObjectчленf_lastiтеперь представляет смещение в wordcode, а не просто смещение в строке байткода. Это означает, что это число необходимо умножить на 2 для использования с API, которые ожидают смещение в байтах (например,PyCode_Addr2Line()). Также обратите внимание, что членf_lastiобъектовFrameObjectне считается стабильным: используйте вместо негоPyFrame_GetLineNumber().
Изменения байткода CPython¶CPython bytecode changes
Инструкция
MAKE_FUNCTIONтеперь принимает в качестве аннотаций функции либо словарь, либо кортеж строк. (Предложено Юрием Карабасом и Инадой Наоки в bpo-42202.)
Изменения сборки¶Build Changes
PEP 644: Python теперь требует OpenSSL 1.1.1 или новее. OpenSSL 1.0.2 больше не поддерживается. (Предложено Кристианом Хаймсом в bpo-43669.)
Для сборки Python теперь требуются функции C99
snprintf()иvsnprintf(). (Предложено Виктором Штиннером в bpo-36020.)sqlite3требует SQLite 3.7.15 или выше. (Предложено Сергеем Федосеевым и Эрлендом Э. Аасландом в bpo-40744 и bpo-40810.)Модуль
atexitтеперь всегда должен быть встроенным модулем. (Предложено Виктором Штиннером в bpo-42639.)Добавлена опция
--disable-test-modulesв скриптconfigure: не собирать и не устанавливать тестовые модули. (Предложено Ксавье де Гаем, Томасом Петаззони и Пейсином Сином в bpo-27640.)Добавлен
--with-wheel-pkg-dir=PATH optionв скрипт./configure. Если указано, модульensurepipищет колесные пакетыsetuptoolsиpipв этом каталоге: если оба присутствуют, эти колесные пакеты используются вместо встроенных колесных пакетов ensurepip.Некоторые политики упаковки дистрибутивов Linux рекомендуют не включать зависимости. Например, Fedora устанавливает пакеты wheel в каталог
/usr/share/python-wheels/и не устанавливает пакетensurepip._bundled.(Предложено Виктором Штиннером в bpo-42856.)
Добавлена новая
configure --without-static-libpython option, чтобы не собирать статическую библиотекуlibpythonMAJOR.MINOR.aи не устанавливать объектный файлpython.o.(Предложено Виктором Штиннером в bpo-43103.)
Скрипт
configureтеперь использует утилитуpkg-config, если она доступна, для определения местоположения заголовков и библиотек Tcl/Tk. Как и раньше, эти местоположения можно указать явно с помощью опций конфигурации--with-tcltk-includesи--with-tcltk-libs. (Предложено Манолисом Стаматогианнакисом в bpo-42603.)Добавлена опция
--with-openssl-rpathв скриптconfigure. Эта опция упрощает сборку Python с пользовательской установкой OpenSSL, например./configure --with-openssl=/path/to/openssl --with-openssl-rpath=auto. (Предложено Кристианом Хаймсом в bpo-43466.)
Изменения C API¶C API Changes
PEP 652: Поддержание стабильного ABI¶PEP 652: Maintaining the Stable ABI
Стабильный ABI (интерфейс двоичного кода приложений) для модулей расширения или встраивания Python теперь явно определён. Стабильность C API описывает гарантии стабильности C API и ABI, а также лучшие практики использования стабильного ABI.
Новые возможности¶New Features
Результат
PyNumber_Index()теперь всегда имеет точный типint. Ранее результатом мог быть экземпляр подклассаint. (Предложено Сергеем Сторчакой в bpo-40792.)Добавлен новый член
orig_argvв структуруPyConfig: список исходных аргументов командной строки, переданных исполняемому файлу Python. (Предложено Виктором Штиннером в bpo-23427.)Добавлены макросы
PyDateTime_DATE_GET_TZINFO()иPyDateTime_TIME_GET_TZINFO()для доступа к атрибутамtzinfoобъектовdatetime.datetimeиdatetime.time. (Предложено Закери Спайтцем в bpo-30155.)Добавлена функция
PyCodec_Unregister()для отмены регистрации функции поиска кодеков. (Предложено Хай Ши в bpo-41842.)Добавлена функция
PyIter_Send(), позволяющая отправить значение в итератор без возбуждения исключенияStopIteration. (Предложено Владимиром Матвеевым в bpo-41756.)Добавлен
PyUnicode_AsUTF8AndSize()в ограниченный C API. (Предложено Алексом Гейнором в bpo-41784.)Добавлена функция
PyModule_AddObjectRef(): похожа наPyModule_AddObject(), но не крадёт ссылку на значение при успехе. (Предложено Виктором Штиннером в bpo-1635741.)Добавлены функции
Py_NewRef()иPy_XNewRef()для увеличения счётчика ссылок объекта и возврата объекта. (Предложено Виктором Штиннером в bpo-42262.)Функции
PyType_FromSpecWithBases()иPyType_FromModuleAndSpec()теперь принимают один класс в качестве аргумента bases. (Предложено Сергеем Сторчакой в bpo-42423.)Функция
PyType_FromModuleAndSpec()теперь принимает NULL-слотtp_doc. (Предложено Хай Ши в bpo-41832.)Функция
PyType_GetSlot()может принимать статические типы. (Предложено Хай Ши и Петром Викториным в bpo-41073.)Добавлена новая функция
PySet_CheckExact()в C-API, проверяющая, является ли объект экземпляромset, но не экземпляром подтипа. (Автор: Pablo Galindo в bpo-43277.)Добавлена функция
PyErr_SetInterruptEx(), позволяющая передавать номер сигнала для имитации. (Автор: Antoine Pitrou в bpo-43356.)Ограниченный C-API теперь поддерживается, если Python собран в режиме отладки (если определён макрос
Py_DEBUG). В ограниченном C-API функцииPy_INCREF()иPy_DECREF()теперь реализованы как вызовы непрозрачных функций, а не как прямой доступ к членуPyObject.ob_refcnt, если Python собран в режиме отладки и макросPy_LIMITED_APIнацелен на Python 3.10 или новее. Поддержка ограниченного C-API в режиме отладки стала возможна благодаря тому, что структураPyObjectодинакова в релизном и отладочном режимах начиная с Python 3.8 (см. bpo-36465).Ограниченный C-API по-прежнему не поддерживается в специальной сборке
--with-trace-refs(макросPy_TRACE_REFS). (Автор: Victor Stinner в bpo-43688.)Добавлена функция
Py_Is(x, y)для проверки, является ли объект x тем же объектом y, что аналогичноx is yв Python. Также добавлены функцииPy_IsNone(),Py_IsTrue(),Py_IsFalse()для проверки, является ли объект соответственно синглтономNone, синглтономTrueили синглтономFalse. (Автор: Victor Stinner в bpo-43753.)Добавлены новые функции для управления сборщиком мусора из C-кода:
PyGC_Enable(),PyGC_Disable(),PyGC_IsEnabled(). Эти функции позволяют активировать, деактивировать и запрашивать состояние сборщика мусора из C-кода без необходимости импорта модуляgc.Добавлен новый флаг типа
Py_TPFLAGS_DISALLOW_INSTANTIATIONдля запрета создания экземпляров типа. (Автор: Victor Stinner в bpo-43916.)Добавлен новый флаг типа
Py_TPFLAGS_IMMUTABLETYPEдля создания неизменяемых объектов типа: атрибуты типа нельзя ни установить, ни удалить. (Авторы: Victor Stinner и Erlend E. Aasland в bpo-43908.)
Перенос на Python 3.10¶Porting to Python 3.10
Теперь для использования форматов
PyArg_ParseTuple()иPy_BuildValue(), которые используют#, должен быть определён макросPY_SSIZE_T_CLEAN:es#,et#,s#,u#,y#,z#,U#иZ#. См. Разбор аргументов и формирование значений и PEP 353. (Автор: Victor Stinner в bpo-40943.)Поскольку
Py_REFCNT()изменена на встраиваемую статическую функцию,Py_REFCNT(obj) = new_refcntдолжна быть заменена наPy_SET_REFCNT(obj, new_refcnt): см.Py_SET_REFCNT()(доступно начиная с Python 3.9). Для обратной совместимости может использоваться этот макрос:#if PY_VERSION_HEX < 0x030900A4 # define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0) #endif
(Автор: Victor Stinner в bpo-39573.)
Вызов
PyDict_GetItem()без удержания GIL ранее допускался по историческим причинам. Теперь это запрещено. (Автор: Victor Stinner в bpo-40839.)PyUnicode_FromUnicode(NULL, size)иPyUnicode_FromStringAndSize(NULL, size)теперь возбуждаютDeprecationWarning. Для выделения объекта Unicode без начальных данных используйтеPyUnicode_New(). (Автор: Inada Naoki в bpo-36346.)Приватная структура
_PyUnicode_Name_CAPIunicodedata.ucnhash_CAPIAPI PyCapsule перемещена во внутренний C-API. (Автор: Victor Stinner в bpo-42157.)Функции
Py_GetPath(),Py_GetPrefix(),Py_GetExecPrefix(),Py_GetProgramFullPath(),Py_GetPythonHome()иPy_GetProgramName()теперь возвращаютNULL, если они вызваны доPy_Initialize()(до инициализации Python). Используйте новый API Начальная конфигурация Python для получения Конфигурации путей Python. (Автор: Victor Stinner в bpo-42260.)Макросы
PyList_SET_ITEM(),PyTuple_SET_ITEM()и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.)Файлы
odictobject.h,parser_interface.h,picklebufobject.h,pyarena.h,pyctype.h,pydebug.h,pyfpe.hиpytime.h(не входящие в ограниченный API) перемещены в каталогInclude/cpython. Эти файлы не следует включать напрямую, поскольку они уже включены вPython.h; см. Файлы для включения. Если они были включены напрямую, рассмотрите включениеPython.hвместо этого. (Автор: Nicholas Sim в bpo-35134.)Используйте флаг типа
Py_TPFLAGS_IMMUTABLETYPEдля создания неизменяемых объектов типа. Не полагайтесь наPy_TPFLAGS_HEAPTYPE, чтобы определить, является ли объект типа изменяемым; вместо этого проверяйте, установлен лиPy_TPFLAGS_IMMUTABLETYPE. (Авторы: Victor Stinner и Erlend E. Aasland в bpo-43908.)Незадокументированная функция
Py_FrozenMainудалена из ограниченного API. Эта функция в основном полезна для пользовательских сборок Python. (Автор: Petr Viktorin в bpo-26241.)
Устарело¶Deprecated
Функция
PyUnicode_InternImmortal()теперь устарела и будет удалена в Python 3.12; используйтеPyUnicode_InternInPlace()вместо неё. (Автор: Victor Stinner в bpo-41692.)
Удалено¶Removed
Удалены функции
Py_UNICODE_str*, работающие со строкамиPy_UNICODE*. (Автор: Inada Naoki в bpo-41123.)Py_UNICODE_strlen: используйтеPyUnicode_GetLength()илиPyUnicode_GET_LENGTHPy_UNICODE_strcat: используйтеPyUnicode_CopyCharacters()илиPyUnicode_FromFormat()Py_UNICODE_strcpy,Py_UNICODE_strncpy: используйтеPyUnicode_CopyCharacters()илиPyUnicode_Substring()Py_UNICODE_strcmp: используйтеPyUnicode_Compare()Py_UNICODE_strncmp: используйтеPyUnicode_Tailmatch()Py_UNICODE_strchr,Py_UNICODE_strrchr: используйтеPyUnicode_FindChar()
Удалена
PyUnicode_GetMax(). Переходите на новые API (PEP 393). (Автор: Inada Naoki в bpo-41103.)Удалена
PyLong_FromUnicode(). Переходите наPyLong_FromUnicodeObject(). (Автор: Inada Naoki в bpo-41103.)Удалено
PyUnicode_AsUnicodeCopy(). ИспользуйтеPyUnicode_AsUCS4Copy()илиPyUnicode_AsWideCharString()(Автор: Inada Naoki, bpo-41103.)Удалена переменная
_Py_CheckRecursionLimit: она заменена наceval.recursion_limitструктурыPyInterpreterState. (Автор: Victor Stinner, bpo-41834.)Удалены недокументированные макросы
Py_ALLOW_RECURSIONиPy_END_ALLOW_RECURSION, а также полеrecursion_criticalструктурыPyInterpreterState. (Автор: Serhiy Storchaka, bpo-41936.)Удалена недокументированная функция
PyOS_InitInterrupts(). При инициализации Python уже неявно устанавливает обработчики сигналов: см.PyConfig.install_signal_handlers. (Автор: Victor Stinner, bpo-41713.)Remove the
PyAST_Validate()function. It is no longer possible to build a AST object (mod_tytype) with the public C API. The function was already excluded from the limited C API (PEP 384). (Contributed by Victor Stinner in bpo-43244.)Удалены заголовочный файл
symtable.hи недокументированные функции:PyST_GetScope()PySymtable_Build()PySymtable_BuildObject()PySymtable_Free()Py_SymtableString()Py_SymtableStringObject()
Функция
Py_SymtableString()по ошибке была частью стабильного ABI, но не могла использоваться, так как заголовочный файлsymtable.hбыл исключён из ограниченного C API.Вместо этого используйте модуль Python
symtable. (Автор: Victor Stinner, bpo-43244.)Удалён
PyOS_ReadlineFunctionPointer()из заголовков ограниченного C API и изpython3.dll(библиотеки, предоставляющей стабильный ABI в Windows). Поскольку функция принимает аргументFILE*, её стабильность ABI не может быть гарантирована. (Автор: Petr Viktorin, bpo-43868.)Удалены заголовочные файлы
ast.h,asdl.hиPython-ast.h. Эти функции были недокументированы и исключены из ограниченного C API. Большинство имён, определённых в этих заголовочных файлах, не имели префиксаPyи поэтому могли создавать конфликты имён. Например,Python-ast.hопределял макросYield, который конфликтовал с именемYield, используемым заголовком Windows<winbase.h>. Вместо этого используйте модуль Pythonast. (Автор: Victor Stinner, bpo-43244.)Удалены функции компилятора и парсера, использующие тип
struct _mod, так как публичный C API для AST был удалён:PyAST_Compile()PyAST_CompileEx()PyAST_CompileObject()PyFuture_FromAST()PyFuture_FromASTObject()PyParser_ASTFromFile()PyParser_ASTFromFileObject()PyParser_ASTFromFilename()PyParser_ASTFromString()PyParser_ASTFromStringObject()
Эти функции были недокументированы и исключены из ограниченного C API. (Автор: Victor Stinner, bpo-43244.)
Удалён заголовочный файл
pyarena.hс функциями:PyArena_New()PyArena_Free()PyArena_Malloc()PyArena_AddPyObject()
Эти функции были недокументированы, исключены из ограниченного C API и использовались только внутри компилятора. (Автор: Victor Stinner, bpo-43244.)
Элемент
PyThreadState.use_tracingудалён для оптимизации Python. (Автор: Mark Shannon, bpo-43760.)
Важная функция безопасности в 3.10.7¶Notable security feature in 3.10.7
Преобразование между int и str по основаниям, отличным от 2 (двоичное), 4, 8 (восьмеричное), 16 (шестнадцатеричное) или 32, таким как основание 10 (десятичное), теперь вызывает ValueError, если количество цифр в строковом представлении превышает лимит, чтобы избежать потенциальных атак типа «отказ в обслуживании» из-за алгоритмической сложности. Это смягчение для CVE 2020-10735. Этот лимит можно настроить или отключить с помощью переменной окружения, флага командной строки или API sys. См. документацию ограничения длины строкового представления целых чисел. Лимит по умолчанию – 4300 цифр в строковом представлении.
Важная функция безопасности в 3.10.8¶Notable security feature in 3.10.8
Устаревший модуль mailcap теперь отказывается внедрять небезопасный текст
(имена файлов, MIME-типы, параметры) в команды оболочки. Вместо использования такого
текста он выдаст предупреждение и будет действовать так, как если бы совпадение не было найдено (или для тестовых команд,
как если бы тест провалился).
(Автор: Petr Viktorin, gh-98966.)
Важные изменения в 3.10.12¶Notable changes in 3.10.12
tarfile¶
Методы извлечения в
tarfileиshutil.unpack_archive()получили новый аргумент filter, позволяющий ограничивать возможности tar, которые могут быть неожиданными или опасными, например создание файлов за пределами целевого каталога. Подробнее см. Extraction filters. В Python 3.12 использование без аргумента filter вызоветDeprecationWarning. В Python 3.14 значение по умолчанию будет изменено на'data'. (Автор: Petr Viktorin в PEP 706.)