Новости
Что нового в Python 3.10

Что нового в Python 3.10

Вышла новая версия языка программирования Python 3. В ней добавлены новые синтаксические конструкции, улучшения уже имеющихся возможностей.

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 – уж слишком вкусно выглядят обновы!