На этом шаге мы поговорим о полезности аннотаций типов.
Теперь, когда вы знаете, что такое аннотации типов, у вас может возникнуть вопрос: почему вокруг них так много шума? В конце концов, как вы только что узнали, Python игнорирует аннотации типов во время выполнения программы. Зачем же тратить время на добавление аннотаций типов в код, если интерпретатору Python они безразличны? Как уже отмечалось, аннотации типов хороши по двум основным причинам: они автодокументируют код и позволяют средству проверки типов проверять программу перед ее выполнением.
В большинстве языков программирования со статической типизацией, таких как Java или Haskell, необходимые объявления типов очень четко показывают, каких параметров ожидает функция (или метод) и какой тип она будет возвращать. Это до некоторой степени облегчает бремя написания документации для программиста. Например, совершенно не обязательно указывать, что следующий метод Java ожидает в качестве входных параметров или каков его возвращаемый тип:
/ * Функция eat_world принимает данные типа World, * / / * возвращает сумму денег, сгенерированную как отказ * / public float eatWorld(World w, Software s) { ... }
Сравните это с документацией, необходимой для эквивалентного метода, написанного на традиционном Python, без аннотаций типов:
# Функция eat_world # Параметры: # w - данные типа World, мир, который можно съесть # s - данные типа Software, программа, позволяющая съесть мир # Возвращает: # количество денег, получаемых от поедания мира, в формате float def eat_world(w, s):
Позволяя программисту самостоятельно документировать код, аннотации типов делают документацию Python какой же лаконичной, как и в статически типизированных языках:
# Функция eat_world принимает данные типа World, # возвращает сумму денег, сгенерированную как отказ def eat_world(w: World, s: Software) -> float:
Это, конечно, крайность. Представьте, что вы наследуете базу кода, в которой вообще нет комментариев. Что проще: использовать базу кодов без комментариев с аннотациями типов или без аннотаций типов? Аннотации типов избавят вас от необходимости копаться в реальном коде функции, лишенной комментариев, чтобы понять, какие типы нужно ей передавать в качестве параметров и какой тип ожидать от нее на выходе.
Помните, что аннотация типа - это, по сути, способ указать, какой тип ожидается в программе в какой-то момент. Тем не менее Python ничего не делает, чтобы проверить это ожидание. Именно здесь на помощь приходит средство проверки типов. Оно принимает файл с исходным кодом Python, в котором указаны аннотации типов, и проверяет, на самом ли деле они соответствуют действительности при выполнении программы.
Существует несколько средств проверки типа для аннотаций типов Python. Например, проверка типов встроена в популярную IDE Python PyCharm. При редактировании программы с аннотациями типов в PyCharm среда автоматически указывает на ошибки типов. Это помогает обнаружить их прежде, чем вы закончите писать функцию.
Одной из самых известных программ проверки типов Python была mypy. Проект mypy возглавляет Гвидо ван Россум - тот самый человек, который создал сам Python. Едва ли после этого у вас останутся сомнения в том, что аннотации типов потенциально могут сыграть очень важную роль в будущем Python. С программой mypy работать легко - достаточно запустить команду mypy example.ру, где example.ру - имя файла, который нужно проверить, mypy выведет в консоль все ошибки типа, найденные в программе, или не выведет ничего, если ошибок нет.
В будущем могут появиться и другие способы использования аннотаций типов. В настоящее время они не влияют на производительность работающей программы Python. (Еще раз повторяем они игнорируются на этапе выполнения.) Но, вероятно в будущих версиях Python информация о типах, полученная из аннотаций типов, будет применяться для выполнения оптимизации. В таком случае, возможно, вы сможете ускорить выполнение программы на Python, просто добавив аннотации типов. Конечно, пока что это только предположения. Нам ничего не известно о планах по реализации оптимизации на основе аннотаций типов в Python.
На следующем шаге мы рассмотрим недостатки аннотаций типов.