Новые возможности Python 3. 9 мнения экспертов

Новый релиз языка программирования Python 3.9 случится ещё нескоро ( ожидаемая дата – 5 октября ), но одна за другой выходят бета-версии . Давайте посмотрим, какие улучшения и исправления мы можем ожидать. В этой статье представлен список наиболее интересных и примечательных вещей, которые должны появиться в версии 3.9.

<a href="https://twitter.com/gvanrossum/status/1262766323626504192" target="_blank" rel="noopener noreferrer nofollow">Сообщение</a> в <a href="https://twitter.com/gvanrossum/" target="_blank" rel="noopener noreferrer nofollow">твиттере создателя языка программирования Python Гвидо ван Россума</a> о выходе первой бета-версии 3.9 (9 июня вышла третья бета)Сообщение в твиттере создателя языка программирования Python Гвидо ван Россума о выходе первой бета-версии 3.9 (9 июня вышла третья бета)

Несмотря на то, что Гвидо сложил с себя полномочия «великодушного пожизненного диктатора», в этой версии автор языка оказал существенное влияние на выбор нового парсера. Вот как об этом пишет Адиль Хаштамов :

Чтобы попробовать бета-версию Python 3.9, сначала её нужно установить. В идеале – без конфликтов с текущей версией Python. Последнюю версию можно найти на странице загрузки (названия файлов начинаются с python-3.9.0b ). Например, на Linux установить версию локально без конфликтов с текущей версией можно следующим набором команд:

После выполнения последней команды появится классическое приветствие:

Наиболее заметной новинкой является операторы слияния словарей | и |= . До сих пор нам приходилось выбирать один из трёх вариантов объединения словарей:

Первый вариант использует функцию инициализации словарей dict(iterable, **kwargs) . Первый аргумент – обычный словарь, второй – список пары ключ/значение, в данном случае просто ещё один словарь, распакованный с использованием оператора ** .

Второй подход использует метод update для обновления первого словаря парами ключ – значение из второго словаря. Поскольку update модифицирует словарь «на месте», нужно скопировать первый словарь в конечную переменную, чтобы избежать изменения оригинала.

Третий и, похоже, самый ясный способ – распаковать обе переменные d1 и d2 в результирующую переменную d .

Все приведенные варианты работают, но теперь есть более удобное решение:

Первый пример похож на вариант с распаковкой d = <** d1, ** d2>. Второй пример может использоваться для объединения данных на месте, когда исходная переменная d1 обновляется значениями из второго операнда d2 .

В версии 3.9 для аннотации типов встроенных коллекций таких, как list и dict больше не нужно импортировать специальные типы ( List , Dict и др. ) из модуля typing :

Следующая интересная новинка является частью модуля functools – класс TopologicalSorter . Класс упорядочивает граф, используя топологическую сортировку. Это такой порядок узлов, когда для двух любых узлов графа u и v , соединенных направленным ребром от u к v , u в последовательности предшествует v .

Ранее подобную задачу приходилось решать самостоятельно, используя сортировку Хана или поиск в глубину , то есть далеко не самые простые алгоритмы. Теперь в случае необходимости, например, при планировании зависящих друг от друга заданий, достаточно сделать следующее:

Структура графа из примера в кодеСтруктура графа из примера в коде

В приведенном примере мы описали граф, используя словарь, в котором ключи – это исходящие узлы, а значения – наборы их соседей. Затем мы создали экземпляр сортировщика графа и вызвали функцию static_order .

Нужно помнить, что при топологической сортировке порядок элементов неоднозначен: когда несколько узлов находятся на одном уровне графа, они возвращаются в том же порядке, в котором были добавлены в граф.

Помимо статического упорядочения, класс поддерживает параллельную обработку узлов. Это удобно при работе с очередями задач – примеры можно найти в обновленной документации библиотеки functools .

Главный вопрос – почему класс оказался именно в functools ? В обсуждениях к публикации «Что нового ожидается в Python 3.9» её автор, пользователь Хабра elmos, отвечает следующим образом:

Еще одно улучшение, появившееся в Python 3.9, – возможность указывать область адресов IPv6 ( scope ). Область может быть указана в конце IP-адреса с помощью знака процента – например: 3FFE:0:0:1:200:F8FF:FE75:50DF%2 – этот IP-адрес находится в области 2 и соответствует локальному адресу.

Два адреса с разными параметрами scope не равны друг другу при использовании обычных операторов сравнения Python.

Несколько функций было добавлено и улучшено в модуле math . Например, расширены возможности функции поиска наибольшего общего делителя (НОД):

Ранее функция math.gcd() могла вычислить НОД лишь для двух чисел. Если требовалось вычислить три и больше, приходилось делать что-то вроде math.gcd(80, math.gcd(64, 152)) . Теперь функции math.gcd() можно передать любое число аргументов.

Добавлена новая функция поиска наименьшего общего кратного math.lcm() , которая так же, как math.gcd() , принимает любое число аргументов:

Другие две новые функции тесно связаны между собой. Это math.nextafter() и math.ulp() :

Действие функции math.nextafter(x, y) выглядит довольно просто. Она возвращает ​​следующее число типа float , идущее после x в направлении к числу y (с учетом точности чисел с плавающей точкой).

Функцию math.ulp() можно использовать в качестве меры точности численных расчетов для данного числа. Сокращение ulp соответствует Unit in the last place – особому математическому интервалу между соседними float -числами. Этот интервал зависит от величины числа и способа представления чисел в конкретной операционной системе.

Для работы со строками в языке программирования Python в последней версии добавлена пара удобных вспомогательных функций :

Раньше в Python тех же результатов можно было достичь, используя подобную функцию:

Это простые операции, но, учитывая их распространенность, удобно иметь под рукой встроенные функции.

Текстовые описания кодов состояний HTTP добавлены в http.HTTPStatus .

Да, названия и назначения некоторых статусов довольно забавны, но для критичных кодов это позволяет делать их обработку более явной.

Конечно, изменений произошло гораздо больше, но вряд ли имеет смысл перечислять все. Ведь с полным перечнем обновлений в Python 3.9 можно ознакомиться в статье официальной документации . Нельзя сказать, что какое-либо изменение имеет критическое значение – просто программирование на Python становится ещё удобнее и эффективнее.