В мире Python-типизации долгое время была «серая зона». Если вы хотели передать в функцию класс, вы писали
type[T]. Но как только дело доходило до сложных штук вроде int | str или list[int], тайп-чекеры начинали ругаться.⚡️ Принятый PEP 747 вводит `TypeForm[T]`, и это именно то, чего не хватало библиотекам вроде Pydantic и FastAPI.
Раньше
type[int] работал, потому что int — это класс. Но list[int] или int | str — это не классы, а специальные объекты типов.❌ Попытка передать их в функцию с аннотацией
type[T] выдавала ошибку в Mypy или Pyright. Разработчикам приходилось лепить Any, убивая всю пользу от статической проверки.Теперь мы можем явно сказать: «Эта функция принимает форму типа»:
from typing import TypeForm
def trycast[T](target_type: TypeForm[T], value: object) -> T | None:
...
# Теперь это валидный код для тайп-чекера:
trycast(list[int], ["1", "2"]) # Вернет тип list[int] | None
trycast(int | str, 42) # Вернет тип int | str | None
Что это дает на практике:
1️⃣ Идеальное автодополнение: IDE будет точно знать, что возвращает ваша функция-фабрика или парсер, даже если вы передали туда сложный Generic или Union.
2️⃣ Безопасность библиотек: Авторы инструментов для сериализации и валидации смогут выкинуть «костыли» и сделать API максимально прозрачным.
3️⃣ Меньше `Any`: Теперь можно типизировать практически всё, что в Python считается валидной аннотацией.
Фишка появится в Python 3.15, но через
typing_extensions её можно будет использовать гораздо раньше.🔗 Подробности: https://clc.to/kX2xMg
А вы часто сталкивались с тем, что `type[T]` не хватало для ваших задач? Как выкручивались — через `Any` или просто игнорировали ошибки?
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
