Оператор объединения словаря, аннотации универсального типа и многое другое

Python 3.9 в настоящее время находится на четвертой итерации своей бета-фазы (по состоянию на июль 2020 года). Хотя некоторые вещи могут измениться, теперь довольно ясно, как будет выглядеть новый выпуск.

Аннотации универсального типа

Аннотации универсального типа, также известные как PEP 585, - это то, чего многие питонисты давно жаждали. Теперь вы можете указать коллекцию и тип ее элемента, не полагаясь на types библиотеку:

def do_stuff(data: list[int]): 
    pass

Вот несколько коллекций, которые теперь можно обобщить:

Оператор Dict Union

До Python 3.9 стандартными способами слияния с dicts были:

  1. Метод .update: a.update(b)
  2. Оператор распространения (привет, 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')

Заключительные примечания

Спасибо, что прочитали, надеюсь, вам понравилась моя статья. Оставайтесь подписанными, чтобы увидеть больше!

Ресурсы