Обзор Python 3.9

Недавно в сети стала доступна для установки альфа-версия Python 3.9. Релиз планируется на октябрь 2020 года, но уже сейчас можно взглянуть, а что же он нам новенького готовит.

Установить альфа версию Python 3.9 можно с официального сайта.

Built-in Generic Types, PEP 585

Начиная с версии 3.9 появилась возможность использовать привычные для нас built-in коллекции в качестве аннотаций с указанием типа содержимого этих коллекций. Напомню, что ранее для таких целей использовались объекты List, Dict из модуля typing. Вот как это теперь выглядит:

# как было до 3.9
from typing import List

def func(payload: List[str]) -> str:
    return 'Python < 3.9'

# как можно начиная с 3.9
def func(payload: list[str]) -> str:
    return 'Python 3.9'

Операторы объединения и обновления словаря, PEP 584

В Python 3.9 появилось 2 новых оператора | и |=, применяемых для работы со словарями.

payload_1 = {'a': 1, 'b': 2, 'c': 3}
payload_2 = {'d': 4, 'e': 5, 'f': 6}

# объединение двух словарей в 1
payload_1 | payload_2 # -> {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}

# обновление словаря payload_1 содержимым словаря payload_2
payload_1 |= payload_2
print(payload_1)
0: {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}

Теперь и тип dict обзавёлся своим оператором объединения | как и его собрат тип set. Вкусовщина конечно, но мне ближе старые привычные способы "распаковки":

payload_1 = {'a': 1, 'b': 2, 'c': 3}
payload_2 = {'d': 4, 'e': 5, 'f': 6}

{**payload_1, **payload_2}

Статусы HTTP

В модуль http были добавлены новые HTTP статусы:

import http

http.HTTPStatus.EARLY_HINTS  # 103
http.HTTPStatus.IM_A_TEAPOT  # 418
http.HTTPStatus.TOO_EARLY    # 425

Если вам интересно, что означает статус I am teapot, то прочитать можно здесь. В остальном, "долгожданный" апдейт 🤣

Обновления в math

В модуле math появилось несколько интересных апдейтов, а именно:

  • функция нахождение наибольшего общего делителя теперь может принимать неограниченное количество аргументов, ранее она принимала только 2
import math

math.gcd(10, 15, 20, 100)
  • появилась функция нахождения наименьшего общего кратного, math.lcm

removeprefix() & removesuffix(), PEP 616

У строк появились 2 новых методы с говорящим за себя названием:

string = 'prefixText'
string.removeprefix('prefix')
0: 'Text'
string.removesuffix('Text')
1: 'prefix'

Метод removeprefix удаляет подстроку в начале строки, а removesuffix удаляет подстроку в конце строки.

Обновлённый парсер кода, PEP 617

Начиная с Python 3.9 для парсинга используется PEG, ранее использовали LL. Выигрыша в производительности нет, но благодаря PEG в будущем возможно вводить более гибкие конструкции в язык. Модуль ast уже использует PEG для разбора исходного кода скрипта. Одним из инициаторов этого PEP был наш любимый Гвидо, у него в блоге есть целая серия постов на эту тему.