Що нового в Python 3.10¶
- редактор:
Pablo Galindo Salgado
У цій статті пояснюється нові функції в Python 3.10 порівняно з 3.9. Python 3.10 було випущено 4 жовтня 2021 року. Щоб отримати повну інформацію, перегляньте журнал змін.
Підсумок – основні моменти випуску¶
Нові функції синтаксису:
PEP 634, Зіставлення структурних шаблонів: Специфікація
PEP 635, Зіставлення структурних шаблонів: мотивація та обґрунтування
PEP 636, Зіставлення структурних шаблонів: підручник
bpo-12782, Менеджери контексту в дужках тепер офіційно дозволені.
Нові можливості стандартної бібліотеки:
PEP 618, Додайте опціональну перевірку довжини до zip.
Покращення перекладача:
PEP 626, точні номери рядків для налагодження та інших інструментів.
Нові функції набору тексту:
PEP 604, Дозволити запис типів об’єднань як X | Ю
PEP 612, Змінні специфікації параметрів
PEP 613, Явні псевдоніми типу
PEP 647, User-Defined Type Guards
Важливі застарілі, видалення або обмеження:
Нові можливості¶
Менеджери контексту в дужках¶
Тепер підтримується використання круглих дужок для продовження в кількох рядках у контекстних менеджерах. Це дозволяє форматувати довгу колекцію контекстних менеджерів у кількох рядках подібним чином, як це було раніше можливо за допомогою операторів імпорту. Наприклад, тепер дійсні всі ці приклади:
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 ':'
(Contributed by Pablo Galindo in 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?
(Contributed by Pablo Galindo in bpo-43017.)
Відсутні коми в літералах колекції та між виразами:
>>> items = { ... x: 1, ... y: 2 ... z: 3, File "<stdin>", line 3 y: 2 ^ SyntaxError: invalid syntax. Perhaps you forgot a comma?
(Contributed by Pablo Galindo in bpo-43822.)
Кілька типів винятків без дужок:
>>> try: ... build_dyson_sphere() ... except NotEnoughScienceError, NotEnoughResourcesError: File "<stdin>", line 3 except NotEnoughScienceError, NotEnoughResourcesError: ^ SyntaxError: multiple exception types must be parenthesized
(Contributed by Pablo Galindo in 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
(Contributed by Pablo Galindo in bpo-43823.)
блоки
try
без блоківexcept
абоfinally
:>>> try: ... x = 2 ... something = 3 File "<stdin>", line 3 something = 3 ^^^^^^^^^ SyntaxError: expected 'except' or 'finally' block
(Contributed by Pablo Galindo in 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 '='?
(Contributed by Pablo Galindo in 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
(Contributed by Pablo Galindo in 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 надає більш точні та надійні номери рядків для інструментів налагодження, профілювання та покриття. Події трасування з правильним номером рядка генеруються для всіх виконаних рядків коду та лише для рядків коду, які виконуються.
The f_lineno
attribute of frame objects will always contain the
expected line number.
The co_lnotab
attribute of
code objects is deprecated and
will be removed in 3.12.
Code that needs to convert from offset to line number should use the new
co_lines()
method instead.
PEP 634: Зіставлення структурних шаблонів¶
Зіставлення структурних шаблонів було додано у формі операторів відповідності та операторів case шаблонів із пов’язаними діями. Патерни складаються з послідовностей, відображень, примітивних типів даних, а також екземплярів класу. Зіставлення шаблонів дозволяє програмам отримувати інформацію зі складних типів даних, розгалужувати структуру даних і застосовувати певні дії на основі різних форм даних.
Синтаксис та операції¶
Загальний синтаксис зіставлення шаблонів:
match subject:
case <pattern_1>:
<action_1>
case <pattern_2>:
<action_2>
case <pattern_3>:
<action_3>
case _:
<action_wildcard>
Інструкція збігу приймає вираз і порівнює його значення з послідовними шаблонами, поданими як один або більше блоків регістру. Зокрема, зіставлення шаблонів працює за допомогою:
використання даних із типом і формою (
тема
)оцінка
підмета
вmatch
заявіпорівняння суб’єкта з кожним шаблоном у операторі
case
зверху вниз, доки відповідність не буде підтверджено.виконання дії, пов’язаної з шаблоном підтвердженого збігу
Якщо точний збіг не підтверджено, останній регістр, символ підстановки
_
, якщо він наданий, буде використано як відповідний регістр. Якщо точний збіг не підтверджено, а регістр символів підстановки не існує, весь блок збігів є безопераційним.
Декларативний підхід¶
Читачі можуть знати про зіставлення шаблонів на простому прикладі зіставлення суб’єкта (об’єкта даних) з літералом (шаблоном) за допомогою оператора switch, знайденого в C, Java чи JavaScript (і багатьох інших мовах). Часто оператор switch використовується для порівняння об’єкта/виразу з операторами case, що містять літерали.
Більш потужні приклади зіставлення шаблонів можна знайти в таких мовах, як Scala та Elixir. При зіставленні структурних шаблонів підхід є «декларативним» і явно визначає умови (шаблони) для збігу даних.
Хоча «імперативна» серія інструкцій із використанням вкладених операторів «if» може бути використана для виконання чогось подібного до зіставлення структурного шаблону, вона менш зрозуміла, ніж «декларативний» підхід. Натомість «декларативний» підхід визначає умови, які необхідно виконати для збігу, і його легше читати через його явні шаблони. У той час як зіставлення структурних шаблонів можна використовувати в його найпростішій формі, порівнюючи змінну з літералом у операторі 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"
Якщо наведеній вище функції передається статус
418, повертається «Я чайник». Якщо наведеній вище функції передано статус
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 збіг може не існувати. Якщо відповідності немає, поведінка є безопераційною. Наприклад, якщо передано статус
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)
, і його можна вважати розширенням літерального шаблону, показаного вище. Наступні два шаблони поєднують літерал і змінну, а змінна зв’язує значення з теми (точка
). Четвертий шаблон фіксує два значення, що робить його концептуально подібним до призначення розпакування (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. Символ узагальнення можна використовувати в більш складних шаблонах, наприклад ('помилка', код, _)
. Наприклад:
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
до шаблону, відомого як «guard». Якщо guard false, 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.)If
object.__ipow__()
returnsNotImplemented
, the operator will correctly fall back toobject.__pow__()
andobject.__rpow__()
as expected. (Contributed by Alex Shkop in 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.)Анотації для складних цілей (усі, окрім цілей
простих імен
, визначених PEP 526) більше не викликають жодних ефектів під час виконання зfrom __future__ import anotations
. (Надано Batuhan Taskaya в bpo-42737.)Об’єкти класів і модулів тепер відкладено створюють порожні анотації dicts на вимогу. Анотації dicts зберігаються в об’єкті
__dict__
для зворотної сумісності. Це покращує найкращі методи роботи з__annotations__
; для отримання додаткової інформації див. Рекомендації щодо анотацій. (Надано Ларрі Гастінгсом у bpo-43901.)Анотації, що складаються з
yield
,yield from
,await
або іменовані вирази тепер заборонені вfrom __future__ import анотаціях
через їхні побічні ефекти. (Надано Batuhan Taskaya в bpo-42725.)Використання незв’язаних змінних,
super()
та інших виразів, які можуть змінити обробку таблиці символів як анотацій, тепер стає неефективним уfrom __future__ import anotations
. (Надано Batuhan Taskaya в bpo-42725.)Хеші значень NaN як типу
float
, так і типуdecimal.Decimal
тепер залежать від ідентичності об’єкта. Раніше вони завжди хешувалися до0
, навіть якщо значення NaN не дорівнюють одне одному. Це спричинило потенційно квадратичну поведінку під час виконання через надмірні хеш-колізії під час створення словників і наборів, що містять кілька NaN. (Надав Реймонд Геттінгер у bpo-43475.)A
SyntaxError
(instead of aNameError
) will be raised when deleting the__debug__
constant. (Contributed by Donghee Na in bpo-45000.)Винятки
SyntaxError
тепер мають атрибутиend_lineno
іend_offset
. Вони будутьNone
, якщо не визначено. (Надав Пабло Галіндо в bpo-43914.)
Нові модулі¶
None.
Покращені модулі¶
asyncio¶
Додайте відсутній метод connect_accepted_socket()
. (Надав Алекс Грьонхольм у bpo-41332.)
argparse¶
Оманливу фразу «необов’язкові аргументи» було замінено на «параметри» в довідці argparse. Деякі тести можуть вимагати адаптації, якщо вони покладаються на точну вихідну відповідність. (Надав Реймонд Геттінгер у bpo-9694.)
масив¶
Метод index()
array.array
тепер має додаткові параметри start і stop. (Надано Андерсом Лоренценом і Закері Шпітцем у bpo-31956.)
asynchat, asyncore, smtpd¶
Починаючи з Python 3.6, ці модулі позначені як застарілі в документації модулів. До всіх цих трьох модулів тепер додано DeprecationWarning
під час імпорту.
база64¶
Додайте base64.b32hexencode()
і base64.b32hexdecode()
для підтримки кодування Base32 із розширеним шістнадцятковим алфавітом.
bdb¶
Додайте clearBreakpoints()
, щоб скинути всі встановлені точки зупину. (Надано Іріт Катріель у bpo-24160.)
ділимо навпіл¶
Додано можливість надання функції key для API в модулі bisect
. (Надав Реймонд Геттінгер у bpo-4356.)
кодеки¶
Додайте функцію codecs.unregister()
, щоб скасувати реєстрацію функції пошуку кодеків. (Надав Хай Ши в bpo-41842.)
колекції.abc¶
__args__
параметризованого загального для 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()
, щоб безпечно закривати асинхронні генератори та об’єкти, що представляють асинхронно звільнені ресурси. (Надано Джунгі Кімом і Джоном Бельмонте в 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__¶
Додано параметр 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, field
@dataclass
class Birthday:
name: str
birthday: datetime.date = field(kw_only=True)
Тут лише день народження
є лише ключовим словом. Якщо ви встановлюєте 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
Here, z
and t
are keyword-only parameters, while x
and
y
are not.
(Contributed by Eric V. Smith in 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.)
enum¶
Enum
__repr__()
now returns enum_name.member_name
and
__str__()
now returns member_name
. Stdlib enums available as
module constants have a repr()
of module_name.member_name
.
(Contributed by Ethan Furman in bpo-40066.)
Add enum.StrEnum
for enums where all members are strings.
(Contributed by Ethan Furman in bpo-41816.)
введення файлу¶
Додайте параметри encoding і errors у fileinput.input()
і fileinput.FileInput
. (Надано Інадою Наокі в bpo-43712.)
fileinput.hook_compressed()
тепер повертає об’єкт TextIOWrapper
, коли mode має значення «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 та інших випусках.)
Резервна версія чистого Python 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.)
Виділіть нові м’які ключові слова match
, case
і _
в операторах зіставлення шаблонів. Однак це підсвічування не є ідеальним і буде неправильним у деяких рідкісних випадках, включаючи деякі _
-s у шаблонах case
. (Надав Тал Ейнат у bpo-44010.)
Нове у випусках обслуговування 3.10.
Apply syntax highlighting to .pyi
files. (Contributed by Alex
Waygood and Terry Jan Reedy in bpo-45447.)
Include prompts when saving Shell with inputs and outputs. (Contributed by Terry Jan Reedy in gh-95191.)
importlib.metadata¶
Парність функцій із importlib_metadata
4.6 (історія).
точки входу importlib.metadata тепер забезпечують кращий досвід для вибору точок входу за групою та назвою за допомогою нового класу 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()
тепер вважається найкращою практикою для доступу до 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.)
лінійний кеш¶
Якщо модуль не визначає __loader__
, поверніться до __spec__.loader
. (Надано Бреттом Кенноном у bpo-42133.)
ос¶
Додайте підтримку os.cpu_count()
для VxWorks RTOS. (Надано Peixing Xin у bpo-41440.)
Додайте нову функцію os.eventfd()
і відповідні помічники, щоб завершити системний виклик eventfd2
у Linux. (Надав Крістіан Хеймс у bpo-41001.)
Додайте os.splice()
, який дозволяє переміщувати дані між двома файловими дескрипторами без копіювання між адресним простором ядра та адресним простором користувача, де один із файлових дескрипторів має посилатися на канал. (Надав Пабло Галіндо в bpo-41625.)
Add O_EVTONLY
, O_FSYNC
, O_SYMLINK
and O_NOFOLLOW_ANY
for macOS.
(Contributed by Donghee Na in bpo-43106.)
os.path¶
os.path.realpath()
тепер приймає суворий аргумент лише для ключового слова. Якщо встановлено значення True
, OSError
викликається, якщо шлях не існує або виникає цикл символічного посилання. (Надано Барні Гейлом у bpo-43757.)
pathlib¶
Add slice support to PurePath.parents
.
(Contributed by Joshua Cannon in bpo-35498.)
Add negative indexing support to PurePath.parents
.
(Contributed by Yaroslav Pankovych in bpo-21041.)
Додайте метод Path.hardlink_to
, який замінює link_to()
. Новий метод має той самий порядок аргументів, що й symlink_to()
. (Надано Барні Гейлом у bpo-39950.)
pathlib.Path.stat()
і chmod()
тепер приймають follow_symlinks лише ключовий аргумент для узгодженості з відповідними функціями в модулі os
. (Надано Барні Гейлом у bpo-39906.)
платформа¶
Add platform.freedesktop_os_release()
to retrieve operation system
identification from freedesktop.org os-release standard file.
(Contributed by Christian Heimes in bpo-28468.)
pprint¶
pprint.pprint()
тепер приймає новий аргумент ключового слова underscore_numbers
. (Надав sblondon у bpo-42914.)
pprint
тепер може красиво друкувати екземпляри dataclasses.dataclass
. (Надано Льюїсом Голом у bpo-43080.)
py_compile¶
Додайте параметр --quiet
до інтерфейсу командного рядка py_compile
. (Надав Григорій Шевченко в bpo-38731.)
pyclbr¶
Add an end_lineno
attribute to the Function
and Class
objects in the tree returned by pyclbr.readmodule()
and
pyclbr.readmodule_ex()
. It matches the existing (start) lineno
.
(Contributed by Aviral Srivastava in bpo-38307.)
полиця¶
The shelve
module now uses pickle.DEFAULT_PROTOCOL
by default
instead of pickle
protocol 3
when creating shelves.
(Contributed by Zackery Spytz in 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.)
The ssl module has preliminary support for OpenSSL 3.0.0 and new option
OP_IGNORE_UNEXPECTED_EOF
.
(Contributed by Christian Heimes in bpo-38820, bpo-43794,
bpo-43788, bpo-43791, bpo-43799, bpo-43920,
bpo-43789, and bpo-43811.)
Застаріла функція та використання застарілих констант тепер призводять до DeprecationWarning
. ssl.SSSLContext.options
має OP_NO_SSLv2
і OP_NO_SSLv3
встановлені за замовчуванням і тому не може попередити про повторне встановлення прапора. У розділі deprecation міститься список застарілих функцій. (Надав Крістіан Хеймс у bpo-43880.)
Модуль ssl тепер має більш безпечні налаштування за замовчуванням. Шифри без прямої секретності або SHA-1 MAC вимкнено за замовчуванням. Рівень безпеки 2 забороняє слабкі ключі RSA, DH і ECC з менш ніж 112 бітами безпеки. SSLContext
за умовчанням має мінімальну версію протоколу TLS 1.2. Налаштування засновані на дослідженнях Hynek Schlawack. (Надав Крістіан Хеймс у bpo-43998.)
Застарілі протоколи SSL 3.0, TLS 1.0 і TLS 1.1 більше не підтримуються офіційно. Python не блокує їх активно. Однак параметри збірки OpenSSL, конфігурації дистрибутива, патчі постачальника та набори шифрів можуть перешкодити успішному рукостисканню.
Додайте параметр timeout до функції ssl.get_server_certificate()
. (Надав Закері Шпітц у bpo-31870.)
Модуль ssl використовує типи купи та багатофазову ініціалізацію. (Надав Крістіан Хеймс у bpo-42333.)
A new verify flag VERIFY_X509_PARTIAL_CHAIN
has been added.
(Contributed by l0x in bpo-40849.)
sqlite3¶
Додайте події аудиту для connect/handle()
, enable_load_extension()
і load_extension()
. (Надав Erlend E. Aasland у bpo-43762.)
система¶
Додайте атрибут sys.orig_argv
: список початкових аргументів командного рядка, переданих у виконуваний файл Python. (Надав Віктор Стіннер у bpo-23427.)
Додайте sys.stdlib_module_names
, що містить список імен модулів стандартної бібліотеки. (Надав Віктор Стіннер у bpo-42955.)
_thread¶
_thread.interrupt_main()
now takes an optional signal number to
simulate (the default is still signal.SIGINT
).
(Contributed by Antoine Pitrou in 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()
тепер можуть приймати об’єкт винятку лише як позиційний аргумент. (Надано Zackery Spytz і Matthias Bussonnier у bpo-26389.)
види¶
Знову представити класи types.EllipsisType
, types.NoneType
і types.NotImplementedType
, надаючи новий набір типів, які легко інтерпретуються засобами перевірки типів. (Надав Бас ван Бік у bpo-41810.)
введення тексту¶
Для основних змін див. Нові функції, пов’язані з підказками типу.
Поведінку typing.Literal
було змінено, щоб вона відповідала PEP 586 і відповідала поведінці засобів перевірки статичних типів, указаних у PEP.
Літерал
тепер усуває дублікати параметрів.Порівняння рівності між об’єктами
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.)
Add new function typing.is_typeddict()
to introspect if an annotation
is a typing.TypedDict
.
(Contributed by Patrick Reader in bpo-41792.)
Subclasses of typing.Protocol
which only have data variables declared
will now raise a TypeError
when checked with isinstance
unless they
are decorated with runtime_checkable()
. Previously, these checks
passed silently. Users should decorate their
subclasses with the runtime_checkable()
decorator
if they want runtime protocols.
(Contributed by Yurii Karabas in bpo-38908.)
Importing from the typing.io
and typing.re
submodules will now emit
DeprecationWarning
. These submodules have been deprecated since
Python 3.8 and will be removed in a future version of Python. Anything
belonging to those submodules should be imported directly from
typing
instead.
(Contributed by Sebastian Rittau in bpo-38291.)
unittest¶
Додайте новий метод assertNoLogs()
, щоб доповнити існуючий assertLogs()
. (Надав Кіт Ян Чой у bpo-39385.)
urllib.parse¶
Версії Python, раніші за Python 3.10, дозволяли використовувати як ;
, так і &
як роздільники параметрів запиту в urllib.parse.parse_qs()
і urllib.parse.parse_qsl()
. З міркувань безпеки та для відповідності новим рекомендаціям W3C це було змінено, щоб дозволити лише один роздільний ключ із &
за замовчуванням. Ця зміна також впливає на cgi.parse()
і cgi.parse_multipart()
, оскільки вони використовують уражені функції внутрішньо. Щоб дізнатися більше, перегляньте відповідну документацію. (Надано Адамом Ґолдшмідтом, Сентилом Кумараном і Кеном Джином у bpo-42967.)
The presence of newline or tab characters in parts of a URL allows for some
forms of attacks. Following the WHATWG specification that updates RFC 3986,
ASCII newline \n
, \r
and tab \t
characters are stripped from the
URL by the parser in urllib.parse
preventing such attacks. The removal
characters are controlled by a new module level variable
urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE
. (See gh-88048)
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 назва модуля
в середньому в 1,4 рази швидший. У Linuxpython3 -I -m назва-модуля
імпортує 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%. Перегляньте цю статтю для отримання додаткової інформації. (Надано Віктором Стіннером і Пабло Галіндо в 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)When using stringized annotations, annotations dicts for functions are no longer created when the function is created. Instead, they are stored as a tuple of strings, and the function object lazily converts this into the annotations dict on demand. This optimization cuts the CPU time needed to define an annotated function by half. (Contributed by Yurii Karabas and Inada Naoki in bpo-42202.)
Функції пошуку підрядків, такі як
str1 in str2
іstr2.find(str1)
, тепер іноді використовують «двосторонній» алгоритм пошуку рядків Crochemore & Perrin, щоб уникнути квадратичної поведінки довгих рядків. (Надав Денніс Суїні в bpo-41972)Add micro-optimizations to
_PyType_Lookup()
to improve type attribute cache lookup performance in the common case of cache hits. This makes the interpreter 1.04 times faster on average. (Contributed by Dino Viehland in bpo-43452.)The following built-in functions now support the faster PEP 590 vectorcall calling convention:
map()
,filter()
,reversed()
,bool()
andfloat()
. (Contributed by Donghee Na and Jeroen Demeyer in bpo-43575, bpo-43287, bpo-41922, bpo-41873 and bpo-41870.)BZ2File
performance is improved by removing internalRLock
. This makesBZ2File
thread unsafe in the face of multiple simultaneous readers or writers, just like its equivalent classes ingzip
andlzma
have always been. (Contributed by Inada Naoki in bpo-43785.)
Застаріле¶
Currently Python accepts numeric literals immediately followed by keywords, for example
0in x
,1or x
,0if 1else 2
. It allows confusing and ambiguous expressions like[0x1for x in y]
(which can be interpreted as[0x1 for x in y]
or[0x1f or x in y]
). Starting in this release, a deprecation warning is raised if the numeric literal is immediately followed by one of keywordsand
,else
,for
,if
,in
,is
andor
. In future releases it will be changed to syntax warning, and finally to syntax error. (Contributed by Serhiy Storchaka in bpo-43833.)Починаючи з цього випуску, будуть узгоджені зусилля, щоб розпочати очищення старої семантики імпорту, яка була збережена для сумісності з Python 2.7. Зокрема,
find_loader()
/find_module()
(заміненоfind_spec()
),load_module()
(заміненийexec_module()
),module_repr()
(про який дбає система імпорту ви), атрибут__package__
(замінений__spec__.parent
), атрибут__loader__
(замінений__spec__.loader
) і__cached__
атрибут ( замінений на__spec__.cached
) буде повільно видалено (як і інші класи та методи вimportlib
).ImportWarning
та/абоDeprecationWarning
буде піднято відповідно, щоб допомогти визначити код, який потребує оновлення під час цього переходу.Весь простір імен
distutils
застарів, його буде видалено в Python 3.12. Зверніться до розділу зміни модуля для отримання додаткової інформації.Нецілочисельні аргументи
random.randrange()
застаріли. ПомилкаValueError
застаріла на користьTypeError
. (Надано Сергієм Сторчакою та Раймондом Геттінгером у bpo-37319.)Різні методи
load_module()
importlib
були задокументовані як застарілі, починаючи з Python 3.6, але тепер вони також викликаютьDeprecationWarning
. Замість цього використовуйтеexec_module()
. (Надав Бретт Кеннон у bpo-26131.)zimport.zipimporter.load_module()
не підтримується як перевага дляexec_module()
. (Надав Бретт Кеннон у bpo-26131.)Використання
load_module()
системою імпорту тепер викликаєImportWarning
, оскількиexec_module()
є кращим. (Надав Бретт Кеннон у bpo-26131.)Використання
importlib.abc.MetaPathFinder.find_module()
іimportlib.abc.PathEntryFinder.find_module()
системою імпорту тепер викликаєImportWarning
якimportlib.abc. MetaPathFinder.find_spec()
іimportlib.abc.PathEntryFinder.find_spec()
є кращими відповідно. Ви можете використовуватиimportlib.util.spec_from_loader()
, щоб допомогти у перенесенні. (Надано Бреттом Кенноном у bpo-42134.)Використання
importlib.abc.PathEntryFinder.find_loader()
системою імпорту тепер викликаєImportWarning
, оскількиimportlib.abc.PathEntryFinder.find_spec()
є кращим. Ви можете використовуватиimportlib.util.spec_from_loader()
, щоб допомогти у перенесенні. (Надано Бреттом Кенноном у bpo-43672.)Різні реалізації
importlib.abc.MetaPathFinder.find_module()
(importlib.machinery.BuiltinImporter.find_module()
,importlib.machinery.FrozenImporter.find_module()
,importlib.machinery .WindowsRegistryFinder.find_module()
,importlib.machinery.PathFinder.find_module()
,importlib.abc.MetaPathFinder.find_module()
,importlib.abc.PathEntryFinder.find_module()
(importlib.machinery.FileFinder.find_module()
) іimportlib.abc.PathEntryFinder.find_loader()
(importlib.machinery.FileFinder.find_loader()
) тепер викликаютьDeprecationWarning
і планується для видалення у Python 3.12 (раніше вони були задокументовані як застарілі в Python 3.4). (Надано Бреттом Кенноном у bpo-42135.)importlib.abc.Finder
застаріло (включаючи його єдиний метод,find_module()
). Іimportlib.abc.MetaPathFinder
, іimportlib.abc.PathEntryFinder
більше не успадковують від класу. Натомість користувачі повинні успадковувати один із цих двох класів. (Надано Бреттом Кенноном у bpo-42135.)Застарілі
imp
,importlib.find_loader()
,importlib.util.set_package_wrapper()
,importlib.util.set_loader_wrapper()
,importlib.util.module_for_loader()
,pkgutil.ImpImporter
іpkgutil.ImpLoader
оновлено, щоб указати Python 3.12 як планову версію видалення (вони почали викликати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. (Надав Erlend E. Aasland у bpo-42264.)Недокументована вбудована функція
sqlite3.enable_shared_cache
тепер застаріла, її планується видалити в Python 3.12. Його використання настійно не рекомендується документацією SQLite3. Перегляньте документи SQLite3 для отримання додаткової інформації. Якщо потрібно використовувати спільний кеш, відкрийте базу даних у режимі URI за допомогою параметра запитуcache=shared
. (Надав Erlend E. Aasland у bpo-24464.)Наступні методи
потоковості
тепер застаріли: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
(Contributed by Jelle Zijlstra in 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
, andPROTOCOL_TLS
are deprecated in favor ofPROTOCOL_TLS_CLIENT
andPROTOCOL_TLS_SERVER
wrap_socket()
замінюється наssl.SSLContext.wrap_socket()
RAND_pseudo_bytes()
,RAND_egd()
Такі функції NPN, як
ssl.SSLSocket.selected_npn_protocol()
іssl.SSSLContext.set_npn_protocols()
, замінено на ALPN.
Налагодження потоків (
PYTHONTHREADDEBUG
змінна середовища) застаріло в Python 3.10 і буде видалено в Python 3.12. Для цієї функції потрібна налагоджувальна збірка Python. (Надав Віктор Стіннер у bpo-44584.)Importing from the
typing.io
andtyping.re
submodules will now emitDeprecationWarning
. These submodules will be removed in a future version of Python. Anything belonging to these submodules should be imported directly fromtyping
instead. (Contributed by Sebastian Rittau in 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. (Надано Berker Peksag у bpo-31844.)Видалено атрибут
unicodedata.ucnhash_CAPI
, який був внутрішнім об’єктом PyCapsule. Відповідну приватну структуру_PyUnicode_Name_CAPI
було переміщено до внутрішнього C API. (Надав Віктор Стіннер у bpo-42157.)Видалено модуль
парсер
, який був застарілим у версії 3.9 через перехід на новий синтаксичний аналізатор PEG, а також усі вихідні файли C і файли заголовків, які використовувалися лише старим парсером, включаючиnode.h ``, ``parser.h
,graminit.h
іgrammar.h
.Видалено публічні функції API C
PyParser_SimpleParseStringFlags
,PyParser_SimpleParseStringFlagsFilename
,Parser_SimpleParseFileFlags
іPyNode_Compile
, які були застарілими в 3.9 через перехід на новий аналізатор PEG.Removed the
formatter
module, which was deprecated in Python 3.4. It is somewhat obsolete, little used, and not tested. It was originally scheduled to be removed in Python 3.6, but such removals were delayed until after Python 2.7 EOL. Existing users should copy whatever classes they use into their code. (Contributed by Donghee Na and Terry J. Reedy in bpo-42299.)Removed the
PyModule_GetWarningsModule()
function that was useless now due to the_warnings
module was converted to a builtin module in 2.6. (Contributed by Hai Shi in bpo-42599.)Видаліть застарілі псевдоніми для Collections Abstract Base Classes з модуля
collections
. (Надав Віктор Стіннер у bpo-37324.)Параметр
loop
було видалено з більшостіasyncio
високорівневого API після застарілої версії Python 3.8. Мотивація цієї зміни багатогранна:Це спрощує API високого рівня.
Починаючи з Python 3.7, функції високорівневого API неявно отримують поточний цикл подій поточного потоку. У більшості звичайних випадків використання циклу подій до API не потрібно передавати.
Передача циклу подій схильна до помилок, особливо коли йдеться про цикли, що виконуються в різних потоках.
Зауважте, що API низького рівня все одно прийматиме
цикл
. Перегляньте Зміни в API Python приклади того, як замінити існуючий код.(Надано Юрієм Карабасом, Ендрю Свєтловим, Юрієм Селівановим і Кайлом Стенлі в bpo-42392.)
Перенесення на Python 3.10¶
У цьому розділі наведено описані раніше зміни та інші виправлення помилок, які можуть потребувати змін у вашому коді.
Зміни в синтаксисі Python¶
Deprecation warning is now emitted when compiling previously valid syntax if the numeric literal is immediately followed by a keyword (like in
0in x
). In future releases it will be changed to syntax warning, and finally to a syntax error. To get rid of the warning and make the code compatible with future releases just add a space between the numeric literal and the following keyword. (Contributed by Serhiy Storchaka in bpo-43833.)
Зміни в API Python¶
Параметри etype функцій
format_exception()
,format_exception_only()
іprint_exception()
у модуліtraceback
перейменовано до exc. (Надано Zackery Spytz і Matthias Bussonnier у 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-бітне ціле число без знаку. (Надав Erlend E. Aasland у bpo-42393.)Параметр
loop
було видалено з більшостіasyncio
високорівневого 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
Parser_SimpleParseStringFlags
,PyParser_SimpleParseStringFlagsFilename
,Parser_SimpleParseFileFlags
,PyNode_Compile
і тип, який використовується цими функціями,struct _node
, були видалені через перехід до новий аналізатор PEG.Початковий код тепер має бути скомпільований безпосередньо в об’єкт коду за допомогою, наприклад,
Py_CompileString()
. Потім отриманий об’єкт коду можна оцінити за допомогою, наприклад,PyEval_EvalCode()
.зокрема:
Виклик
Parser_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);
For
FrameObject
objects, thef_lasti
member now represents a wordcode offset instead of a simple offset into the bytecode string. This means that this number needs to be multiplied by 2 to be used with APIs that expect a byte offset instead (likePyCode_Addr2Line()
for example). Notice as well that thef_lasti
member ofFrameObject
objects is not considered stable: please usePyFrame_GetLineNumber()
instead.
Зміни байт-коду CPython¶
The
MAKE_FUNCTION
instruction now accepts either a dict or a tuple of strings as the function’s annotations. (Contributed by Yurii Karabas and Inada Naoki in 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
до сценарію./configure
. Якщо вказано, модульensurepip
шукає пакети колісsetuptools
іpip
у цьому каталозі: якщо обидва присутні, ці пакунки колеса використовуються замість пакетів колес гарантійpip.Деякі політики упаковки дистрибутивів Linux рекомендують не об’єднувати залежності. Наприклад, Fedora встановлює пакети коліс у каталог
/usr/share/python-wheels/
і не встановлює пакетensurepip._bundled
.(Надав Віктор Стіннер у bpo-42856.)
Додайте нову опцію
configure --without-static-libpython
, щоб не створювати статичну бібліотекуlibpythonMAJOR.MINOR.a
і не встановлювати об’єктний файлpython.o
.(Надав Віктор Стіннер у bpo-43103.)
The
configure
script now uses thepkg-config
utility, if available, to detect the location of Tcl/Tk headers and libraries. As before, those locations can be explicitly specified with the--with-tcltk-includes
and--with-tcltk-libs
configuration options. (Contributed by Manolis Stamatogiannakis in 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()
: схожу наPyModule_AddObject()
, але не викрадайте посилання на значення в разі успіху. (Надав Віктор Стіннер у bpo-1635741.)Додайте функції
Py_NewRef()
іPy_XNewRef()
, щоб збільшити кількість посилань на об’єкт і повернути об’єкт. (Надав Віктор Стіннер у bpo-42262.)Функції
PyType_FromSpecWithBases()
іPyType_FromModuleAndSpec()
тепер приймають один клас як аргумент bases. (Надав Сергій Сторчака в bpo-42423.)Функція
PyType_FromModuleAndSpec()
тепер приймає NULL слотtp_doc
. (Надав Хай Ши в bpo-41832.)Функція
PyType_GetSlot()
може приймати статичні типи. (Надано Хай Ши та Петром Вікторіним у bpo-41073.)Додайте нову функцію
PySet_CheckExact()
до C-API, щоб перевірити, чи є об’єкт екземпляромset
, але не екземпляром підтипу. (Надав Пабло Галіндо в bpo-43277.)Додайте
PyErr_SetInterruptEx()
, який дозволяє передавати номер сигналу для моделювання. (Надав Антуан Пітру в bpo-43356.)Обмежений C API тепер підтримується, якщо Python зібрано в режимі налагодження (якщо визначено макрос
Py_DEBUG
). В обмеженому API C функції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
singleton абоFalse
singleton. (Надав Віктор Стіннер у bpo-43753.)Додайте нові функції для керування збирачем сміття з коду C:
PyGC_Enable()
,PyGC_Disable()
,PyGC_IsEnabled()
. Ці функції дозволяють активувати, деактивувати та запитувати стан збирача сміття з коду C без необхідності імпортувати модульgc
.Add a new
Py_TPFLAGS_DISALLOW_INSTANTIATION
type flag to disallow creating type instances. (Contributed by Victor Stinner in bpo-43916.)Add a new
Py_TPFLAGS_IMMUTABLETYPE
type flag for creating immutable type objects: type attributes cannot be set nor deleted. (Contributed by Victor Stinner and Erlend E. Aasland in bpo-43908.)
Перенесення на Python 3.10¶
The
PY_SSIZE_T_CLEAN
macro must now be defined to usePyArg_ParseTuple()
andPy_BuildValue()
formats which use#
:es#
,et#
,s#
,u#
,y#
,z#
,U#
andZ#
. See Розбір аргументів і створення значень and PEP 353. (Contributed by Victor Stinner in 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, розмір)
іPyUnicode_FromStringAndSize(NULL, розмір)
викликаютьDeprecationWarning
зараз. ВикористовуйтеPyUnicode_New()
, щоб виділити об’єкт Unicode без початкових даних. (Надано Інадою Наокі в bpo-36346.)Приватну структуру
_PyUnicode_Name_CAPI
API PyCapsuleunicodedata.ucnhash_CAPI
було переміщено до внутрішнього API C. (Надав Віктор Стіннер у bpo-42157.)Py_GetPath()
,Py_GetPrefix()
,Py_GetExecPrefix()
,Py_GetProgramFullPath()
,Py_GetPythonHome()
andPy_GetProgramName()
functions now returnNULL
if called beforePy_Initialize()
(before Python is initialized). Use the new Конфігурація ініціалізації Python API to get the Конфігурація шляху Python. (Contributed by Victor Stinner in 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) ...
тест. (Надано Zackery Spytz і Victor Stinner у bpo-30459.)The non-limited API files
odictobject.h
,parser_interface.h
,picklebufobject.h
,pyarena.h
,pyctype.h
,pydebug.h
,pyfpe.h
, andpytime.h
have been moved to theInclude/cpython
directory. These files must not be included directly, as they are already included inPython.h
; see Включати файли. If they have been included directly, consider includingPython.h
instead. (Contributed by Nicholas Sim in bpo-35134.)Use the
Py_TPFLAGS_IMMUTABLETYPE
type flag to create immutable type objects. Do not rely onPy_TPFLAGS_HEAPTYPE
to decide if a type object is mutable or not; check ifPy_TPFLAGS_IMMUTABLETYPE
is set instead. (Contributed by Victor Stinner and Erlend E. Aasland in bpo-43908.)The undocumented function
Py_FrozenMain
has been removed from the limited API. The function is mainly useful for custom builds of Python. (Contributed by Petr Viktorin in 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()
(Надано Інадою Наокі в 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
. Ці функції були недокументовані та виключені з обмеженого C API. Більшість імен, визначених цими файлами заголовків, не мали префіксаPy
і тому могли спричиняти конфлікти імен. Наприклад,Python-ast.h
визначив макросYield
, який конфліктував з назвоюYield
, що використовується заголовком Windows<winbase.h>
. Натомість використовуйте модуль Pythonast
. (Надав Віктор Стіннер у bpo-43244.)Видаліть функції компілятора та аналізатора за допомогою типу
struct _mod
, оскільки загальнодоступний API AST C було видалено:PyAST_Compile()
PyAST_CompileEx()
PyAST_CompileObject()
PyFuture_FromAST()
PyFuture_FromASTObject()
PyParser_ASTFromFile()
PyParser_ASTFromFileObject()
PyParser_ASTFromFilename()
PyParser_ASTFromString()
PyParser_ASTFromStringObject()
Ці функції були недокументовані та виключені з обмеженого C API. (Надав Віктор Стіннер у bpo-43244.)
Видаліть заголовний файл
pyarena.h
із функціями:PyArena_New()
PyArena_Free()
PyArena_Malloc()
PyArena_AddPyObject()
Ці функції були незадокументовані, виключені з обмеженого API C і використовувалися лише внутрішньо компілятором. (Надав Віктор Стіннер у bpo-43244.)
Для оптимізації Python було видалено член
PyThreadState.use_tracing
. (Надав Марк Шеннон у bpo-43760.)
Notable security feature in 3.10.7¶
Converting between int
and str
in bases other than 2
(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal)
now raises a ValueError
if the number of digits in string form is
above a limit to avoid potential denial of service attacks due to the
algorithmic complexity. This is a mitigation for CVE-2020-10735.
This limit can be configured or disabled by environment variable, command
line flag, or sys
APIs. See the integer string conversion
length limitation documentation. The default limit
is 4300 digits in string form.
Notable security feature in 3.10.8¶
The deprecated mailcap
module now refuses to inject unsafe text
(filenames, MIME types, parameters) into shell commands. Instead of using such
text, it will warn and act as if a match was not found (or for test commands,
as if the test failed).
(Contributed by Petr Viktorin in gh-98966.)
Notable changes in 3.10.12¶
tarfile¶
The extraction methods in
tarfile
, andshutil.unpack_archive()
, have a new a filter argument that allows limiting tar features than may be surprising or dangerous, such as creating files outside the destination directory. See Extraction filters for details. In Python 3.12, use without the filter argument will show aDeprecationWarning
. In Python 3.14, the default will switch to'data'
. (Contributed by Petr Viktorin in PEP 706.)