Оператор объединения словаря, аннотации универсального типа и многое другое
Python 3.9 в настоящее время находится на четвертой итерации своей бета-фазы (по состоянию на июль 2020 года). Хотя некоторые вещи могут измениться, теперь довольно ясно, как будет выглядеть новый выпуск.
Аннотации универсального типа
Аннотации универсального типа, также известные как PEP 585, - это то, чего многие питонисты давно жаждали. Теперь вы можете указать коллекцию и тип ее элемента, не полагаясь на types
библиотеку:
def do_stuff(data: list[int]):
pass
Вот несколько коллекций, которые теперь можно обобщить:
tuple
list
dict
set
frozenset
type
collections.deque
collections.abc.Coroutine
re.Pattern
- И многое другое
Оператор Dict Union
До Python 3.9 стандартными способами слияния с dicts были:
- Метод
.update
:a.update(b)
- Оператор распространения (привет, JS):
{**a, **b}
Что ж, мы получаем еще один. Оператор объединения |
делает именно то, что должен делать: Объединение двух слов:
a = {'cars': 5, 'phones': 2}
b = {'cows': 10, 'lizards': 3}
a | b
// {'cars': 5, 'phones': 2, 'cows': 10, 'lizards': 3}
Так же, как .update
или оператор распространения, это может привести к потере данных, если в dict есть повторяющиеся ключи. Кроме того, этот оператор одинаково хорошо работает с расширенным присваиванием:
a = {'cars': 5, 'phones': 2}
b = {'cows': 10, 'lizards': 3}
a |= b
print(a)
// {'cars': 5, 'phones': 2, 'cows': 10, 'lizards': 3}
Удалить суффиксы и префиксы
Новые строковые методы .removesuffix()
и .removeprefix()
делают именно это:
'SubaruImpreza`.removeprefix('Subaru') // 'Impreza' 'SubaruImpreza'.removesuffix('Impreza') // 'Subaru'
Новый парсер
В Python 3.9 используется новый парсер. Он основан на PEG (Parsing expression grammar), в отличие от старого, который использует LL (анализатор слева направо). Это было сделано потому, что возможности парсера LL были исчерпаны, и становилось все труднее реализовывать новые языковые функции. Скорее всего, вы не заметите разницы - производительность сопоставима, а полная обратная совместимость подтверждена.
Вам нужно заботиться об этом только в том случае, если ваш код использует модуль parser
из стандартной библиотеки. Некоторое время назад он объявлен устаревшим и не будет работать с новым парсером. В качестве обходного пути вы можете вернуться к старому синтаксическому анализатору, используя аргумент -X oldparser
или переменную среды PYTHONOLDPARSER=1
.
Модуль Zoneinfo
Python 3.9 представил новый модуль под названием zoneinfo
. Он реализует класс ZoneInfo
, который обеспечивает поддержку часовых поясов IANA.
from zoneinfo import ZoneInfo
from datetime import datetime, timedelta
timestamp = datetime(2020, 7, 15, 11, tzinfo=ZoneInfo("America/Los_Angeles"))
Модуль Graphlib
Еще один новый модуль - на этот раз для работы с графиками. На данный момент он реализует только алгоритм топологической сортировки для ориентированных ациклических графов. Если вы не поняли, что я только что написал, скорее всего, вам не понадобится новый модуль. Для тех из вас, кто знаком с теорией графов, вот как следует использовать модуль (взято из документации Python):
>>> graph = {"D": {"B", "C"}, "C": {"A"}, "B": {"A"}}
>>> ts = TopologicalSorter(graph)
>>> tuple(ts.static_order())
('A', 'C', 'B', 'D')
Заключительные примечания
Спасибо, что прочитали, надеюсь, вам понравилась моя статья. Оставайтесь подписанными, чтобы увидеть больше!