Нужно ли стажеру/джуну знать и/или использовать в Python аннотации типов?
===========================================================================

1. Проверяют ли навыки работы с аннотациями типов на собесах?
2. Стоит ли использовать их в своих pet-проектах?
3. Знаю что обычно их используют в "больших" проектах, но как понять, что проект большой? Вот интернет-магазин на Django собранный за неделю - это достаточно большой проект для использования аннотаций?
4. К тому-же не всегда можно сказать, насколько вырастет проект в будущем - значит ли это что аннотации желательно использовать всегда?
5. Где предпочтительно их писать: прямо в коде - вроде падает читабельность (а она важна), в отдельных stub-файлах - тяжелее поддерживать и опять-таки страдает читабельность (смотреть параллельно в два файла не слишком удобно)?

  

Upd:  

 Вывод: на собесах не спрашивают, и если и использовать их то крайне ограниченно и прямо в коде вместо stub-файлов. 

 Пятнадцать лет пишу на Python. Писал на нём очень масштабные проекты. При этом никогда не использовал и не собираюсь использовать аннотации типов. Считаю, что если хочется указывать типы, стоит использовать статически типизированный язык. 

 Анотации использую только тогда когда pycharm сам не справляется с понимание что за объект, причем делаю это просто через инлайн коммент:  

  

my\_object = obj # type: MyClass  

  

И всё, pycharm снова подсказывает мне какие аттрибуты и методы есть у my\_object. Для популярных фреймворков этого делать не надо, для них у пайчарма есть typesheds и он сам всё знает о возможных типах в методах  

  

Если добавлять аннотации везде, где надо и где не надо, код превращается в сложно перевариваемую мешанину из стрелочек.   

  

На собесах про это не спрашивают 

 Вопрос в общем-то к питону особо и не относится, а скорее к "дисциплине программирования" вообще. Когда пишешь часто, много и разные вещи, которые часто забрасываешь (порой вынужденно), то единственным способом не глядеть через полгода на собственную же функцию аки баран на новые ворота является предварение ее комментарием, где написано, что на входе, что на выходе и какие особенности работы.  

Это здорово экономит время. 

 1. На собесах проверяют ваши навыки того или иного языка и то, как вы им владеете. Уметь пользоваться аннотациями типов это навык, так что можете считать что косвенно - проверяют.  

2. Стоит.  

3. Использование аннотаций не привязано к размеру проекта, так как вы правильно заметили, сложно найти информацию о том, какой проект является большим, а какой маленьким.  

4. Аннотации желательно использовать всегда.  

5. Писать прямо в коде, читабельность не падает.  

Читабельность может быть и падает, если функции принимают или отдают вложенные типы, но это стоимость того, что вы сможете быстро понять, какие объекты нужно подать в функцию или какие объекты ожидать в ее выходе.  

```
def some_func(var1: int, list1: List[int, str], dict1: Dict[str, List[int]]) -> Tuple[str, str]:
    # some logic
    result1 =  # some string result 
    result2 =  # some string result 
    return result1, result2
```
  

Если представить, что аннотаций нет, как вы будете узнавать где какой тип данных используется?  

```
def some_func(var1, list1, dict1):
    # some logic
    result1 =  # some string result 
    result2 =  # some string result 
    return result1, result2
```
  

Даже в этом примере видно, насколько осиротела функция без аннотаций, чтобы понять что подается на выход нужно смотреть на результат присвоения значений объекту result, а чтобы понять что же за var1 и что нужно подать в функцию вам придется смотреть на то место, где var1 начинает использоваться.  

А теперь представьте что это ваш пет проект и вы его забросили на месяц, вы не сможете вспомнить ни одну функцию, вам придется над каждой функцией сидеть и думать, что же она возвращает и делает внутри. С аннотациями вы просто посмотрите на них и все станет понятно. То же самое, но в еще больше степени относится к тому, если код без аннотаций вам достанется по наследству от коллеги или от какого-то подрядчика, это будет больно и неприятно. 

[mkone112](http://qna.habr.com/user/mkone112), поделюсь своими соображениями.  

Более года пишу на Python3 и недавно в докладе [bobuk](https://www.youtube.com/watch?v=77B2-Pk1fls) (в коде) увидел аннотацию типов. Загорелся и стал её использовать. Но, спустя время, понял, что **для меня** аннотация сильно загромождает код и никак не облегчает работу с ним. Перестал везде "пихать" аннотацию.   

**Мои личные выводы:**  

  

**I. Сильно страдает читаемость.**  

Аннотация не сделает код лучше, это не панацея. Я просто учу язык и программирую. Пробую всякие штуки, что-то входит в повседневную практику, а что-то отваливается (как грязь на одежде, высохла и сама отвалилась).  

  

**II. Допускаю, что в дальнейшем аннотация может пригодиться.**   

1. Бывает так, что ты открываешь свой код через полгода и ... глаза кровоточат. Что это? Зачем это? Тут кому-то может помочь аннотация типов. Лично мне помогает [правильное наименование переменных, структур и функций](https://youtu.be/z5WkDQVeYU4?list=PLungh_Npcg_pTYpTJaH-WgHYgDkFsQ3mt). Например, при написании кода всегда к имени функции можно добавить **func\_**, к имени списка - **l** или **list** и т.д.  

2. Ещё есть предположение, что аннотация используется в процессе тестирования. Сейчас мне это видится так - весь код (весь проект) оборачивается в некую библиотеку (pytest) и перед продакшеном тестируется на ошибки. Вот тут срабатывает магия и помогает аннотация типов. Но пока это только мои размышления, так как я НОЛЬ в тестировании.   

3. Пока я ещё не погрузился в ООП, только собираюсь изучать. Но местами в коде видел, что при разработке класса используется аннотация. Мне показалось, там она прямо на своём месте, **очень удобно**.  

  

**В целом для себя я:**   

- понял как она работает,   

- поверхностно изучил синтаксис,   

- в своём коде пока не использую,   

- зато теперь, когда вижу код с аннотацией типов, не пугаюсь и понимаю - ага вот здесь аннотация  

- как только пойму в каких местах она нужна, сразу стану её использовать