Дженерики в Python, простыми словами
Если вы только начинаете изучать Python и слышите слово дженерики, скорее всего в голове сразу каша: «что это вообще такое?». На самом деле дженерики - это очень простая идея. Представьте, что у вас есть коробка. В коробку можно положить игрушки, яблоки, книжки - всё что угодно.
Но иногда вы хотите, чтобы в коробке лежали только яблоки. А иногда - только игрушки.И вот тут вам помогают generics.
Что такое generics?
Generics - это способ написать класс или функцию один раз, но при этом заранее указать, с каким типом объектов он будет работать. Это как шаблон: «эта коробка для яблок», «эта корзина для бананов», «этот калькулятор для чисел».
В Python для этого используется модуль typing и конструкция TypeVar.
Пример 1. Корзина для предметов
Здесь Box может хранить что угодно: строки, числа, даже смешанные объекты. Это удобно, но небезопасно - легко ошибиться.
Теперь сделаем ту же коробку, но с дженериком:
Теперь в коде, где мы в коробку для яблок пытаемся положить число, mypy и ide подсветит, что мы делаем что-то не то.
Пример 2. Коллекция с ограничением типов
Сделаем корзину (Basket), куда можно складывать предметы только одного типа:
Если попытаться добавить число в Basket[str], ide и mypy сразу скажут, что это ошибка.
Пример 3. Ограниченные дженерики (bound)
Иногда нужно разрешить только числа, а не всё подряд.Тогда мы говорим: «T должен быть числом» (bound=float):
Пример 4. Репозиторий
Представьте, что у нас есть база данных с разными сущностями: User, Product. Вместо того чтобы писать одинаковый код для каждой, мы можем сделать дженерик-репозиторий:
Пример 5. Дженерики + Protocol
А что если мы хотим складывать объекты (например, числа или строки)? Тогда можно сказать: «принимаю любой тип, у которого есть оператор +».
Буду рад быть полезным! Если есть вопросы, можете написать мне в телеграмм! А так же буду очень рад активности в моем телеграмм канале в том числе!