На данный момент мы используем Python 3.8, а последняя стабильная версия 3.8.4 была выпущена совсем недавно. Python 3.9 уже находится на стадии бета-тестирования, а его первый стабильный релиз ожидается в октябре 2020 года. В мае 2020 года также началась разработка Python 3.10, а его первая бета-версия ожидается в мае 2021 года.

Фанатов Python, несомненно, ждут интересные времена. Просматривая расписание релизов трех версий (3.8, 3.9 и 3.10), я решил составить хронологию разработки Python с ключевыми датами.

Image for post
Ключевые даты в цикле разработки Python (в уменьшенном масштабе). Источник: https://www.python.org/dev/peps/

Обычно в цикле разработки представлено 4–5 бета-версий, и новые функции не появляются уже после первой. Бета-1 для 3.8 была выпущена в июне 2019 года, а бета-1 для 3.9 — в мае 2020 года. И хотя работа над будущим Python 3.10 только началась, на официальном сайте уже появился краткий обзор некоторых из его основных особенностей.

Кратко рассмотрим основные функции будущей версии Python с официальными примерами. Обратите внимание, что в версии 3.10 может появиться еще больше новых функций.

Основные функции Python 3.10

1) Частотность 1 в двоичном представлении

В Python 3.10 будет представлен новый метод bit_count(), возвращающий число единиц в двоичном представлении целого числа. Результат будет независим от знака целого числа. Эта функциональность может пригодиться в теории информации для нахождения общего количества мест различий двух строк одинаковой длины. Эта разница называется расстоянием Хэмминга. Если вас интересует история этой функциональности в Python, ее можно почитать здесь (eng).

Внутри этого метода происходит вызов метода count типа str как str.count('1'). Следующий пример объясняет этот процесс:

# Положительное целое число
>>> num = 108

# Сначала получаем двоичное представление num
>>> bin(num)
'0b1101100'

>>> num.bit_count()
4

# Отрицательное целое число
>>> num = -108

>>> bin(num)
'-0b1101100'

>>> num.bit_count()
4

# События внутри метода
>>> bin(num).count('1')

2) «Более строгое» архивирование

В функцию zip будет добавлен новый опциональный именованный аргумент strict. При передаче strict=True итерируемые объекты в zip должны быть одинаковой длины, иначе возникнет ошибка ValueError. До версии Python 3.9 при архивировании двух списков разной длины вывод был равен длине меньшего списка.

Как видно из следующего примера, до Python 3.10 функция zip() игнорировала 'D' в первом списке, не имеющий совпадений во втором. А Python 3.10 в этом случае вызовет ошибку ValueError. Полезная функция, побуждающая пересмотреть вводные данные. Подробнее об этой теме можно почитать на PEP 618.

До Python 3.10:

>>> list(zip(['A', 'B', 'C', 'D'], ['Apple', 'Ball', 'Cat']))
[('A', 'Apple'), ('B', 'Ball'), ('C', 'Cat')]

В Python 3.10:

>>> list(zip(['A', 'B', 'C', 'D'], ['Apple', 'Ball', 'Cat'],
             strict=True))
Traceback (most recent call last):
  ...
ValueError: zip() argument 1 is longer than argument 2

3) Представления для словарей с доступом только для чтения

Три ключевых метода словарей keys()values() и items() возвращают подобные наборам объекты, которые соответствуют динамическому представлению ключей, значений и элементов словарей. Любые изменения в одном из этих представлений будут отражены в исходном словаре.

В Python 3.10 все возвращенные из этих трех методов представления будут иметь дополнительный атрибут mapping, возвращающий доступный только для чтения прокси отображения. Он будет оборачивать исходный словарь, на который ссылается представление. Следующий пример иллюстрирует этот процесс.

Определяем словарь и сохраняем его ключи и значения в разных переменных:

>>> fruits = {'Mangos': 12, 'Figs': 100, 'Guavas': 3, 'Kiwis': 70}
>>> keys = fruits.keys()
>>> values = fruits.values()

>>> list(keys)
['Mangos', 'Figs', 'Guavas', 'Kiwis']

Удаляем два элемента из этого словаря с помощью оператора del. Теперь при запросе ключей и значений он возвращает только оставшиеся элементы. Изменения в исходном словаре отражаются в представлениях (в данном случае keys и values).

>>> del fruits['Figs']
>>> del fruits['Guavas']

>>> print (list(keys), list(values))
['Mangos', 'Kiwis'] [12, 70]

Теперь с помощью mapping можно получить доступный только для чтения прокси исходного словаря!

# Возвращает доступный только для чтения прокси исходного словаря
>>> values.mapping
mappingproxy({'Mangos': 12, 'Figs': 100, 'Guavas': 3, 'Kiwis': 70})

>>> values.mapping['Guavas']
3

4) Удаление некоторых обратных совместимостей

В Python 3.10 и версиях выше будет прекращена поддержка псевдонимов для абстрактных базовых классов (Abstract Base Classes — ABC) из модуля collections. Самое время обратить внимание на соответствующие предупреждения об устаревании и адаптировать свой код!

До Python 3.9.0b4 (выпущен 3 июля 2020 года):

При импорте любого из этих ABC напрямую из модуля collections будет появляться DeprecationWarning:

>>> from collections import ABC_Name

DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working

Вот и все! Вы также можете следить за расписаниями релизов для текущих и будущих версий здесь: 3.83.93.10.

Читайте также:


Перевод статьи Ankit Gupta: Python in 2021 — Timeline and upcoming features

Предыдущая статьяУчим ИИ отвечать на сообщения
Следующая статьяОткройте миру разрабатываемые вами API