Что нового в Python 3.10¶
- Редактор:
Пабло Галиндо Сальгадо
В этой статье описываются новые возможности Python 3.10 по сравнению с версией 3.9. Версия Python 3.10 была выпущена 4 октября 2021 года. Более подробную информацию смотрите в changelog.
Краткое описание - Основные моменты выпуска¶
Новые возможности синтаксиса:
PEP 634, Соответствие структурному образцу: Спецификация
PEP 635, Структурное соответствие шаблону: мотивация и обоснование
PEP 636, Структурное сопоставление с образцом: Учебное пособие
bpo-12782, Контекстные менеджеры, заключенные в круглые скобки, теперь официально разрешены.
Новые возможности в стандартной библиотеке:
PEP 618, Добавьте В zip Дополнительную Проверку Длины.
Улучшения в работе переводчика:
PEP 626, Точные номера строк для отладки и других инструментов.
Новые функции набора текста:
PEP 604, Разрешить запись типов объединений в виде X | Y
PEP 612, Переменные спецификации параметров
PEP 613, Явные псевдонимы типов
PEP 647, Защита определенного пользователем типа
Важные замечания, удаления или ограничения:
Новые возможности¶
Контекстные менеджеры, заключенные в круглые скобки¶
В контекстных менеджерах теперь поддерживается использование заключительных скобок для продолжения в нескольких строках. Это позволяет форматировать большую коллекцию контекстных менеджеров в несколько строк аналогично тому, как это было возможно ранее с помощью инструкций 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 для получения более подробной информации.
(Авторы: Гвидо ван Россум, Пабло Галиндо и Лисандрос Николау в bpo-12782 и bpo-40334.)
Улучшенные сообщения об ошибках¶
Синтаксические ошибки¶
При разборе кода, содержащего незакрытые круглые скобки, интерпретатор теперь включает местоположение незакрытой скобки круглых скобок вместо отображения SyntaxError: неожиданный EOF при разборе или указания на какое-либо неправильное местоположение. Например, рассмотрим следующий код (обратите внимание на незакрытый символ „{„).:
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.
(Авторы: Пабло Галиндо в bpo-42864 и Батухан Таскайя в 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.)
Кортежи без скобок в целях понимания:
>>> {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.)
Ошибки отступа¶
Многие исключения IndentationError
теперь содержат больше контекста относительно того, какой тип блока ожидал появления отступа, включая расположение инструкции:
>>> def foo():
... if lel:
... x = 2
File "<stdin>", line 3
x = 2
^
IndentationError: expected an indented block after 'if' statement in line 2
Ошибки атрибута¶
При печати 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.
Ошибки с именами¶
При выводе 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 предоставляет более точные и надежные номера строк для инструментов отладки, профилирования и покрытия. События трассировки с правильным номером строки генерируются для всех выполняемых строк кода и только для тех строк кода, которые выполняются.
Атрибут f_lineno
объектов frame всегда будет содержать ожидаемый номер строки.
Атрибут co_lnotab
в code objects устарел и будет удален в версии 3.12. Код, который должен преобразовать смещение в номер строки, должен использовать новый метод co_lines()
.
PEP 634: Согласование структурных моделей¶
Добавлено структурное сопоставление шаблонов в виде инструкций match и case для шаблонов с соответствующими действиями. Шаблоны состоят из последовательностей, отображений, примитивных типов данных, а также экземпляров классов. Сопоставление с образцом позволяет программам извлекать информацию из сложных типов данных, разветвлять структуру данных и применять определенные действия, основанные на различных формах данных.
Синтаксис и операции¶
Общий синтаксис сопоставления с образцом таков:
match subject:
case <pattern_1>:
<action_1>
case <pattern_2>:
<action_2>
case <pattern_3>:
<action_3>
case _:
<action_wildcard>
Оператор сопоставления принимает выражение и сравнивает его значение с последовательными шаблонами, представленными в виде одного или нескольких блоков case. В частности, сопоставление с образцом выполняется с помощью:
использование данных с типом и формой (
subject
)вычисление
subject
в оператореmatch
сравнивая объект с каждым шаблоном в
case
утверждении сверху вниз, пока совпадение не будет подтверждено.выполнение действия, связанного с шаблоном подтвержденного совпадения
Если точное совпадение не подтверждено, в качестве совпадающего случая будет использоваться последний случай, подстановочный знак
_
, если он указан. Если точное совпадение не подтверждено и подстановочный случай не существует, весь блок совпадений считается недействительным.
Декларативный подход¶
Читатели, возможно, знают о сопоставлении с шаблоном благодаря простому примеру сопоставления subject (объекта данных) с литералом (шаблоном) с помощью оператора switch, который используется в C, Java или JavaScript (и многих других языках). Часто оператор switch используется для сравнения объекта/выражения с операторами case, содержащими литералы.
Более эффективные примеры сопоставления с образцом можно найти в таких языках, как Scala и Elixir. При структурном сопоставлении с образцом подход является «декларативным» и явно определяет условия (шаблоны), при которых данные должны совпадать.
Хотя «императивная» последовательность инструкций с использованием вложенных операторов «if» может быть использована для выполнения чего-то похожего на сопоставление структурных шаблонов, она менее понятна, чем «декларативный» подход. Вместо этого «декларативный» подход устанавливает условия, которым необходимо соответствовать для получения соответствия, и более удобен для чтения благодаря своим явным шаблонам. Хотя структурное сопоставление с образцом может быть использовано в простейшей форме для сравнения переменной с литералом в операторе case, его истинная ценность для Python заключается в обработке типа и формы объекта.
Простой шаблон: соответствие литералу¶
Давайте рассмотрим этот пример как сопоставление с образцом в его простейшей форме: значение, subject, сопоставляется с несколькими литералами, шаблонами. В приведенном ниже примере status
является subject оператора 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, возвращается сообщение «Я чайник». Если вышеуказанной функции передано значение status
из 500, оператор case с _
будет соответствовать подстановочному знаку, и будет возвращено сообщение «Что-то не так с Интернетом». Обратите внимание на последний блок: имя переменной _
действует как подстановочный знак и гарантирует, что тема всегда будет совпадать. Использование _
необязательно.
Вы можете объединить несколько литералов в один шаблон, используя |
(«или»).:
case 401 | 403 | 404:
return "Not allowed"
Поведение без подстановочного знака¶
Если мы изменим приведенный выше пример, удалив последний блок 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 соответствия может не существовать. Если совпадений не существует, поведение не выполняется. Например, если передано значение status
из 500, операция не выполняется.
Шаблоны с литералом и переменной¶
Шаблоны могут выглядеть как распаковываемые назначения, и шаблон может использоваться для привязки переменных. В этом примере точка данных может быть распакована с учетом ее координат x и y:
# point is an (x, y) tuple
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
.
Шаблоны и классы¶
Если вы используете классы для структурирования своих данных, вы можете использовать в качестве шаблона имя класса, за которым следует список аргументов, напоминающий конструктор. Этот шаблон позволяет преобразовывать атрибуты класса в переменные:
class Point:
x: int
y: int
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")
Паттерны с позиционными параметрами¶
Вы можете использовать позиционные параметры с некоторыми встроенными классами, которые обеспечивают упорядочение своих атрибутов (например, dataclasses). Вы также можете определить конкретное положение атрибутов в шаблонах, установив специальный атрибут __match_args__
в своих классах. Если для него задано значение («x», «y»), то все следующие шаблоны эквивалентны (и все они связывают атрибут y
с переменной var
).:
Point(1, var)
Point(1, y=var)
Point(x=1, y=var)
Point(y=var, x=1)
Вложенные шаблоны¶
Шаблоны могут быть произвольно вложенными. Например, если наши данные представляют собой короткий список точек, их можно сопоставить следующим образом:
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.")
Сложные узоры и подстановочный знак¶
До этого момента в примерах использовался только _
в последнем операторе 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
будет соответствовать („ошибка“, код, 100) и („ошибка“, код, 800).
Охрана¶
Мы можем добавить предложение 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.")
Другие ключевые особенности¶
Несколько других ключевых особенностей:
Подобно распаковке назначений, шаблоны кортежей и списков имеют точно такое же значение и фактически соответствуют произвольным последовательностям. Технически, объектом должна быть последовательность. Поэтому важным исключением является то, что шаблоны не соответствуют итераторам. Кроме того, чтобы избежать распространенной ошибки, шаблоны последовательностей не соответствуют строкам.
Шаблоны последовательностей поддерживают подстановочные знаки:
[x, y, *rest]
и(x, y, *rest)
работают аналогично подстановочным знакам при распаковке заданий. Имя после*
также может быть_
, поэтому(x, y, *_)
соответствует последовательности, состоящей как минимум из двух элементов, без привязки к остальным элементам.Шаблоны отображения:
{"bandwidth": b, "latency": l}
фиксирует значения"bandwidth"
и"latency"
из dict. В отличие от шаблонов последовательности, дополнительные ключи игнорируются. Также поддерживается подстановочный знак**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 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"
¶
Кодировка по умолчанию для TextIOWrapper
и open()
зависит от платформы и языкового стандарта. Поскольку UTF-8 используется на большинстве платформ Unix, пропуск опции encoding
при открытии файлов в формате UTF-8 (например, JSON, YAML, TOML, Markdown) является очень распространенной ошибкой. Например:
# BUG: "rb" mode or encoding="utf-8" should be used.
with open("data.json") as f:
data = json.load(f)
Чтобы найти ошибку такого типа, добавляется необязательный символ EncodingWarning
. Он выводится, если значение sys.flags.warn_default_encoding
равно true и используется кодировка по умолчанию, зависящая от конкретной локали.
для включения предупреждения добавлены опции -X warn_default_encoding
и PYTHONWARNDEFAULTENCODING
.
Смотрите Кодировка текста для получения дополнительной информации.
Другие языковые изменения¶
Тип
int
имеет новый методint.bit_count()
, возвращающий число единиц в двоичном разложении заданного целого числа, также известное как количество населения. (Добавлено Никласом Фиекасом в bpo-29882.)Представления, возвращаемые с помощью
dict.keys()
,dict.values()
иdict.items()
, теперь все имеют атрибутmapping
, который дает объектtypes.MappingProxyType
, заключающий в себе исходный словарь. (Автор: Деннис Суини в bpo-40890.)PEP 618: Функция
zip()
теперь имеет необязательный флагstrict
, который используется для требования, чтобы все повторяемые элементы имели одинаковую длину.Встроенные и расширенные функции, принимающие целочисленные аргументы, больше не принимают
Decimal
s,Fraction
s и другие объекты, которые могут быть преобразованы в целые числа только с потерями (например, которые имеют метод__int__()
, но не имеют метод__index__()
). (Автор - Сергей Сторчака в bpo-37999.)Если
object.__ipow__()
возвращаетNotImplemented
, оператор корректно вернет значенияobject.__pow__()
иobject.__rpow__()
, как и ожидалось. (Добавлено Алексом Шкопом в bpo-38302.)Выражения присваивания теперь можно использовать без скобок в литералах set и понятиях set, а также в индексах последовательностей (но не фрагментах).
Функции имеют новый атрибут
__builtins__
, который используется для поиска встроенных символов при выполнении функции, вместо поиска в__globals__['__builtins__']
. Атрибут инициализируется из__globals__["__builtins__"]
, если он существует, либо из текущих встроенных элементов. (Добавлено Марком Шенноном в bpo-42990.)Были добавлены две новые встроенные функции -
aiter()
иanext()
, чтобы обеспечить асинхронные аналогиiter()
иnext()
соответственно. (Материалы предоставлены Джошуа Бронсоном, Дэниелом Поупом и Джастином Ваном в bpo-31861.)Статические методы (
@staticmethod
) и методы класса (@classmethod
) теперь наследуют атрибуты метода (__module__
,__name__
,__qualname__
,__doc__
,__annotations__
) и имеют новый атрибут__wrapped__
. Более того, статические методы теперь можно вызывать как обычные функции. (Автор Виктор Стиннер в bpo-43682).Аннотации для сложных целей (все, кроме
simple name
целей, определенных с помощью PEP 526), больше не вызывают каких-либо эффектов во время выполнения с помощьюfrom __future__ import annotations
. (Добавлено Батуханом Таскайей в bpo-42737.)Объекты Class и module теперь неактивны - по требованию создаются пустые аннотации. Аннотации сохраняются в
__dict__
объекта для обеспечения обратной совместимости. Это улучшает работу с__annotations__
; для получения дополнительной информации, пожалуйста, ознакомьтесь с Аннотации к лучшим практикам. (Автор Ларри Хастингс в bpo-43901).Аннотации состоят из
yield
,yield from
,await
или именованных выражений, которые теперь запрещены в разделеfrom __future__ import annotations
из-за их побочных эффектов. (Автор - Батухан Таскайя в bpo-42725.)Использование несвязанных переменных,
super()
и других выражений, которые могут повлиять на обработку таблицы символов в качестве аннотаций, теперь не имеет эффекта вfrom __future__ import annotations
. (Добавлено Батуханом Таскайей в bpo-42725.)Хэши значений NaN как типа
float
, так и типаdecimal.Decimal
теперь зависят от идентификации объекта. Раньше они всегда хэшировались до0
, даже если значения NaN не были равны друг другу. Это привело к потенциально квадратичному поведению во время выполнения из-за чрезмерных коллизий хэшей при создании словарей и наборов, содержащих несколько NAN. (Добавлено Раймондом Хеттингером в bpo-43475.)Значение
SyntaxError
(вместоNameError
) будет увеличено при удалении константы__debug__
. (Добавлено Донхи На в bpo-45000.)SyntaxError
исключения теперь имеют атрибутыend_lineno
иend_offset
. Если они не определены, они будут иметь значениеNone
. (Добавлено Пабло Галиндо в bpo-43914.)
Новые модули¶
Никто.
Улучшенные модули¶
асинхронный¶
Добавьте отсутствующий метод connect_accepted_socket()
. (Добавлено Алексом Гренхольмом в bpo-41332.)
аргументированный анализ¶
Вводящая в заблуждение фраза «необязательные аргументы» была заменена на «options» в справке argparse. Некоторые тесты могут потребовать адаптации, если они основаны на точном совпадении выходных данных. (Добавлено Раймондом Хеттингером в bpo-9694.)
массив¶
Метод index()
из array.array
теперь имеет необязательные параметры start и stop. ((Добавлено Андерсом Лоренценом и Закери Спитцем в bpo-31956.)
asynchat, asyncore, smtpd¶
Эти модули были помечены как устаревшие в документации к их модулям, начиная с версии Python 3.6. Теперь ко всем трем этим модулям добавлено значение времени импорта DeprecationWarning
.
базовый уровень 64¶
Добавьте base64.b32hexencode()
и base64.b32hexdecode()
для поддержки кодировки Base32 с расширенным шестнадцатеричным алфавитом.
бдб¶
Добавьте clearBreakpoints()
, чтобы сбросить все установленные точки останова. (Добавлено Ирит Катриэль в bpo-24160.)
разделить пополам¶
Добавлена возможность предоставления функции key API в модуле bisect
. (Добавлено Раймондом Хеттингером в bpo-4356.)
кодеки¶
Добавьте функцию codecs.unregister()
, чтобы отменить регистрацию функции поиска кодеков. (Добавлено Хай Ши в bpo-41842.)
сборники.abc¶
Значения __args__
в parameterized generic для collections.abc.Callable
теперь согласуются с typing.Callable
. collections.abc.Callable
generic теперь выравнивает параметры типа, аналогично тому, что в настоящее время делает 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.aclosing()
для безопасного закрытия асинхронных генераторов и объектов, представляющих асинхронно высвобождаемые ресурсы. (Авторы - Джунги Ким и Джон Бельмонте в статье bpo-41229).
Добавьте поддержку асинхронного контекстного менеджера в contextlib.nullcontext()
. (Добавлено Томом Грингаузом в bpo-41543.)
Добавьте AsyncContextDecorator
для поддержки использования асинхронных контекстных менеджеров в качестве декораторов.
проклятия¶
Расширенные цветовые функции, добавленные в 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.)
классы данных¶
__слоты__¶
Добавлен параметр slots
в dataclasses.dataclass()
декораторе. (Добавлено Юрием Карабасом в bpo-42269)
Поля только для ключевых слов¶
классы данных теперь поддерживают поля, для которых используются только ключевые слова, в сгенерированном методе __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
для отдельных полей, имейте в виду, что существуют правила переупорядочивания полей, поскольку поля, содержащие только ключевые слова, должны следовать за полями, не содержащими только ключевые слова. Более подробную информацию смотрите в полной документации по классам данных.
Вы также можете указать, что все поля, следующие за маркером 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
устарел и будет удален в Python 3.12. Его функциональность для указания сборок пакетов уже была полностью заменена сторонними пакетами setuptools
и packaging
, а большинство других широко используемых API доступны в других частях стандартной библиотеки (таких как platform
, shutil
, subprocess
или sysconfig
). Не планируется переносить какие-либо другие функциональные возможности из distutils
, и приложениям, использующим другие функции, следует планировать создание личных копий кода. Обсуждение приведено в разделе PEP 632.
Команда bdist_wininst
, которая считалась устаревшей в Python 3.8, была удалена. Команда bdist_wheel
теперь рекомендуется для распространения двоичных пакетов в Windows. (Добавлено Виктором Стиннером в bpo-42802.)
самый проверенный¶
Если модуль не определяет __loader__
, вернитесь к __spec__.loader
. (Добавлено Бреттом Кэнноном в bpo-42133.)
кодировки¶
encodings.normalize_encoding()
теперь игнорируются символы, отличные от ASCII. (Добавлено Хай Ши в bpo-39337.)
перечисление¶
Enum
__repr__()
теперь возвращает enum_name.member_name
, а __str__()
теперь возвращает member_name
. Перечисления Stdlib, доступные в качестве констант модуля, имеют значение repr()
из module_name.member_name
. (Добавлено Итаном Фурманом в bpo-40066.)
Добавьте enum.StrEnum
для перечислений, в которых все элементы являются строками. (Добавлено Итаном Фурманом в bpo-41816.)
ввод файла¶
Добавьте параметры encoding и errors в fileinput.input()
и fileinput.FileInput
. (Добавлено Инадой Наоки в bpo-43712.)
fileinput.hook_compressed()
теперь возвращает TextIOWrapper
объект, когда режим равен «r» и файл сжат, как и несжатые файлы. (Добавлено Инадой Наоки в bpo-5758.)
исправитель ошибок¶
Модуль faulthandler
теперь определяет, возникает ли фатальная ошибка во время сбора сборщиком мусора. (Автор: Виктор Стиннер в bpo-44466.)
gc (общий сбор)¶
Добавьте перехватчики аудита для gc.get_objects()
, gc.get_referrers()
и gc.get_referents()
. (Добавлено Пабло Галиндо в bpo-43439.)
глобус¶
Добавьте параметры root_dir и dir_fd в glob()
и iglob()
, которые позволяют указать корневой каталог для поиска. (Добавлено Сергеем Сторчакой в bpo-38144.)
хэшлиб¶
Для модуля hashlib требуется OpenSSL версии 1.1.1 или новее. (Автор: Кристиан Хеймс в PEP 644 и bpo-43669.)
Модуль hashlib имеет предварительную поддержку OpenSSL 3.0.0. (Автор Кристиан Хеймс в bpo-38820 и других выпусках).
Резервный вариант pbkdf2_hmac()
, основанный на чистом Python, устарел. В будущем PBKDF2-HMAC будет доступен только в том случае, если Python будет собран с поддержкой OpenSSL. (Автор: Кристиан Хеймс в bpo-43880.)
hmac (ВМС)¶
Модуль hmac теперь использует внутреннюю реализацию Openssl HMAC. (Добавлено Кристианом Хеймсом в bpo-40645.)
ХОЛОСТОЙ ход и idlelib¶
Заставьте IDLE вызывать sys.excepthook()
(при запуске без „-n“). Пользовательские перехваты ранее игнорировались. (Добавлено Кеном Хилтоном в bpo-43008.)
Измените порядок в диалоговом окне настроек. Разделите вкладку «Общие» на вкладки «Windows» и «Shell/Ed». Переместите источники справки, которые расширяют меню «Справка», на вкладку «Расширения». Освободите место для новых опций и сократите диалоговое окно. Благодаря последнему диалоговое окно лучше подходит для небольших экранов. (Автор: Терри Джан Риди в bpo-40468.) Переместите настройку отступа с вкладки «Шрифт» на новую вкладку «Windows». (Авторы: Марк Роузман и Терри Джан Риди в bpo-33962.)
Приведенные выше изменения были перенесены в техническую версию 3.9.
Добавьте боковую панель командной строки. Переместите основное приглашение («>>>») на боковую панель. Добавьте дополнительные приглашения (»…») на боковую панель. Щелкните левой кнопкой мыши и при необходимости перетащите одну или несколько строк текста, как в случае с боковой панелью с номером строки редактора. При щелчке правой кнопкой мыши после выделения строк текста отображается контекстное меню с надписью «копировать с подсказками». При этом подсказки с боковой панели объединяются со строками из выделенного текста. Эта опция также отображается в контекстном меню для текста. (Добавлено Тал Эйнат в bpo-37903.)
Используйте пробелы вместо символов табуляции для выделения отступов в интерактивном коде. Благодаря этому элементы интерактивного кода «выглядят правильно». Создание такой возможности стало основной мотивацией для добавления боковой панели командной строки. (Автор: Терри Ян Риди в bpo-37892).
Выделите новые soft keywords match
, case
, и _
в инструкциях по сопоставлению с образцом. Однако такое выделение не идеально и в некоторых редких случаях будет некорректным, включая некоторые _
-ы в case
шаблонах. (Добавлено Тал Эйнат в bpo-44010).
Новое в версии обслуживания 3.10.
Примените подсветку синтаксиса к файлам .pyi
. (Авторы - Алекс Уэйгуд и Терри Ян Риди в статье bpo-45447.)
Включите подсказки при сохранении оболочки с входами и выходами. (Автор: Терри Ян Риди в gh-95191.)
importlib.метаданные¶
Соответствие характеристик с importlib_metadata
4.6 (history).
importlib.metadata entry points теперь вы можете выбирать точки входа по группам и названиям с помощью нового класса importlib.metadata.EntryPoints
. Дополнительную информацию об амортизации и использовании смотрите в примечании о совместимости в документации.
Добавлен importlib.metadata.packages_distributions()
для преобразования модулей и пакетов Python верхнего уровня в их importlib.metadata.Distribution
.
проверить¶
Если модуль не определяет __loader__
, вернитесь к __spec__.loader
. (Добавлено Бреттом Кэнноном в 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()
теперь также можно расшифровать аннотации в виде строк. (Добавлено Ларри Хастингсом в bpo-43817.)
итеративные инструменты¶
Добавить itertools.pairwise()
. (Добавлено Раймондом Хеттингером в bpo-38200.)
линейный кэш¶
Если модуль не определяет __loader__
, вернитесь к __spec__.loader
. (Добавлено Бреттом Кэнноном в bpo-42133.)
ос¶
Добавлена поддержка os.cpu_count()
для ОСРВ VxWorks. (Автор - Пэйсин Синь из bpo-41440.)
Добавьте новую функцию os.eventfd()
и связанных с ней помощников, чтобы обернуть системный вызов eventfd2
в Linux. (Автор Кристиан Хеймс в статье bpo-41001).
Добавьте os.splice()
, который позволяет перемещать данные между двумя файловыми дескрипторами без копирования между адресным пространством ядра и адресным пространством пользователя, где один из файловых дескрипторов должен ссылаться на канал. (Добавлено Пабло Галиндо в bpo-41625.)
Добавьте O_EVTONLY
, O_FSYNC
, O_SYMLINK
и O_NOFOLLOW_ANY
для mac OS. (Добавлено Донхи На в bpo-43106.)
os.путь¶
os.path.realpath()
теперь принимает аргумент strict, содержащий только ключевое слово. При значении True
, OSError
вызывается, если путь не существует или встречается цикл символических ссылок. (Автор - Барни Гейл в bpo-43757.)
файл пути¶
Добавьте поддержку фрагментов в PurePath.parents
. (Автор Джошуа Кэннон в bpo-35498.)
Добавьте поддержку отрицательной индексации в PurePath.parents
. (Добавлено Ярославом Панковичем в bpo-21041.)
Добавьте метод Path.hardlink_to
, который заменяет link_to()
. Новый метод имеет тот же порядок аргументов, что и symlink_to()
. (Добавлено Барни Гейлом в bpo-39950.)
pathlib.Path.stat()
и chmod()
теперь принимают аргумент follow_symlinks, содержащий только ключевое слово, для согласованности с соответствующими функциями в модуле os
. (Автор - Барни Гейл в bpo-39906.)
платформа¶
Добавьте platform.freedesktop_os_release()
, чтобы получить идентификатор операционной системы из стандартного файла freedesktop.org os-release. (Добавлено Кристианом Хеймсом в статье bpo-28468.)
печать¶
pprint.pprint()
теперь принимает новый аргумент ключевого слова underscore_numbers
. ((Добавлено sblondon в bpo-42914.)
pprint
теперь можно красиво печатать dataclasses.dataclass
экземпляров. (Добавлено Льюисом Гаулом в bpo-43080.)
py_compile скомпилировать¶
Добавьте опцию --quiet
в интерфейс командной строки py_compile
. (Добавлено Григорием Шевченко в bpo-38731.)
пиклбр¶
Добавьте атрибут end_lineno
к объектам Function
и Class
в дереве, возвращаемом pyclbr.readmodule()
и pyclbr.readmodule_ex()
. Он соответствует существующему (начало) lineno
. (Добавлено Авиралом Шриваставой в bpo-38307.)
откладывать в долгий ящик¶
Модуль shelve
теперь использует pickle.DEFAULT_PROTOCOL
по умолчанию вместо pickle
протокола 3
при создании полок. (Добавлено Закери Спитцем в bpo-34204.)
статистика¶
correlation()
, and linear_regression()
simple bpo-38490 < < < 2>>> functions. (Contributed by Тимофей Володько in < < < 3>>>.)
site¶
Если модуль не определяет __loader__
, вернитесь к __spec__.loader
. (Добавлено Бреттом Кэнноном в bpo-42133.)
socket¶
Исключением socket.timeout
теперь является псевдоним TimeoutError
. (Добавлено Кристианом Хеймсом в bpo-42413.)
Добавлена возможность создавать сокеты MPTCP с помощью IPPROTO_MPTCP
(добавлено Руи Куньей в bpo-43571).
Добавьте опцию IP_RECVTOS
для получения полей типа услуги (ToS) или DSCP/ECN (добавлено Георгом Саутхоффом в bpo-44077).
протокол ssl¶
Для модуля ssl требуется OpenSSL версии 1.1.1 или новее. (Автор: Кристиан Хеймс в PEP 644 и bpo-43669.)
Модуль ssl предварительно поддерживает OpenSSL 3.0.0 и новую опцию OP_IGNORE_UNEXPECTED_EOF
. (Предоставлено Кристианом Хеймсом в 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
, установленные по умолчанию, и поэтому не может предупреждать о повторной установке флага. В deprecation section есть список устаревших функций. (Добавлено Кристианом Хеймсом в bpo-43880.)
Модуль ssl теперь имеет более безопасные настройки по умолчанию. Шифры без прямой секретности или SHA-1 MAC по умолчанию отключены. Уровень безопасности 2 запрещает использование слабых ключей RSA, DH и ECC с уровнем защиты менее 112 бит. SSLContext
По умолчанию используется минимальная версия протокола TLS 1.2. Настройки основаны на исследованиях Хайнека Шлавака. (Автор: Кристиан Хеймс в bpo-43998.)
Устаревшие протоколы SSL 3.0, TLS 1.0 и TLS 1.1 больше официально не поддерживаются. Python не блокирует их активно. Однако параметры сборки OpenSSL, конфигурации дистрибутивов, исправления поставщиков и наборы шифров могут препятствовать успешному установлению связи.
Добавьте параметр timeout в функцию ssl.get_server_certificate()
. (Добавлено Закери Спитцем в bpo-31870.)
Модуль ssl использует типы кучи и многоэтапную инициализацию. (Автор: Кристиан Хеймс в bpo-42333.)
Добавлен новый флаг проверки VERIFY_X509_PARTIAL_CHAIN
. (Добавлено l0x в bpo-40849.)
sqlite3¶
Добавьте события аудита для connect/handle()
, enable_load_extension()
, и load_extension()
. (Добавлено Эрлендом Э. Аасландом в bpo-43762.)
sys¶
Добавьте атрибут sys.orig_argv
: список исходных аргументов командной строки, передаваемых исполняемому файлу Python. (Добавлено Виктором Стиннером в bpo-23427.)
Добавьте sys.stdlib_module_names
, содержащий список имен модулей стандартной библиотеки. (Добавлено Виктором Стиннером в bpo-42955.)
_поток¶
_thread.interrupt_main()
теперь для имитации используется необязательный номер сигнала (по умолчанию по-прежнему используется signal.SIGINT
). (Добавлено Антуаном Питру в bpo-43356.)
нарезание резьбы¶
Добавьте threading.gettrace()
и threading.getprofile()
, чтобы получить функции, заданные threading.settrace()
и threading.setprofile()
соответственно. (Добавлено Марио Корчеро в bpo-42251.)
Добавьте threading.__excepthook__
, чтобы можно было восстановить исходное значение threading.excepthook()
в случае, если для него установлено неправильное или другое значение. (Добавлено Марио Корчеро в bpo-42308.)
обратная связь¶
Функции format_exception()
, format_exception_only()
, и print_exception()
теперь могут принимать объект exception в качестве позиционного аргумента. (Материалы предоставлены Закери Спитцем и Маттиасом Буссонье в bpo-26389.)
типы¶
Повторно ввести классы types.EllipsisType
, types.NoneType
и types.NotImplementedType
, предоставив новый набор типов, легко интерпретируемых средствами проверки типов. (Автор Бас ван Бик в bpo-41810).
печатание¶
Основные изменения приведены в разделе Новые функции, связанные с подсказками по набору текста.
Поведение typing.Literal
было изменено, чтобы соответствовать PEP 586 и соответствовать поведению средств проверки статических типов, указанных в PEP.
Literal
теперь удаляем дублирование параметров.Сравнение на равенство между объектами
Literal
теперь не зависит от порядка.Literal
при сравнении теперь учитываются типы. Например,Literal[0] == Literal[False]
ранее оценивалось какTrue
. Теперь этоFalse
. Чтобы поддержать это изменение, внутренний кэш типов теперь поддерживает дифференциацию типов.Literal
объекты теперь будут генерировать исключениеTypeError
во время сравнения на равенство, если какой-либо из их параметров не соответствует hashable. Обратите внимание, что объявление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
. (Добавлено Себастьяном Риттау в bpo-38291.)
единичный тест¶
Добавьте новый метод assertNoLogs()
в дополнение к существующему assertLogs()
. (Автор Кит Ян Чой в bpo-39385.)
urllib.синтаксический анализ¶
Версии Python, более ранние, чем Python 3.10, позволяли использовать как ;
, так и &
в качестве разделителей параметров запроса в urllib.parse.parse_qs()
и urllib.parse.parse_qsl()
. Из соображений безопасности и в соответствии с новыми рекомендациями W3C это было изменено, чтобы разрешить использование только одного разделительного ключа с &
по умолчанию. Это изменение также затрагивает cgi.parse()
и cgi.parse_multipart()
, поскольку они используют затронутые функции внутри системы. Для получения более подробной информации, пожалуйста, ознакомьтесь с соответствующей документацией. (Материалы предоставлены Адамом Гольдшмидтом, Сентилом Кумараном и Кеном Джином в 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
. (Авторы Джонатан Госсейдж и Закери Спитц в статье bpo-35018).
почтовый импорт¶
Добавьте методы, связанные с PEP 451: find_spec()
, zipimport.zipimporter.create_module()
, и zipimport.zipimporter.exec_module()
. (Автор Бретт Кэннон в bpo-42131.)
Добавьте метод invalidate_caches()
. (Добавлено Десмондом Чонгом в bpo-14678.)
Оптимизация¶
Конструкторы
str()
,bytes()
иbytearray()
теперь работают быстрее (примерно на 30-40% для небольших объектов). (Автор Сергей Сторчака в bpo-41334).Модуль
runpy
теперь импортирует меньше модулей. Время запуска командыpython3 -m module-name
в среднем в 1,4 раза быстрее. В Linuxpython3 -I -m module-name
импортирует 69 модулей в Python 3.9, тогда как в Python 3.10 импортируется только 51 модуль (-18). (Автор - Виктор Стиннер в bpo-41006 и bpo-41718.)В инструкции
LOAD_ATTR
теперь используется новый механизм «кэширования каждого кода операции». Теперь это примерно на 36% быстрее для обычных атрибутов и на 44% быстрее для слотов. (Подготовлено Пабло Галиндо и Юрием Селивановым в bpo-42093 и Гвидо ван Россумом в bpo-42927 на основе идей, первоначально реализованных в PyPy и MicroPython.)При сборке Python с помощью
--enable-optimizations
теперь-fno-semantic-interposition
добавляется как в строку компиляции, так и в строку компоновки. Это ускоряет сборку интерпретатора Python, созданного с помощью--enable-shared
, с помощьюgcc
до 30%. Смотрите this article для получения более подробной информации. (Материалы предоставлены Виктором Стиннером и Пабло Галиндо в bpo-38980.)Используйте новый код управления выходным буфером для модулей
bz2
/lzma
/zlib
и добавьте функцию.readall()
в класс_compression.DecompressReader
. Распаковка bz2 теперь выполняется в 1,09 раза быстрее. ~ в 1,17 раза быстрее, декомпрессия lzma в 1,20 ~ 1,32 раза быстрее,GzipFile.read(-1)
в 1,11 ~ 1,18 раза быстрее. (Автор - Ма Лин, рецензия - Грегори П. Смит, в bpo-41486)При использовании аннотаций в виде строк аннотации-указатели для функций больше не создаются при создании функции. Вместо этого они сохраняются в виде набора строк, и объект function лениво преобразует их в аннотации-указатели по требованию. Эта оптимизация вдвое сокращает процессорное время, необходимое для определения аннотированной функции. (Авторы: Юрий Карабас и Инада Наоки в bpo-42202.)
Функции поиска подстрок, такие как
str1 in str2
иstr2.find(str1)
, теперь иногда используют «двусторонний» алгоритм поиска строк Crochemore & Perrin, чтобы избежать квадратичного поведения в длинных строках. (Автор: Деннис Суини в bpo-41972)Добавьте микрооптимизацию к
_PyType_Lookup()
, чтобы повысить производительность поиска в кэше атрибутов типа в случае частых обращений к кэшу. Это в среднем ускоряет работу интерпретатора в 1,04 раза. (Автор: Дино Виеланд в bpo-43452).Следующие встроенные функции теперь поддерживают более быстрое соглашение о вызове PEP 590 vectorcall:
map()
,filter()
,reversed()
,bool()
иfloat()
. (Материалы предоставлены Донхи На и Йеруном Демейером в статье bpo-43575, bpo-43287, bpo-41922, bpo-41873 и bpo-41870.)BZ2File
производительность улучшена за счет удаления внутреннегоRLock
. Это делает потокBZ2File
небезопасным перед лицом нескольких одновременных операций чтения или записи, точно так же, как всегда были его эквивалентные классы вgzip
иlzma
. (Добавлено Инадой Наоки в bpo-43785.)
Осуждаемый¶
В настоящее время 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. Обратитесь к разделу module changes для получения дополнительной информации.Нецелочисленные аргументы для
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 настоятельно не рекомендует ее использовать. Более подробную информацию смотрите в разделе the SQLite3 docs. Если необходимо использовать общий кэш, откройте базу данных в режиме URL, используя параметр запроса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.name
threading.thread.getName
=>threading.Thread.name
threading.Thread.isDaemon
=>threading.Thread.daemon
threading.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
заменяются наsslSSLContext.minimum_version
иsslSSLContext.maximum_version
.PROTOCOL_SSLv2
,PROTOCOL_SSLv3
,PROTOCOL_SSLv23
,PROTOCOL_TLSv1
,PROTOCOL_TLSv1_1
,PROTOCOL_TLSv1_2
, иPROTOCOL_TLS
являются устаревшими в пользу вместоPROTOCOL_TLS_CLIENT
иPROTOCOL_TLS_SERVER
wrap_socket()
заменяется наssl.SSLContext.wrap_socket()
RAND_pseudo_bytes()
,RAND_egd()
Такие функции NPN, как
ssl.SSLSocket.selected_npn_protocol()
иssl.SSLContext.set_npn_protocols()
, заменяются на LPN.
Функция потоковой отладки (
PYTHONTHREADDEBUG
переменная окружения) устарела в Python 3.10 и будет удалена в Python 3.12. Для этой функции требуется debug build of Python. (Добавлено Виктором Стиннером в bpo-44584.)При импорте из подмодулей
typing.io
иtyping.re
теперь будет генерироватьсяDeprecationWarning
. Эти подмодули будут удалены в будущей версии Python. Все, что относится к этим подмодулям, должно быть импортировано непосредственно изtyping
. (Добавлено Себастьяном Риттау в bpo-38291.)
Удаленный¶
Удалены специальные методы
__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 EOL. Существующие пользователи должны скопировать все классы, которые они используют, в свой код. ((Материалы предоставлены Донхи На и Терри Дж. Риди в bpo-42299.)Удалена функция
PyModule_GetWarningsModule()
, которая теперь была бесполезна из-за того, что модуль_warnings
был преобразован во встроенный модуль в версии 2.6. (Добавлено Хай Ши в bpo-42599.)Удалите устаревшие псевдонимы в Коллекции абстрактных базовых классов из модуля
collections
. (Автор Виктор Стиннер в bpo-37324.)Параметр
loop
был удален из большинства параметровasyncio
high-level API после выхода из употребления в Python 3.8. Причины, стоящие за этим изменением, многогранны:Это упрощает высокоуровневый API.
Функции высокоуровневого API неявно получают цикл обработки событий текущего потока, начиная с версии Python 3.7. В большинстве обычных случаев использования нет необходимости передавать цикл обработки событий API.
Передача цикла обработки событий подвержена ошибкам, особенно при работе с циклами, выполняемыми в разных потоках.
Обратите внимание, что низкоуровневый API по-прежнему будет принимать
loop
. Примеры замены существующего кода приведены в Изменения в Python API.(Авторы: Юрий Карабас, Эндрю Светлов, Юрий Селиванов и Кайл Стэнли в bpo-42392.)
Перенос на Python 3.10¶
В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать внесения изменений в ваш код.
Изменения в синтаксисе Python¶
Предупреждение об устаревании теперь выдается при компиляции ранее допустимого синтаксиса, если за числовым литералом сразу следует ключевое слово (как в
0in x
). В будущих версиях оно будет изменено на синтаксическое предупреждение и, наконец, на синтаксическую ошибку. Чтобы избавиться от предупреждения и сделать код совместимым с будущими версиями, просто добавьте пробел между числовым символом и следующим ключевым словом. (Автор Сергей Сторчака в bpo-43833.)
Изменения в Python API¶
Параметры etype функций
format_exception()
,format_exception_only()
, иprint_exception()
в модулеtraceback
были переименованы в exc. (Материалы предоставлены Закери Спитцем и Маттиасом Буссонье в bpo-26389.)atexit
: При выходе из Python, если обратный вызов, зарегистрированный с помощьюatexit.register()
, завершается ошибкой, его исключение регистрируется в журнале. Ранее регистрировались только некоторые исключения, а последнее исключение всегда автоматически игнорировалось. (Автор: Виктор Стиннер в статье bpo-42639.)collections.abc.Callable
generic теперь сглаживает параметры типа, аналогично тому, что в настоящее время делает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. (Добавлено Кеном Джином в bpo-42195.)socket.htons()
иsocket.ntohs()
теперь увеличиваютOverflowError
вместоDeprecationWarning
, если данный параметр не помещается в 16-разрядное целое число без знака. (Автор: Эрленд Э. Аасланд в bpo-42393.)Параметр
loop
был удален из большинства параметровasyncio
high-level API после выхода из употребления в 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()
вместо этого.(Авторы: Юрий Карабас, Эндрю Светлов, Юрий Селиванов и Кайл Стэнли в bpo-42392.)
Конструктор
types.FunctionType
теперь наследует текущие здания, если в словаре globals нет ключа"__builtins__"
, вместо того, чтобы использовать{"None": None}
в качестве встроенных элементов: то же поведение, что и вeval()
иexec()
функции. На определение функции с помощьюdef function(...): ...
в Python это не влияет, глобальные переменные не могут быть переопределены с помощью этого синтаксиса: он также наследует текущие встроенные функции. (Добавлено Виктором Стиннером в bpo-42990.)
Изменения в 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
теперь представляет собой смещение кода слова вместо простого смещения в строке байт-кода. Это означает, что это число необходимо умножить на 2, чтобы использовать его с API, которые вместо этого ожидают смещения в байтах (например, c:func:PyCode_Addr2Line). Обратите также внимание, чтоf_lasti
элементFrameObject
объектов не считается стабильным: пожалуйста, используйте вместо негоPyFrame_GetLineNumber()
.
Изменения в байт-коде CPython¶
Инструкция
MAKE_FUNCTION
теперь принимает либо dict, либо набор строк в качестве аннотаций функции. (Добавлено Юрием Карабасом и Инадой Наоки в bpo-42202.)
Изменения в сборке¶
PEP 644: Для Python теперь требуется OpenSSL версии 1.1.1 или новее. OpenSSL версии 1.0.2 больше не поддерживается. (Добавлено Кристианом Хеймсом в bpo-43669.)
Для сборки Python теперь требуются функции C99:c:func: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¶
PEP 652: Поддержание стабильного ABI¶
Теперь явно определен стабильный ABI (двоичный интерфейс приложения) для модулей расширения или встраивания Python. Стабильность C API описаны гарантии стабильности C API и ABI, а также рекомендации по использованию стабильного ABI.
Новые возможности¶
Результат
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()
функция: аналогична:c:func:PyModule_AddObject, но не воруйте ссылку на значение успеха. (Добавлено Виктором Стиннером в bpo-1635741.)Добавьте функции
Py_NewRef()
иPy_XNewRef()
, чтобы увеличить количество ссылок на объект и вернуть сам объект. (Автор Виктор Стиннер в bpo-42262.)Функции
PyType_FromSpecWithBases()
иPyType_FromModuleAndSpec()
теперь принимают один класс в качестве аргумента bases. (Добавлено Сергеем Сторчакой в bpo-42423.)Функция
PyType_FromModuleAndSpec()
теперь принимает нулевой интервалtp_doc
. (Добавлено Хай Ши в bpo-41832.)Функция
PyType_GetSlot()
может принимать static types. (Добавлено Хай Ши и Петром Викториным в bpo-41073.)Добавьте новую функцию
PySet_CheckExact()
в C-API, чтобы проверить, является ли объект экземпляромset
, но не экземпляром подтипа. (Добавлено Пабло Галиндо в bpo-43277.)Добавьте
PyErr_SetInterruptEx()
, который позволяет передавать номер сигнала для имитации. (Добавлено Антуаном Питру в bpo-43356.)Ограниченный C API теперь поддерживается, если Python is built in debug mode (если определен макрос
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
). (Добавлено Виктором Стиннером в bpo-43688.)Добавьте функцию
Py_Is(x, y)
, чтобы проверить, является ли объект x объектом y, аналогичноx is y
в Python. Добавьте также функцииPy_IsNone()
,Py_IsTrue()
,Py_IsFalse()
, чтобы проверить, является ли объект, соответственно,None
синглтоном,True
синглтон илиFalse
синглтон. (Автор: Виктор Стиннер в bpo-43753.)Добавьте новые функции для управления сборщиком мусора из кода на C:
PyGC_Enable()
,PyGC_Disable()
,PyGC_IsEnabled()
. Эти функции позволяют активировать, деактивировать и запрашивать состояние сборщика мусора из кода на C без необходимости импорта модуляgc
.Добавьте новый флаг типа
Py_TPFLAGS_DISALLOW_INSTANTIATION
, чтобы запретить создание экземпляров типа. (Автор Виктор Стиннер в bpo-43916.)Добавьте новый флаг типа:c:macro:Py_TPFLAGS_IMMUTABLETYPE для создания объектов неизменяемого типа: атрибуты типа нельзя ни устанавливать, ни удалять. (Авторы: Виктор Стиннер и Эрленд Э. Аасланд в bpo-43908.)
Перенос на Python 3.10¶
Теперь необходимо определить макрос
PY_SSIZE_T_CLEAN
для использования форматовPyArg_ParseTuple()
иPy_BuildValue()
, которые используют#
:es#
,et#
,s#
,u#
,y#
,z#
,U#
иZ#
. Смотрите Анализ аргументов и построение значений и PEP 353. (Автор Виктор Стиннер в 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
(Автор: Виктор Стиннер в bpo-39573.)
Вызов
PyDict_GetItem()
без удержания GIL был разрешен по историческим причинам. Это больше не разрешено. (Добавлено Виктором Стиннером в bpo-40839.)PyUnicode_FromUnicode(NULL, size)
иPyUnicode_FromStringAndSize(NULL, size)
теперь поднимаютDeprecationWarning
. ИспользуйтеPyUnicode_New()
, чтобы выделить объект в Юникоде без исходных данных. (Добавлено Инадой Наоки в bpo-36346.)Частная структура
_PyUnicode_Name_CAPI
API PyCapsuleunicodedata.ucnhash_CAPI
была перенесена во внутренний C API. (Добавлено Виктором Стиннером в bpo-42157).Py_GetPath()
,Py_GetPrefix()
,Py_GetExecPrefix()
,Py_GetProgramFullPath()
,Py_GetPythonHome()
иPy_GetProgramName()
функции теперь вернитеNULL
, если вызывалось ранееPy_Initialize()
(до инициализации Python). Используйте новый Конфигурация инициализации Python API, чтобы получить Конфигурация пути Python. (Автор Виктор Стиннер в bpo-42260.)Макросы
PyList_SET_ITEM()
,PyTuple_SET_ITEM()
иPyCell_SET()
больше нельзя использовать в качестве lvalue или r-значения. Например,x = PyList_SET_ITEM(a, b, c)
иPyList_SET_ITEM(a, b, c) = x
теперь завершаются ошибкой компилятора. Это предотвращает ошибки, подобныеif (PyList_SET_ITEM (a, b, c) < 0) ...
test. (Материалы предоставлены Закери Спитцем и Виктором Стиннером в bpo-30459.)Неограниченные файлы API
odictobject.h
,parser_interface.h
,picklebufobject.h
,pyarena.h
,pyctype.h
,pydebug.h
,pyfpe.h
иpytime.h
были перемещены в каталогInclude/cpython
. Эти файлы не должны включаться напрямую, поскольку они уже включены вPython.h
; см. Включаемые файлы. Если они были включены напрямую, рассмотрите возможность включения вместо нихPython.h
. (Автор: Николас Сим в bpo-35134.)Используйте флаг типа
Py_TPFLAGS_IMMUTABLETYPE
для создания объектов неизменяемого типа. Не полагайтесь наPy_TPFLAGS_HEAPTYPE
, чтобы определить, является ли объект изменяемым; проверьте, установлен ли вместо этогоPy_TPFLAGS_IMMUTABLETYPE
. (Материалы предоставлены Виктором Стиннером и Эрлендом Э. Аасландом в bpo-43908.)Недокументированная функция
Py_FrozenMain
была удалена из ограниченного API. Эта функция в основном полезна для пользовательских сборок Python. (Добавлено Петром Викториным в bpo-26241).
Осуждаемый¶
Функция
PyUnicode_InternImmortal()
теперь признана устаревшей и будет удалена в Python 3.12: вместо нее используйтеPyUnicode_InternInPlace()
. (Автор: Виктор Стиннер в bpo-41692.)
Удаленный¶
Удалены функции
Py_UNICODE_str*
, манипулирующие строкамиPy_UNICODE*
. (Добавлено Инадой Наоки в bpo-41123.)Py_UNICODE_strlen
: используйтеPyUnicode_GetLength()
илиPyUnicode_GET_LENGTH
Py_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()
. Пожалуйста, перейдите на новый (PEP 393) API. (Добавлено Инадой Наоки в bpo-41103.)Удалено
PyLong_FromUnicode()
. Пожалуйста, перенесите на:c:func:PyLong_FromUnicodeObject. (Добавлено Инадой Наоки в bpo-41103.)Удалено
PyUnicode_AsUnicodeCopy()
. Пожалуйста, используйте : c:func:PyUnicode_AsUCS4Copy илиPyUnicode_AsWideCharString()
(Добавлено Инадой Наоки в bpo-41103.)Удалена переменная
_Py_CheckRecursionLimit
: она заменена наceval.recursion_limit
из структурыPyInterpreterState
. (Добавлено Виктором Стиннером в bpo-41834.)Удалены недокументированные макросы
Py_ALLOW_RECURSION
иPy_END_ALLOW_RECURSION
, а также полеrecursion_critical
структурыPyInterpreterState
. (Автор - Сергей Сторчака в bpo-41936.)Удалена недокументированная функция
PyOS_InitInterrupts()
. При инициализации Python уже неявно устанавливаются обработчики сигналов: см. : c:member:PyConfig.install_signal_handlers. (Добавлено Виктором Стиннером в bpo-41713.)Удалите функцию
PyAST_Validate()
. Больше невозможно создавать объект AST (типmod_ty
) с помощью общедоступного C API. Функция уже была исключена из ограниченного CAPI (PEP 384). (Автор: Виктор Стиннер в статье 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
. (Добавлено Виктором Стиннером в bpo-43244.)Удалите
PyOS_ReadlineFunctionPointer()
из ограниченных заголовков C API и изpython3.dll
, библиотеки, которая обеспечивает стабильный ABI в Windows. Поскольку функция принимает аргументFILE*
, стабильность ABI не может быть гарантирована. (Автор: Петр Викторин в статье bpo-43868.)Удалите файлы заголовков
ast.h
,asdl.h
, иPython-ast.h
. Эти функции не были задокументированы и исключены из ограниченного CAPI. Большинство имен, определенных этими заголовочными файлами, не имели префиксаPy
и поэтому могли создавать конфликты имен. Например,Python-ast.h
определил макросYield
, который конфликтовал с именемYield
, используемым в заголовке Windows<winbase.h>
. Вместо этого используйте модуль Pythonast
. (Автор: Виктор Стиннер в bpo-43244.)Удалите функции компилятора и синтаксического анализатора, используя тип
struct _mod
, поскольку общедоступный AST C API был удален:PyAST_Compile()
PyAST_CompileEx()
PyAST_CompileObject()
PyFuture_FromAST()
PyFuture_FromASTObject()
PyParser_ASTFromFile()
PyParser_ASTFromFileObject()
PyParser_ASTFromFilename()
PyParser_ASTFromString()
PyParser_ASTFromStringObject()
Эти функции не были задокументированы и были исключены из ограниченного CAPI. (Автор Виктор Стиннер в статье bpo-43244).
Удалите заголовочный файл
pyarena.h
с функциями:PyArena_New()
PyArena_Free()
PyArena_Malloc()
PyArena_AddPyObject()
Эти функции были недокументированы, исключены из ограниченного CAPI и использовались компилятором только для внутренних целей. (Автор: Виктор Стиннер в bpo-43244.)
Элемент
PyThreadState.use_tracing
был удален для оптимизации Python. (Добавлено Марком Шенноном в bpo-43760.)
Примечательная функция безопасности в версии 3.10.7¶
Преобразование между int
и str
в основаниях, отличных от 2 (двоичных), 4, 8 (восьмеричных), 16 (шестнадцатеричных) или 32, таких как основание 10 (десятичных), теперь приводит к появлению ValueError
, если число количество цифр в виде строки превышает допустимый предел, чтобы избежать потенциальных атак типа «отказ в обслуживании» из-за сложности алгоритма. Это ограничение для CVE-2020-10735. Это ограничение можно настроить или отключить с помощью переменной среды, флага командной строки или sys
API. Смотрите документацию по integer string conversion length limitation. Ограничение по умолчанию составляет 4300 цифр в виде строки.
Примечательная функция безопасности в версии 3.10.8¶
Устаревший модуль mailcap
теперь отказывается вводить небезопасный текст (имена файлов, MIMEtypes, параметры) в команды оболочки. Вместо того, чтобы использовать такой текст, он будет предупреждать и действовать так, как если бы совпадение не было найдено (или для тестовых команд, как если бы тест не был выполнен). (Добавлено Петром Викториным в gh-98966.)
Заметные изменения в версии 3.10.12¶
архивный файл¶
Методы извлечения в
tarfile
иshutil.unpack_archive()
имеют новый аргумент a filter, который позволяет ограничить возможности tar, которые могут быть неожиданными или опасными, например, создание файлов за пределами каталога назначения. Подробнее смотрите в Экстракционные фильтры. В Python 3.12 при использовании без аргумента filter будет отображатьсяDeprecationWarning
. В Python 3.14 значение по умолчанию будет изменено на'data'
. (Автор: Петр Викторин в PEP 706.)