На данный момент мы используем Python 3.8, а последняя стабильная версия 3.8.4 была выпущена совсем недавно. Python 3.9 уже находится на стадии бета-тестирования, а его первый стабильный релиз ожидается в октябре 2020 года. В мае 2020 года также началась разработка Python 3.10, а его первая бета-версия ожидается в мае 2021 года.
Фанатов Python, несомненно, ждут интересные времена. Просматривая расписание релизов трех версий (3.8, 3.9 и 3.10), я решил составить хронологию разработки Python с ключевыми датами.
Ключевые даты в цикле разработки 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 будет представлен новый метод 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')
В функцию 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
Три ключевых метода словарей 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
В 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.8, 3.9, 3.10.
Перевод статьи
Комментарии