Решил делать свою ОС хотел запустить а тут код не работает. Может кто-нибудь может подсказать как это решить?
import os
import tkinter as tk
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
f1 = GradientFrame(self, borderwidth=1, relief="sunken")
f2 = GradientFrame(self, "green", "blue", borderwidth=1, relief="sunken")
f1.pack(side="top", fill="both", expand=True)
f2.pack(side="bottom", fill="both", expand=True)
class GradientFrame(tk.Canvas):
'''A gradient frame which uses a canvas to draw the background'''
def __init__(self, parent, color1="red", color2="black", **kwargs):
tk.Canvas.__init__(self, parent, **kwargs)
self._color1 = color1
self._color2 = color2
self.bind("<Configure>", self._draw_gradient)
def _draw_gradient(self, event=None):
'''Draw the gradient'''
self.delete("gradient")
width = self.winfo_width()
height = self.winfo_height()
limit = width
(r1,g1,b1) = self.winfo_rgb(self._color1)
(r2,g2,b2) = self.winfo_rgb(self._color2)
r_ratio = float(r2-r1) / limit
g_ratio = float(g2-g1) / limit
b_ratio = float(b2-b1) / limit
for i in range(limit):
nr = int(r1 + (r_ratio * i))
ng = int(g1 + (g_ratio * i))
nb = int(b1 + (b_ratio * i))
color = "#%4.4x%4.4x%4.4x" % (nr,ng,nb)
self.create_line(i,0,i,height, tags=("gradient",), fill=color)
self.lower("gradient")
if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
def startos():
installed = os.path.exists('IntanxOS')
if installed == False:
input("Welcome to IntanxOS! Let's config your computer")
global name
global password
name = input("Choose your username: ")
password = input("Hello " + name + " choose your password: ")
else:
print("Login")
print(str(name))
print(str(password)
startos()
Содержание:
- Улучшения в сообщении об ошибке
SyntaxErrors
;- Новые сообщения для исключений
SyntaxError
;
- Новые сообщения для исключений
- Улучшения в сообщении
IndentationErrors
; - Улучшения в сообщении
AttributeErrors
; - Улучшения в сообщении
NameErrors
.
Улучшения в сообщении исключения SyntaxErrors
.
При синтаксическом анализе кода, который содержит незакрытые скобки, с версии Python 3.10, вместо отображения сообщения SyntaxError: unexpected 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.
Исключения 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
Новые сообщения для исключений SyntaxError
.
Для исключений SyntaxError
добавлено значительное количество новых специализированных сообщений. Вот некоторые из наиболее примечательных:
Отсутствие двоеточия :
перед блоком:
>>> if rocket.position > event_horizon # File "<stdin>", line 1 # if rocket.position > event_horizon # ^ # SyntaxError: expected ':'
Кортеж без скобок в выражении-генератора:
>>> {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?
Отсутствуют запятые в литералах коллекции и между выражениями:
>>> items = { ... x: 1, ... y: 2 ... z: 3, # File "<stdin>", line 3 # y: 2 # ^ # SyntaxError: invalid syntax. Perhaps you forgot a comma?
Несколько типов исключений без скобок:
>>> try: ... build_dyson_sphere() ... except NotEnoughScienceError, NotEnoughResourcesError: # File "<stdin>", line 3 # except NotEnoughScienceError, NotEnoughResourcesError: # ^ # SyntaxError: multiple exception types must be parenthesized
Отсутствует двоеточие :
и/или значение ключа в словарях:
>>> 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
Блок try
без except
или finally
:
>>> try: ... x = 2 ... something = 3 # File "<stdin>", line 3 # something = 3 # ^^^^^^^^^ # SyntaxError: expected 'except' or 'finally' block
Использование =
вместо ==
при сравнении:
>>> 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 '='?
Использование *
в f-строках:
>>> f"Black holes {*all_black_holes} and revelations" # File "<stdin>", line 1 # (*all_black_holes) # ^ # SyntaxError: f-string: cannot use starred expression here
Улучшения в сообщении об ошибке 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?
Предупреждение. Обратите внимание, что это не сработает, если для отображения ошибки не вызывается `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?
Предупреждение. Обратите внимание, что это не сработает, если для отображения ошибки не вызывается `PyErr_Display(). Это может произойти при использовании какой-либо другой пользовательской функции отображения ошибок. Например, это распространенный сценарий в IPython.
- Релиз
-
3.10.6
- Дата
-
октября 19, 2022
- Редактор
-
Пабло Галиндо Сальгадо
В этой статье рассказывается о новых возможностях в 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 613, Явные псевдонимы типов
-
PEP 612, Переменные спецификации параметров
Важные устаревания, удаления или ограничения:
-
PEP 644, Требуется OpenSSL 1.1.1 или новее
-
PEP 632, Утратить модуль distutils.
-
PEP 623, Устаревает и готовится к удалению члена wstr в PyUnicodeObject.
-
PEP 624, Удалить API кодировщика Py_UNICODE
-
PEP 597, Добавить необязательное предупреждение о кодировке (EncodingWarning)
Новые возможности¶
Менеджеры по контексту¶
Теперь поддерживается использование заключительных круглых скобок для продолжения в нескольких строках в контекстных менеджерах. Это позволяет форматировать длинную коллекцию контекстных менеджеров в несколько строк подобно тому, как это было возможно ранее с операторами импорта. Например, все эти примеры теперь действительны:
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).
Улучшенные сообщения об ошибках¶
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.
(При участии Пабло Галиндо из 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).
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()
не вызывается для отображения ошибки, что может произойти, если используется какая-то другая пользовательская функция отображения ошибок. Это распространенный сценарий в некоторых REPL, таких как 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()
не вызывается для отображения ошибки, что может произойти, если используется какая-то другая пользовательская функция отображения ошибок. Это распространенный сценарий в некоторых REPL, таких как IPython.
PEP 626: Точные номера строк для отладки и других инструментов¶
PEP 626 обеспечивает более точные и надежные номера строк для инструментов отладки, профилирования и покрытия. События трассировки с правильным номером строки генерируются для всех выполняемых строк кода и только для выполняемых строк кода.
Атрибут f_lineno
объектов фрейма всегда будет содержать ожидаемый номер строки.
Атрибут co_lnotab
для объектов кода устарел и будет удален в версии 3.12. Код, которому необходимо преобразовать смещение в номер строки, должен использовать новый метод co_lines()
вместо этого.
PEP 634: Структурное сопоставление шаблонов¶
Структурное сопоставление шаблонов было добавлено в виде оператора match statement и оператора case statements шаблонов с соответствующими действиями. Шаблоны состоят из последовательностей, отображений, примитивных типов данных, а также экземпляров классов. Сопоставление шаблонов позволяет программам извлекать информацию из сложных типов данных, разветвляться по структуре данных и применять определенные действия на основе различных форм данных.
Синтаксис и операции¶
Общий синтаксис сопоставления шаблонов таков:
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
сверху вниз до тех пор, пока не будет подтверждено совпадение.выполнение действия, связанного с шаблоном подтвержденного совпадения
Если точное совпадение не подтверждено, в качестве совпадающего регистра будет использоваться последний регистр, подстановочный символ
_
, если он указан. Если точное совпадение не подтверждено, а регистр подстановочного знака не существует, то весь блок совпадения не работает.
Декларативный подход¶
Читатели могут знать о сопоставлении шаблонов на простом примере сопоставления субъекта (объекта данных) с литералом (шаблоном) с помощью оператора switch, встречающегося в C, Java или JavaScript (и многих других языках). Часто оператор switch используется для сравнения объекта/выражения с операторами case, содержащими литералы.
Более мощные примеры сопоставления шаблонов можно найти в таких языках, как Scala и Elixir. При структурном сопоставлении шаблонов подход является «декларативным» и в явном виде определяет условия (шаблоны), которым должны соответствовать данные.
Хотя «императивная» серия инструкций с использованием вложенных операторов «если» может быть использована для достижения чего-то похожего на структурное сопоставление шаблонов, она менее понятна, чем «декларативный» подход. Вместо этого в «декларативном» подходе указываются условия, которые необходимо выполнить для соответствия, и он более читабелен благодаря явным образцам. Хотя структурное сопоставление шаблонов можно использовать в самой простой форме, сравнивая переменную с литералом в операторе case, его истинная ценность для Python заключается в обработке типа и формы объекта.
Простой шаблон: совпадение с литералом¶
Давайте рассмотрим этот пример как сопоставление шаблонов в его простейшей форме: значение, субъект, сопоставляется с несколькими литералами, шаблонами. В приведенном ниже примере status
является субъектом оператора сопоставления. Шаблоны — это каждый из операторов 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")
Шаблоны с позиционными параметрами¶
Вы можете использовать позиционные параметры с некоторыми встроенными классами, которые обеспечивают упорядочивание своих атрибутов (например, классы данных). Вы также можете определить определенную позицию для атрибутов в шаблонах, установив специальный атрибут __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
будет соответствовать („error“, code, 100) и („error“, code, 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"
из диктанта. В отличие от шаблонов последовательности, дополнительные ключи игнорируются. Также поддерживается подстановочный знак**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()
зависит от платформы и локали. Поскольку на большинстве Unix-платформ используется UTF-8, пропуск опции 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). -
Выражения присваивания теперь можно использовать без депарсетов в литералах множеств и пониманиях множеств, а также в индексах последовательности (но не в срезах).
-
Функции имеют новый атрибут
__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). -
Объекты классов и модулей теперь лениво создают пустые массивы аннотаций по требованию. Пакеты аннотаций хранятся в
__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).
Новые модули¶
-
Пока нет.
Улучшенные модули¶
asyncio¶
Добавьте недостающий метод connect_accepted_socket()
. (Внесено Алексом Грёнхольмом в bpo-41332).
argparse¶
Ошибочная фраза «optional arguments» была заменена на «options» в справке argparse. Некоторые тесты могут потребовать адаптации, если они полагаются на точное совпадение вывода. (Внесено Раймондом Хеттингером в bpo-9694).
массив¶
Метод index()
в array.array
теперь имеет необязательные параметры start и stop. (Вклад Андерса Лоренцена и Закери Спитца в bpo-31956).
asynchat, asyncore, smtpd¶
Эти модули были помечены как устаревшие в документации по модулям начиная с Python 3.6. Теперь во все три модуля добавлено время импорта DeprecationWarning
.
base64¶
Добавьте base64.b32hexencode()
и base64.b32hexdecode()
для поддержки кодировки Base32 с расширенным шестнадцатеричным алфавитом.
bdb¶
Добавьте clearBreakpoints()
для сброса всех установленных точек останова. (Внесено Ирит Катриэль в bpo-24160).
биссектриса¶
Добавлена возможность предоставления функции ключ к 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¶
Добавьте менеджер контекста contextlib.aclosing()
для безопасного закрытия асинхронных генераторов и объектов, представляющих асинхронно освобождаемые ресурсы. (Вклад внесли Joongi Kim и John Belmonte в 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).
dataclasses¶
__слоты__¶
Добавлен параметр slots
в декораторе dataclasses.dataclass()
. (Внесено Юрием Карабасом в bpo-42269)
Поля только для ключевых слов¶
dataclasses теперь поддерживает поля, для которых в генерируемом методе __init__ используется только ключевое слово. Существует несколько способов указания полей, доступных только по ключевому слову.
Можно сказать, что каждое поле содержит только ключевые слова:
from dataclasses import dataclass @dataclass(kw_only=True) class Birthday: name: str birthday: datetime.date
Оба параметра name
и birthday
являются параметрами только ключевого слова для сгенерированного метода __init__.
Вы можете указать только ключевые слова для каждого поля:
from dataclasses import dataclass @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¶
Весь пакет distutils
является устаревшим и будет удален в Python 3.12. Его функциональность для указания сборок пакетов уже полностью заменена сторонними пакетами setuptools
и packaging
, а большинство других часто используемых API доступны в других местах стандартной библиотеки (например, platform
, shutil
, subprocess
или sysconfig
). Не планируется перенос каких-либо других функций из distutils
, и приложения, использующие другие функции, должны планировать создание частных копий кода. Для обсуждения обратитесь к разделу PEP 632.
Команда bdist_wininst
, устаревшая в Python 3.8, была удалена. Команда bdist_wheel
теперь рекомендуется для распространения бинарных пакетов на Windows. (Вклад Виктора Стиннера в bpo-42802).
doctest¶
Когда модуль не определяет __loader__
, возвращайтесь к __spec__.loader
. (Внесено Бреттом Кэнноном в bpo-42133).
кодировки¶
encodings.normalize_encoding()
теперь игнорирует символы, отличные от символов ASCII. (Внесено Хай Ши в bpo-39337).
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).
глобус¶
Добавьте параметры 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 и другие вопросы).
Чисто питоновский откат pbkdf2_hmac()
устарел. В будущем PBKDF2-HMAC будет доступен только тогда, когда Python будет собран с поддержкой OpenSSL. (Внесено Кристианом Хаймсом в bpo-43880).
hmac¶
Модуль hmac теперь использует внутреннюю реализацию HMAC от OpenSSL. (Внесено Кристианом Хаймсом из bpo-40645).
IDLE и idlelib¶
Заставить IDLE вызывать sys.excepthook()
(при запуске без „-n“). Пользовательские крючки ранее игнорировались. (Внесено Кеном Хилтоном в bpo-43008).
Перестройте диалог настроек. Разделите вкладку Общие на вкладки Windows и Shell/Ed. Переместите источники справки, которые расширяют меню Справка, на вкладку Расширения. Освободите место для новых опций и сократите диалог. Благодаря последнему диалог лучше подходит для маленьких экранов. (Внесено Терри Яном Риди в bpo-40468.) Переместите настройку отступов с вкладки Шрифт на новую вкладку Windows. (Внесено Марком Розманом и Терри Джен Риди в bpo-33962).
Вышеуказанные изменения были перенесены в поддерживающий релиз 3.9.
Добавьте боковую панель Shell. Переместите основную подсказку („>>>“) на боковую панель. Добавить вторичные подсказки (“…“) на боковую панель. Щелчок левой кнопкой мыши и дополнительное перетаскивание выделяет одну или несколько строк текста, как и в боковой панели номеров строк редактора. При щелчке правой кнопкой мыши после выделения строк текста появляется контекстное меню «Копировать с подсказками». Это позволяет скопировать подсказки из боковой панели вместе со строками выделенного текста. Эта опция также появляется в контекстном меню для текста. (Внесено Талем Эйнатом из bpo-37903).
Используйте пробелы вместо табуляции для отступа интерактивного кода. Это позволяет интерактивным записям кода «выглядеть правильно». Создание такой возможности было основной мотивацией для добавления боковой панели оболочки. (Внесено Терри Яном Риди в bpo-37892).
Выделите новые soft keywords match
, case
и _
в операторах сопоставления шаблонов. Однако, эта подсветка не совершенна и в некоторых редких случаях, включая некоторые _
-s в шаблонах case
, будет некорректной. (Внесено Талем Эйнатом в bpo-44010).
Новое в выпусках технического обслуживания 3.10.
Применять подсветку синтаксиса к файлам .pyi. (Вклад внесли Алекс Уэйгуд и Терри Ян Риди в bpo-45447).
Включить подсказки при сохранении Shell с входами и выходами. (Внесено Терри Яном Риди в gh-95191).
importlib.metadata¶
Паритет с 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).
Add inspect.get_annotations()
, который безопасно вычисляет аннотации, определенные для объекта. Она позволяет обойти причуды доступа к аннотациям для различных типов объектов и делает очень мало предположений об объекте, который она рассматривает. inspect.get_annotations()
также может корректно разгруппировать строковые аннотации. inspect.get_annotations()
теперь считается лучшей практикой для доступа к аннотациям dict, определенным для любого объекта Python; для получения дополнительной информации о лучших практиках работы с аннотациями смотрите Лучшие методы работы с аннотациями. Соответственно, inspect.signature()
, inspect.Signature.from_callable()
и inspect.Signature.from_function()
теперь вызывают inspect.get_annotations()
для получения аннотаций. Это означает, что inspect.signature()
и inspect.Signature.from_callable()
теперь могут также разгруппировывать строковые аннотации. (Внесено Ларри Гастингсом в bpo-43817).
itertools¶
Добавьте itertools.pairwise()
. (Внесено Раймондом Хеттингером в bpo-38200).
linecache¶
Когда модуль не определяет __loader__
, возвращайтесь к __spec__.loader
. (Внесено Бреттом Кэнноном в bpo-42133).
os¶
Добавьте поддержку os.cpu_count()
для VxWorks RTOS. (Внесено Peixing Xin в bpo-41440).
Добавьте новую функцию os.eventfd()
и соответствующие помощники для обертывания системного вызова eventfd2
в Linux. (Внесено Кристианом Хаймсом в bpo-41001).
Добавьте os.splice()
, который позволяет перемещать данные между двумя файловыми дескрипторами без копирования между адресным пространством ядра и адресным пространством пользователя, где один из файловых дескрипторов должен ссылаться на трубу. (Внесено Пабло Галиндо в bpo-41625).
Добавьте O_EVTONLY
, O_FSYNC
, O_SYMLINK
и O_NOFOLLOW_ANY
для macOS. (Вклад Донг-Хи На в bpo-43106).
os.path¶
os.path.realpath()
теперь принимает строгий аргумент только для ключевого слова. Если установлено значение True
, OSError
будет вызвано, если путь не существует или встречается цикл симлинка. (Внесено Барни Гейлом в bpo-43757).
pathlib¶
Добавьте поддержку срезов в 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.pprint()
теперь принимает новый аргумент в виде ключевого слова underscore_numbers
. (Внесено sblondon в bpo-42914).
pprint
теперь может красиво печатать экземпляры dataclasses.dataclass
. (Внесено Льюисом Галлом в bpo-43080).
py_compile¶
Добавьте опцию --quiet
в интерфейс командной строки py_compile
. (Внесено Григорием Шевченко в bpo-38731).
pyclbr¶
Добавьте атрибут end_lineno
к объектам Function
и Class
в дереве, возвращаемом pyclbr.readline()
и pyclbr.readline_ex()
. Он совпадает с существующим (начальным) lineno
. (Внесено Авиралом Шриваставой в bpo-38307).
полка¶
Модуль shelve
теперь использует pickle.DEFAULT_PROTOCOL
по умолчанию вместо pickle
протокола 3
при создании полок. (Внесено Закери Спитцем в bpo-34204).
статистика¶
Добавьте функции covariance()
, Пирсона correlation()
и простые linear_regression()
. (Внесено Тимотеушем Влодзько в bpo-38490).
сайт¶
Когда модуль не определяет __loader__
, возвращайтесь к __spec__.loader
. (Внесено Бреттом Кэнноном в bpo-42133).
розетка¶
Исключение socket.timeout
теперь является псевдонимом TimeoutError
. (Внесено Кристианом Хаймсом в bpo-42413).
Добавьте возможность создания MPTCP сокетов с помощью IPPROTO_MPTCP
(Внесено Rui Cunha в 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 использует heap-типы и многофазную инициализацию. (Вклад Кристиана Хаймса в 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¶
_thread.interrupt_main()
теперь принимает необязательный номер сигнала для моделирования (по умолчанию по-прежнему signal.SIGINT
). (Внесено Антуаном Питру в bpo-43356).
нарезание резьбы¶
Добавьте threading.gettrace()
и threading.getprofile()
для получения функций, заданных threading.settrace()
и threading.setprofile()
соответственно. (Внесено Марио Корчеро в bpo-42251).
Добавьте threading.__excepthook__
для возможности восстановления исходного значения threading.excepthook()
в случае, если оно установлено в нерабочее или другое значение. (Внесено Марио Корчеро в bpo-42308).
traceback¶
Функции format_exception()
, format_exception_only()
и print_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).
unittest¶
Добавьте новый метод assertNoLogs()
в дополнение к существующему assertLogs()
. (Внесено Kit Yan Choi в bpo-39385).
urllib.parse¶
Версии 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 newline n
, r
и tab t
удаляются из URL парсером в urllib.parse
, предотвращая такие атаки. Символы удаления управляются новой переменной уровня модуля urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE
. (См. bpo-43882)
xml¶
Добавьте класс LexicalHandler
в модуль xml.sax.handler
. (Вклад Джонатана Госсаджа и Закери Спитца в bpo-35018).
zipimport¶
Добавьте методы, связанные с 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 раза быстрее. В Linux модульpython3 -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.09x ~ 1.17x быстрее, декомпрессия lzma в 1.20x ~ 1.32x быстрее,GzipFile.read(-1)
в 1.11x ~ 1.18x быстрее. (Внесено Ма Лином, рецензировано Грегори П. Смитом, в bpo-41486) -
При использовании аннотаций в строковом виде аннотационные матрицы для функций больше не создаются при создании функции. Вместо этого они хранятся в виде кортежа строк, а объект функции лениво преобразует их в дикту аннотаций по требованию. Эта оптимизация вдвое сокращает процессорное время, необходимое для определения аннотированной функции. (Вклад Юрия Карабаса и Инады Наоки в bpo-42202).
-
Функции поиска подстрок, такие как
str1 in str2
иstr2.find(str1)
, теперь иногда используют алгоритм поиска строк «Two-Way» Крошмора и Перрина, чтобы избежать квадратичного поведения на длинных строках. (Внесено Деннисом Суини в bpo-41972) -
Добавьте микрооптимизацию в
_PyType_Lookup()
для улучшения производительности поиска в кэше атрибутов типов в распространенном случае попадания в кэш. Это делает интерпретатор в среднем в 1,04 раза быстрее. (Внесено Дино Вьеландом в bpo-43452). -
Следующие встроенные функции теперь поддерживают более быстрое соглашение о вызове векторных вызовов PEP 590:
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 в качестве планируемой версии удаления (они начали подниматьDeprecationWarning
в предыдущих версиях Python). (Внесено Бреттом Кэнноном в 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). -
asyncio.get_event_loop()
теперь выдает предупреждение об устаревании, если нет запущенного цикла событий. В будущем это будет псевдонимget_running_loop()
. Функцииasyncio
, которые неявно создают объектыFuture
илиTask
, теперь выдают предупреждение об устаревании, если нет запущенного цикла событий и не передан явный аргумент loop:ensure_future()
,wrap_future()
,gather()
,shield()
,as_completed()
и конструкторыFuture
,Task
,StreamReader
,StreamReaderProtocol
. (Внесено Сергеем Сторчакой в bpo-39529). -
Недокументированная встроенная функция
sqlite3.enable_shared_cache
теперь является устаревшей и планируется к удалению в Python 3.12. Ее использование настоятельно не рекомендуется в документации SQLite3. См. раздел the SQLite3 docs для получения более подробной информации. Если необходимо использовать общий кэш, откройте базу данных в режиме 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.name
-
threading.thread.getName
=>threading.Thread.name
-
threading.Thread.isDaemon
=>threading.Thread.daemon
-
threading.Thread.setDaemon
=>threading.Thread.daemon
(Предоставлено Jelle Zijlstra из 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()
-
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. Для этой функции требуется 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
. -
Удалены функции Public 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. (Внесено Hai Shi в bpo-42599). -
Удалите устаревшие псевдонимы для Коллекции Абстрактные базовые классы из модуля
collections
. (Внесено Виктором Стиннером в bpo-37324). -
Параметр
loop
был удален из большинстваasyncio
„high-level API после того, как он был устаревшим в Python 3.8. Мотивация этого изменения многогранна:-
Это упрощает высокоуровневый API.
-
Начиная с Python 3.7 функции в API высокого уровня неявно получают цикл событий текущего потока. В большинстве обычных случаев использования нет необходимости передавать цикл событий в API.
-
Передача циклов событий чревата ошибками, особенно если речь идет о циклах, выполняющихся в разных потоках.
Обратите внимание, что низкоуровневый API по-прежнему будет принимать
loop
. Примеры замены существующего кода смотрите в Изменения в API Python.(При участии Юрия Карабаса, Андрея Светлова, Юрия Селиванова и Кайла Стэнли в bpo-42392).
-
Перенос на Python 3.10¶
В этом разделе перечислены ранее описанные изменения и другие исправления, которые могут потребовать внесения изменений в ваш код.
Изменения в синтаксисе языка Python¶
-
Предупреждение об устаревании теперь выдается при компиляции ранее допустимого синтаксиса, если за числовым литералом сразу следует ключевое слово (как в
0in x
). В будущих выпусках оно будет заменено на предупреждение о синтаксисе и, наконец, на синтаксическую ошибку. Чтобы избавиться от предупреждения и сделать код совместимым с будущими версиями, просто добавьте пробел между числовым литералом и следующим за ним ключевым словом. (Внесено Сергеем Сторчакой в bpo-43833).
Изменения в API Python¶
-
Параметры 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
теперь наследует текущие builtins, если словарь globals не имеет ключа"__builtins__"
, а не использует{"None": None}
в качестве builtins: такое же поведение для функцийeval()
иexec()
. Определение функции с помощьюdef function(...): ...
в Python не затрагивается, глобальные функции не могут быть переопределены с помощью этого синтаксиса: они также наследуют текущие встроенные функции. (Вклад Виктора Стиннера в bpo-42990).
Изменения в API языка C¶
-
Функции 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, которые ожидают смещение байта (например,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).
-
Функции C99
snprintf()
иvsnprintf()
теперь необходимы для сборки Python. (Внесено Виктором Стиннером в 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).
Изменения в API C¶
PEP 652: Поддержание стабильной ПВБ¶
Стабильный ABI (Application Binary Interface) для модулей расширения или встраивания Python теперь определен в явном виде. C API Стабильность описывает гарантии стабильности C API и ABI, а также лучшие практики использования Stable ABI.
(Внесено Петром Викторином в PEP 652 и bpo-43795).
Новые возможности¶
-
Результат
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()
к ограниченному API языка C. (Внесено Алексом Гейнором в bpo-41784). -
Добавьте функцию
PyModule_AddObjectRef()
: аналогичноPyModule_AddObject()
, но не крадите ссылку на значение при успехе. (Внесено Виктором Стиннером в bpo-1635741). -
Добавьте функции
Py_NewRef()
иPy_XNewRef()
для увеличения количества ссылок на объект и возврата объекта. (Внесено Виктором Стиннером в bpo-42262). -
Функции
PyType_FromSpecWithBases()
иPyType_FromModuleAndSpec()
теперь принимают один класс в качестве аргумента bases. (Внесено Сергеем Сторчакой в bpo-42423). -
Функция
PyType_FromModuleAndSpec()
теперь принимает слот NULLtp_doc
. (Внесено Хай Ши в bpo-41832). -
Функция
PyType_GetSlot()
может принимать static types. (Вклад Хай Ши и Петра Викторина в bpo-41073). -
Добавьте в C-API новую функцию
PySet_CheckExact()
для проверки, является ли объект экземпляром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). -
Добавьте новые функции для управления сборщиком мусора из Си-кода:
PyGC_Enable()
,PyGC_Disable()
,PyGC_IsEnabled()
. Эти функции позволяют активировать, деактивировать и запрашивать состояние сборщика мусора из Си-кода без необходимости импортировать модульgc
. -
Добавьте новый флаг типа
Py_TPFLAGS_DISALLOW_INSTANTIATION
для запрета создания экземпляров типов. (Внесено Виктором Стиннером в bpo-43916). -
Добавьте новый флаг типа
Py_TPFLAGS_IMMUTABLETYPE
для создания объектов неизменяемого типа: атрибуты типа не могут быть ни установлены, ни удалены. (Вклад Виктора Стиннера и Эрленда Э. Аасланда в bpo-43908).
Перенос на Python 3.10¶
-
Макрос
PY_SSIZE_T_CLEAN
теперь должен быть определен для использования форматовPyArg_ParseTuple()
иPy_BuildValue()
, которые используют#
:es#
,et#
,s#
,u#
,y#
,z#
,U#
иZ#
. См. Parsing arguments and building values и 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()
для выделения объекта Unicode без начальных данных. (Внесено Инадой Наоки в bpo-36346). -
Приватная структура
_PyUnicode_Name_CAPI
из PyCapsule APIunicodedata.ucnhash_CAPI
была перенесена во внутренний C API. (Внесено Виктором Стиннером в bpo-42157). -
Функции
Py_GetPath()
,Py_GetPrefix()
,Py_GetExecPrefix()
,Py_GetProgramFullPath()
,Py_GetPythonHome()
иPy_GetProgramName()
теперь возвращаютNULL
, если вызваны доPy_Initialize()
(до инициализации Python). Используйте новую функцию Python Initialization Configuration API для получения Python Path Configuration.. (Внесено Виктором Стиннером в bpo-42260). -
Макросы
PyList_SET_ITEM()
,PyTuple_SET_ITEM()
иPyCell_SET()
больше не могут использоваться в качестве l-значения или r-значения. Например,x = PyList_SET_ITEM(a, b, c)
иPyList_SET_ITEM(a, b, c) = x
теперь приводят к ошибке компилятора. Это предотвращает ошибки вроде тестаif (PyList_SET_ITEM (a, b, c) < 0) ...
. (Вклад Закери Спитца и Виктора Стиннера в bpo-30459). -
Нелимитированные файлы API
odictobject.h
,parser_interface.h
,picklebufobject.h
,pyarena.h
,pyctype.h
,pydebug.h
,pyfpe.h
иpytime.h
были перемещены в каталогInclude/cpython
. Эти файлы не должны быть включены напрямую, так как они уже включены вPython.h
: Include Files. Если они были включены напрямую, подумайте о включении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()
. Пожалуйста, перейдите наPyLong_FromUnicodeObject()
. (Внесено Инадой Наоки в bpo-41103). -
Удалено
PyUnicode_AsUnicodeCopy()
. Пожалуйста, используйтеPyUnicode_AsUCS4Copy()
илиPyUnicode_AsWideCharString()
(Внесено Inada Naoki в 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 уже неявно устанавливает обработчики сигналов: смотритеPyConfig.install_signal_handlers
. (Внесено Виктором Стиннером в bpo-41713). -
Удалите функцию
PyAST_Validate()
. Больше невозможно построить объект AST (типmod_ty
) с помощью общедоступного C API. Функция уже была исключена из ограниченного C API (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
. Эти функции были недокументированы и исключены из ограниченного API языка C. Большинство имен, определенных этими заголовочными файлами, не имели префикса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()
Эти функции были недокументированы и исключены из ограниченного API языка C. (Внесено Виктором Стиннером в bpo-43244).
-
-
Удалите заголовочный файл
pyarena.h
с функциями:-
PyArena_New()
-
PyArena_Free()
-
PyArena_Malloc()
-
PyArena_AddPyObject()
Эти функции были недокументированы, исключены из ограниченного API C и использовались только внутри компилятора. (Внесено Виктором Стиннером в bpo-43244).
-
-
Член
PyThreadState.use_tracing
был удален для оптимизации Python. (Внесено Марком Шенноном в bpo-43760).
Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.
В новой версии разработчики языка добавили параметризованные диспетчеры контекста. Они позволяют форматировать длинные коллекции диспетчеров контекста в несколько строк. Ранее это можно было реализовать через 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 ): ...
Сообщения об ошибках стали умнее. Улучшили SyntaxErrors, IndentationErrors, AttributeErrors и NameErrors. Они выводят более точное описание проблемы. Например, в прошлых версиях Python SyntaxError для следующего кода возникло бы такое сообщение об ошибке:
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
А в версии 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
Дебагер стал более точным и надёжным. Стандарт PEP 626 добавил в Python номера строк для отладки, профилирования и мониторящих инструментов.
PEP 634 привнёс структурное соответствие шаблонов. Это позволяет вытаскивать информацию из сложных типов данных и выполнять действия для определённых форматов. Синтаксис состоит из match/case-выражения:
match subject: case <pattern_1>: <action_1> case <pattern_2>: <action_2> case <pattern_3>: <action_3> case _: <action_wildcard>
PEP 604 добавил новый оператор — объединение типов. Он используется для выражений «либо тип X, либо Y» и заменяет typing.Union. Например, ниже представлены старая и новая версии:
def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
def square(number: int | float) -> int | float: return number ** 2
PEP 613 ввёл TypeAlias. Он позволяет объявлять псевдонимы для типов более явно:
StrCache: TypeAlias = 'Cache[str]' # a type alias LOG_PREFIX = 'LOG[DEBUG]' # a module constant
Подробное описание всех изменений можно прочитать на официальном сайте Python.
Вот как на это отреагировали пользователи Reddit:
«Оператор объединения типов — отвал башки».
«Я думал, что выйдет Python 4. Теперь, получается, нужно ждать ещё несколько лет».
«А Я ВСЁ ЕЩЁ УЧУ PYTHON 3.9!!!»
Учись бесплатно:
вебинары по программированию, маркетингу и дизайну.
Участвовать
Школа дронов для всех
Учим программировать беспилотники и управлять ими.
Узнать больше
SyntaxError
— это ошибка, которая легко может ввести в ступор начинающего программиста. Стоит забыть одну запятую или не там поставить кавычку и Python наотрез откажется запускать программу. Что ещё хуже, по выводу в консоль сложно сообразить в чём дело. Выглядят сообщения страшно и непонятно. Что с этим делать — не ясно. Вот неполный список того, что можно встретить:
SyntaxError: invalid syntax
SyntaxError: EOL while scanning string literal
SyntaxError: unexpected EOF while parsing
Эта статья о том, как справиться с синтаксической ошибкой SyntaxError
. Дочитайте её до конца и получите безотказный простой алгоритм действий, что поможет вам в трудную минуту — ваш спасательный круг.
Работать будем с программой, которая выводит на экран список учеников. Её код выглядит немного громоздко и, возможно, непривычно. Если не всё написанное вам понятно, то не отчаивайтесь, чтению статьи это не помешает.
students = [
['Егор', 'Кузьмин'],
['Денис', 'Давыдов'],
]
for first_name, last_name in students:
label = 'Имя ученика: {first_name} {last_name}'.format(
first_name = first_name
last_name = last_name
)
print(label)
Ожидается примерно такой результат в консоли:
$ python script.py
Имя ученика: Егор Кузьмин
Имя ученика: Денис Давыдов
Но запуск программы приводит к совсем другому результату. Скрипт сломан:
$ python script.py
File "script.py", line 9
last_name = last_name
^
SyntaxError: invalid syntax
Ошибки в программе бывают разные и каждой нужен свой особый подход. Первым делом внимательно посмотрите на вывод программы в консоль. На последней строчке написано SyntaxError: invalid syntax
. Если эти слова вам не знакомы, то обратитесь за переводом к Яндекс.Переводчику:
SyntaxError: недопустимый синтаксис
SyntaxError: неверный синтаксис
Первое слово SyntaxError
Яндекс не понял. Помогите ему и разделите слова пробелом:
Syntax Error: invalid syntax
Синтаксическая ошибка: неверный синтаксис
Теория. Синтаксические ошибки
Программирование — это не магия, а Python — не волшебный шар. Он не умеет предсказывать будущее, у него нет доступа к секретным знаниями, это просто автомат, это программа. Узнайте как она работает, как ищет ошибки в коде, и тогда легко найдете эффективный способ отладки. Вся необходимая теория собрана в этом разделе, дочитайте до конца.
SyntaxError
— это синтаксическая ошибка. Она случается очень рано, еще до того, как Python запустит программу. Вот что делает компьютер, когда вы запускаете скрипт командой python script.py
:
- запускает программу
python
python
считывает текст из файлаscript.py
python
превращает текст программы в инструкцииpython
исполняет инструкции
Синтаксическая ошибка SyntaxError
возникает на четвёртом этапе в момент, когда Python разбирает текст программы на понятные ему компоненты. Сложные выражения в коде он разбирает на простейшие инструкции. Вот пример кода и инструкции для него:
person = {'name': 'Евгений'}
Инструкции:
- создать строку
'Евгений'
- создать словарь
- в словарь добавить ключ
'name'
со значением'Евгений'
- присвоить результат переменной
person
SyntaxError
случается когда Python не смог разбить сложный код на простые инструкции. Зная это, вы можете вручную разбить код на инструкции, чтобы затем проверить каждую из них по отдельности. Ошибка прячется в одной из инструкций.
1. Найдите поломанное выражение
Этот шаг сэкономит вам кучу сил. Найдите в программе сломанный участок кода. Его вам предстоит разобрать на отдельные инструкции. Посмотрите на вывод программы в консоль:
$ python script.py
File "script.py", line 9
last_name = last_name
^
SyntaxError: invalid syntax
Вторая строчка сообщает: File "script.py", line 9
— ошибка в файле script.py
на девятой строчке. Но эта строка является частью более сложного выражения, посмотрите на него целиком:
label = 'Имя ученика: {first_name} {last_name}'.format(
first_name = first_name
last_name = last_name
)
2. Разбейте выражение на инструкции
В прошлых шагах вы узнали что сломан этот фрагмент кода:
label = 'Имя ученика: {first_name} {last_name}'.format(
first_name = first_name
last_name = last_name
)
Разберите его на инструкции:
- создать строку
'Имя ученика: {first_name} {last_name}'
- получить у строки метод
format
- вызвать функцию с двумя аргументами
- результат присвоить переменной
label
Так выделил бы инструкции программист, но вот Python сделать так не смог и сломался. Пора выяснить на какой инструкции нашла коса на камень.
Теперь ваша задача переписать код так, чтобы в каждой строке программы исполнялось не более одной инструкции из списка выше. Так вы сможете тестировать их по отдельности и облегчите себе задачу. Так выглядит отделение инструкции по созданию строки:
# 1. создать строку
template = 'Имя ученика: {first_name} {last_name}'
label = template.format(
first_name = first_name
last_name = last_name
)
Сразу запустите код, проверьте что ошибка осталась на прежнему месте. Приступайте ко второй инструкции:
# 1. создать строку
template = 'Имя ученика: {first_name} {last_name}'
# 2. получить у строки метод
format = template.format
label = format(
first_name = first_name
last_name = last_name
)
Строка format = template.format
создает новую переменную format
и кладёт в неё функцию. Да, да, это не ошибка! Python разрешает класть в переменные всё что угодно, в том числе и функции. Новая переменная переменная format
теперь работает как обычная функция, и её можно вызвать: format(...)
.
Снова запустите код. Ошибка появится внутри format
. Под сомнением остались две инструкции:
- вызвать функцию с двумя аргументами
- результат присвоить переменной
label
Скорее всего, Python не распознал вызов функции. Проверьте это, избавьтесь от последней инструкции — от создания переменной label
:
# 1. создать строку
template = 'Имя ученика: {first_name} {last_name}'
# 2. получить у строки метод
format = template.format
# 3. вызвать функцию
format(
first_name = first_name
last_name = last_name
)
Запустите код. Ошибка снова там же — внутри format
. Выходит, код вызова функции написан с ошибкой, Python не смог его превратить в инструкцию.
3. Проверьте синтаксис вызова функции
Теперь вы знаете что проблема в коде, вызывающем функцию. Можно помедитировать еще немного над кодом программы, пройтись по нему зорким взглядом еще разок в надежде на лучшее. А можно поискать в сети примеры кода для сравнения.
Запросите у Яндекса статьи по фразе “Python синтаксис функции”, а в них поищите код, похожий на вызов format
и сравните. Вот одна из первых статей в поисковой выдаче:
- Функции в Python
Уверен, теперь вы нашли ошибку. Победа!