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