4-го октября 2021-го года вышла новая версия ЯП Python. Пройдёмся по основным изменениям!
Новый синтаксис для написания объединений типов
Для типов данных была перегружена операция битового или – |
. Теперь для указания
типов переменных стоит использовать не typing.Union[A, B]
, а A | B
. Так, например,
если тип принимаемого функцией значения должен быть строкой или массивом строк, вместо
from typing import Union
def required_permission(perm: Union[str, list[str]]):
pass
пишем
def required_permission(perm: str|list[str]):
pass
Аналогично можно делать проверку isinstance
. Вместо
a = 5
if isinstance(a, int) or isinstance(a, str):
pass
пишем
a = 5
if isinstance(a, int|str):
pass
Для указания типа typing.Optional[int]
теперь следует использовать int | None
(не NoneType
).
Замечу, что лучше поддерживать интерфейсы функций, методов и т.д. более строгими – без всяких
Union
и Optional
. Но если есть необходимость в этом, новый синтаксис выглядит более читаемым.
Улучшен синтаксис для использования контекстных менеджеров
Я уже писал о данной доработке,
которую внесли в феврале. Вкратце: раньше в конструкции with as
нельзя было использовать
круглые скобки для группировки открытия нескольких контекстов. Теперь можно. Иными словами:
with (
CtxManager1() as example1,
CtxManager2() as example2
):
pass
Такой код приводил к синтаксической ошибке. Вместо этого приходилось писать как-то так:
with CtxManager1() as example1, \
CtxManager2() as example2:
pass
При этом во всех остальных конструкциях языка можно (и нужно) писать не с помощью \
,
а именно при помощи скобок.
С новым парсером в Python 3.10 появилась возможность писать и в привычном ("скобочном") стиле!
Модуль distutils
объявлен устаревшим
distutils
использовался для пакетирования Python проектов. Пакеты Python же можно установить
чере pip – менеджер пакетов Python. Так что эта
информация в основном полезна для разработчиков, публикующих свои наработки.
У модуля distutils
есть куча проблем с поддержкой документации, да и сам он довольно
запутанный. При этом есть множество других модулей, которые также позволяют пакетировать,
при этом поддерживаются лучше и более чётко описаны.
Логичным решением было отказаться от distutils
. Во многих аспектах его заменой является setuptools
.
С версии Python 3.12 модуль distutils
перестанет поддерживаться.
Конструкция match-case
для сопоставления по шаблону
Пожалуй, самым большим новшеством является конструкция match-case
, о которой я уже писал в феврале.
Если коротко, то это монстр для операций ветвления – if
"на стероидах".
Например, если мы хотим получить от пользователя команду и выполнить по ней какое-то действие, то код будет выглядеть подобным образом:
command = input('Выберете действие: ')
match command.split():
case ["quit"]:
exit(0)
case ["go", direction]:
user.move(direction)
case ["drop", *objects]:
for obj in objects:
user.drop(obj)
case _:
print(f"Неизвестная команда '{command!r}'")
В match
имеем некоторый объект, его мы сопоставляем с шаблонами из case
-ов. Если подходит –
выполняется блок case
. Больше примеров по ссылке.
Также были улучшены средства отладки, определения псевдонимов типов, переработаны внутренности
cpython
, добавлены исправления, улучшения и баги.
Не знаю как вы, а я уже на ноуте обновил Python – уж слишком вкусно выглядят обновы!