Аннотации типов в Python. Практикуемся 👷🏻‍♀️



📍Привет, друзья! Мы с вами уже говорили про модуль typing. Кратко напомню, этот модуль обеспечивает поддержку подсказок различных типов данных во время выполнения вашей программы. Подробнее можете прочитать в отдельном посте, там мы подробнее обсуждаем typing.



👉 Сегодня мы поговорим про некоторые тонкости, а именно постараемся разобрать отличия Tuple, Collection и Iterable. Почему я решила отдельно об этом написать? Часто у начинающих специалистов прослеживаю на ревью одни и те же недочеты, джуны очень любят использовать Tuple, а про Collection и Iterable забывают. Хотя, разобравшись в коде, понимают, что в принципе тип Tuple (например, для входных параметров функции) избыточен.



Главный принцип, который стоит держать в голове при определении спецификации типов, звучит для меня примерно так: «Указывайте наиболее общий тип параметров на входе и наиболее конкретный тип параметров на выходе»



1️⃣ Почему важно про это помнить? Часто над кодом программы работает команда специалистов, и если у входного параметра вы указываете тип Tuple, но понимаете, что конкретно в вашем случае это избыточный тип для входного параметра, то можете доставить некоторые неудобства коллегам, которые на вход вашему методу готовят, например, список, вместо кортежа.



2️⃣ Посмотрите на входную переменную users на картинке под номером 1, понятно, что в теле функции она будет использоваться только для итерирования. Таким образом, не обязательно запрашивать тип Tuple для этой переменной: users может быть кортежем, списком или даже собственным типом. Поэтому достаточно указать тип Iterable, смотреть на картинку под номером 2.

 

3️⃣ В данном случае у входной переменной мы указывает тип Collection, так как нам не принципиально, чтобы users был конкретным типом коллекции (например, списком или множеством), смотрите пример на картинке под номером 3.

 

А вот тип Tuple лучше использовать в тех случаях, когда нам принципиально на входе получать конкретное количество значений.

Например, если требуется, чтобы входная переменная представляла пару чисел: tp.Tuple[int, int]



❗️P.S. Сейчас вместо Tuple/List … и других структур данных можно также использовать tuple, list …, то есть лишний раз импортировать из typing их не нужно