Подсказки типа Python, mypy, статическая проверка в Python

Беглый взгляд на подсказки типа Python

Подсказки типа в Python

Традиционно python - это язык с динамической типизацией, в котором никогда не было строгой проверки типов данных, как в Java или любых других статически типизированных языках.

Примечание. Для лиц, не являющихся участниками, эта статья также доступна по адресу https://dineshkumarkb.com/tech/what-are-pythons-type-hints/

До Python 3.5 - проверка типа данных

До появления PEP-484, то есть подсказок типов в python, мы выполняли проверку типов (если это было необходимо), используя следующие способы. Если быть точным, по крайней мере, я использовал следующие способы.

Метод 1:

def display_name(name):
    if type(name) ==  str:
        print("Hello {}".format(name))
    else:
        raise TypeError("name must be of str type")
Output:
display("pythonista") --> Hello pythonista
display(123) --> TypeError: name must be of str type

Метод 2:

Давайте посмотрим, как еще можно проверить типы данных.

def display_name(name):
    if isinstance(name, str):
        print("Hello {}".format(name))
    else:
        raise TypeError("name must be of str type")
Output:
display("pythonista") --> Hello pythonista
display(123) --> TypeError: name must be of str type

Ну, это же работа, не так ли? Да, более или менее. Но это нормально, если у метода мало аргументов. Что делать, если функция или метод имеет 8 аргументов с разными типами данных, как показано ниже.

def display_info(name,age, id, address, job, is_available_for_work):
   ...

Мы по-прежнему можем выполнять проверку типов, как делали раньше. Однако количество строк кода будет увеличиваться с увеличением количества аргументов, и код будет выглядеть загроможденным множеством операторов if-else.

Введение в подсказки типов в Python 3.5

Примечание. Среда выполнения Python не применяет аннотации типов функций и переменных. Их могут использовать сторонние инструменты, такие как средства проверки типов, IDE, линтеры и т. Д.

Из документации Типовые подсказки могут быть встроенными классами (включая те, которые определены в стандартной библиотеке или сторонних модулях расширения), абстрактными базовыми классами, типами, доступными в модуле типов, и определяемыми пользователем классами (включая те, которые определены в стандартной библиотеке или сторонних модулях).

Https://docs.python.org/3/library/typing.html

Итак, что делает подсказка типа? Выдает ли он ошибки во время компиляции, если тип данных не совпадает?

Ну не совсем.

Python как язык НЕ генерирует никаких ошибок при проверке типов данных, если не выполняется какая-либо конкретная операция с неправильным типом данных (например, конкатенация str выполняется с int).

Однако синтаксис подсказки типа может дать очень четкое представление другим разработчикам и пользователям SDK / библиотеки о том, какой тип данных следует использовать. Это в некоторой степени снижает количество потенциальных ошибок. Хорошо! что в этом хорошего? Простой комментарий или строка документации могли бы сделать эту работу. Зачем прилагать столько усилий, чтобы представить это?

Хотя python не требует проверки типов, мы могли бы добиться статической проверки типов, используя подсказки типов с библиотекой mypy.

  1. Установите библиотеку mypy.
pip install mypy

2. Запустите проверку статического типа для любого файла python в терминале с помощью mypy с помощью следующей команды.

mypy filename.py

Теперь давайте намеренно запускаем функцию display_name с неправильными типами.

def display_name(name: str):
    print(f" Hello {name} ")


display_name(1)

Output:
$mypy data_validation.py
data_validation.py:16: error: Argument 1 to "display_name" has incompatible type "int"; expected "str"

Запуск mypy с подсказками типов помогает нам выполнять статическую проверку нашего кода Python и как можно скорее находить ошибки. Он не только вызывает ошибку несовместимого типа, но также указывает номер аргумента неправильного типа.

Давайте вернемся к функции display_info с подсказками по типу

def display_info(name: str, age: int, id: int, 
             address: str, job: str, is_available_for_work: bool):
    ...

Теперь это явно «намекнет» разработчику типов данных, а также выполнение статической проверки укажет на ошибки типа.

mypy можно добавить как плагин к pycharm и запустить статическую проверку. На данный момент поддержка только для pycharm.

Включение плагина mypy в pycharm для статической проверки

  1. Откройте файл → Настройки → Плагины.

2. Выберите MarketPlace.

3. Найдите mypy

4. Установите плагин.

5. Перезагрузите IDE.

6. В нижний колонтитул будет добавлена ​​новая вкладка Mypy.

7. Чтобы выполнить проверку статического типа, щелкните файл правой кнопкой мыши и произнесите «Проверить файл». Это покажет ошибки, если таковые имеются в подсказке Mypy.

Использованная литература:

Http://www.mypy-lang.org/

Https://github.com/leinardi/mypy-pycharm