Вопрос проверяет понимание обобщённого программирования в Python и умение создавать гибкие, типизированные функции и классы с помощью TypeVar.
TypeVar — это инструмент модуля typing для создания переменных типа, которые позволяют определять обобщённые (generic) функции, методы и классы. Он полезен, когда логика кода должна работать с различными типами, но при этом требуется сохранять информацию о типах для статической проверки.
TypeVar часто используется в следующих сценариях:
Рассмотрим простой пример функции identity, которая возвращает переданный аргумент:
from typing import TypeVar, List
T = TypeVar('T') # Объявляем переменную типа
def identity(value: T) -> T:
return value
# Использование
result_int: int = identity(42) # Тип T выводится как int
result_str: str = identity("hello") # Тип T выводится как str
Более сложный пример — обобщённый класс Box, который хранит значение произвольного типа:
from typing import TypeVar, Generic
T = TypeVar('T')
class Box(Generic[T]):
def __init__(self, content: T) -> None:
self.content = content
def get_content(self) -> T:
return self.content
# Использование
box_int: Box[int] = Box(100)
box_str: Box[str] = Box("text")
print(box_int.get_content() + 5) # Работает, т.к. content — int
TypeVar также поддерживает ограничения (bounds) и вариантивность (covariant/contravariant), что позволяет создавать более строгие типы. Например, ограничение типа только числами:
from typing import TypeVar, Union
Numeric = TypeVar('Numeric', int, float) # T может быть только int или float
def double(x: Numeric) -> Numeric:
return x * 2
print(double(10)) # OK
print(double(3.14)) # OK
# double("string") # Ошибка типа: строка не входит в Numeric
Вывод: TypeVar стоит применять при разработке библиотек, фреймворков или любого кода, где требуется гибкость работы с разными типами без потери преимуществ статической типизации. Это особенно полезно для создания переиспользуемых компонентов, таких как контейнеры, утилиты обработки данных или декораторы.
Уровень
Рейтинг:
3
Сложность:
5
Навыки
TypeScript
Python
Ключевые слова
Подпишись на Python Developer в телеграм