В Python 3.12 приняли PEP 695 – Type Parameter Syntax, который добавляет новый синтаксис для дженерик классов, функций и алиасов для типов. Это вот то, где используется typing.TypeVar
(спойлер: больше нет). Да, это снова про тайп хинты. Похоже, это самая активно развивающаяся область языка за последние 10 лет.
Давайте посмотрим на изменение на примере функции с переменными типа (смотри скриншот 1). Если что, это нужно для того, чтобы связать типы нескольких параметров и возвращаемых значений функции. Вот функция принимает на вход значение (любого типа), а на выходе она отдаст значение такого же типа. Часто используемый сценарий, как мне кажется. Такое стало писать намного приятнее. Не нужно отдельно писать это явное, некрасивое определение typing.TypeVar
, где ты дважды пишешь одно и то же имя переменной и засоряешь странными однобуквенными именами глобальную область видимости. В 3.12 можно будет просто прям при определении функции задекларировать своё намерение: "я буду тут использовать переменную типа T
", и аннотируешь ей все связанные аргументы и возвращаемые значения. Офигенно? О да.
Кроме того, тайп-алиасы с переменными типов тоже стало писать намного легче (смотри скриншот 2). Тоже отпала необходимость явно определять TypeVar
. Но теперь в языке появляется новое "мягкое" ключевое слово type
, которое ведёт себя по-разному в зависимости от контекста (как async
). Забавно, что это нововведение фактически депрекейтит PEP 613 про тайп алиасы, который появился в 3.10. Я даже толком не успел начать им пользоваться. Всё так быстро меняется.
Про классы-дженерики писать не буду, но если вы такое практикуете, то сходите почитайте док. Там интересно.
Отдельно прикольно, что больше не надо думать о ковариантности, контравариантности и инвариантности переменных типов. Эти концепции никуда не уходят, но теперь тайп-чекер будет сам понимать, с чем он работает, без необходимости явного указания. Это вот та штука, из-за которой приходится аргументы функций аннотировать как Sequence[Parent]
вместо list[Parent]
и которую я долго не мог осознать. Кстати, недавно смотрел хороший видос про эти концепции. Разобрался, вроде. Блин, не может ли недостаток понятных материалов на эту тему быть связан с тем, что эти слова так сложно писать и произносить? Я минуту набирал и перечитывал эти три слова в начале абзаца, да и то наверняка ошибся.
Если не думать о том, что это изменение создаёт новую область видимости для имён (scope) с довольно странной механикой работы, добавляет новое мягкое ключевое слово, добавляет новый сорт TypeVar
(теперь у нас есть "традиционные" и новые, и их нельзя смешивать между собой) и в целом делает язык синтаксически сложнее (давайте писать квадратные скобки вообще везде), то это абсолютно точно движение в правильную сторону, шаг навстречу программисту. Бойлерплейта станет меньше, импортов из typing
меньше, сложных концепций меньше, пространства для ошибки тоже. Да и выглядит относительно предыдущего варианта намного приятнее. Мне нравится.
>>Click here to continue<<
