Автор оригинала: Pankaj Kumar.
1. Что такое проверка типа?
Проверка типа – это функция языка программирования, которая указывает, как создаются переменные, и их типы идентифицируются языковым компилятором или интерпретатором.
2. Каковы различные типы проверки типа?
Язык программирования может быть классифицирован в следующем на основе проверки типа.
- Статически напечатанные языки – C, Java, C ++ и др.
- Динамически напечатанные языки – JavaScript, Python, Ruby и др.
2.1) Что такое статический тип проверки?
Тип переменной известен на Время компиляции Отказ Тип переменной фиксирован, и мы не можем изменить его в более позднюю точку времени.
Давайте посмотрим на переменную декларацию в Java.
String str = "Hello";
Если мы попытаемся изменить тип переменной или назначить значение несовместимого типа, компилятор бросит ошибку.
str = 10; // Type mismatch: cannot convert from int to String int str = 10; // Duplicate local variable str
2.2) Что такое проверка динамического типа?
Тип переменной определяется на Во время выполнения Отказ Мы не указываем тип переменной в коде. Код ведет себя по-разному на основе типа объекта во время выполнения.
Давайте посмотрим на пример определения функции в Python.
def add(x, y): return x + y print(add(10, 5)) print(add('A', 'B'))
Если аргументы функции являются целыми числами, сумма возвращается. Если они строки, они объединяются и возвращаются.
Если мы пройдем любой другой пользовательский объект, мы можем получить другой ответ или ошибка поднята, если оператор «+» не поддерживается их.
2.3) Статически напечатанные языки против динамически набранных языков
- Преимущество статически напечатанного языка состоит в том, что многие ошибки, связанные с несовместимыми типами, пойманы в момент компиляции. То же самое не верно с динамически напечатанными языками. Это может занять много времени, прежде чем вы получите ошибку, связанную с несовместимым типом.
- Преимущество динамически напечатанного языка – более короткое время разработки. Но эта польза исчезает, когда размер проекта увеличивается. Очень трудно отладить ошибку программы, из-за неправильного типа, поскольку это произойдет только один раз в то время, на основе пользовательского ввода или данных, полученных из другого источника.
3. Утка печатает в Python
Утка, набрав – это концепция динамически наведенных языков программирования. Тип объекта менее важен, чем функции, которые он определяет.
Давайте посмотрим на это при примере пользовательского объекта и функции Add (), которую мы определили.
def add(x, y): return x + y class Data: def __init__(self, i): self.id = i d1 = Data(10) d2 = Data(5) print(add(d1, d2))
Этот код будет производить следующую ошибку выполнения:
Traceback (most recent call last): File "/Users/pankaj/Documents/PycharmProjects/hello-world/journaldev/type_checking.py", line 12, inprint(add(d1, d2)) File "/Users/pankaj/Documents/PycharmProjects/hello-world/journaldev/type_checking.py", line 2, in add return x + y TypeError: unsupported operand type(s) for +: 'Data' and 'Data'
Если мы хотим, чтобы наш объект поддерживать оператор дополнения, все, что нам нужно сделать, это определить функцию __add __ () для него.
def __add__(self, other): return self.id + other.id
Теперь оператор печати напечатает 15, и по телефону не будет ошибок.
Так, по сути, тип объекта не имеет значения вообще. До тех пор, пока требуемые функции определены для поддержки операции, не будут никаких проблем из-за типа объекта.
4. Введите подсказки в Python
Python 3.5 Добавлена поддержка подсказки типа с использованием модуля печати. Как предполагает имя, это способ для разработчиков наметить ожидаемый тип аргументов функции и типы возврата.
Допустим, у нас есть функция для выполнения некоторых операций на двух числах.
def calculate(x, y, op='sum'): if op == 'divide': return x // y if op == 'difference': return x - y if op == 'multiply': return x * y # default is sum return x + y
Несмотря на то, что он предназначен только для чисел, он тоже будет работать для струнных аргументов.
print(calculate(10, 3, 'divide')) # 3 print(calculate(10, 5)) # 15 print(calculate('A', 'B')) # AB
Давайте посмотрим, как добавить тип подсказки для данной функции.
def calculate1(x: int, y: int, op: str = 'sum') -> int: # same code as above
Подсказки типа аргумента функции снабжены толстой кишки (:) и тип возврата, используя -> знак.
Но это не прилагает к аргументу функции и типы возврата. Код все равно будет работать для других типов аргументов.
Но сторонние инструменты, такие как тип шашки, IDES, Linters и т. Д. Могут разбирать это, чтобы предупредить нас для возможности неправильных типов аргументов. Например, если мы пройдем строковые аргументы этой функции, IDE Pycharm будет производить предупреждающее сообщение как « ожидаемый тип» int ‘, Get’ Str ‘вместо этого “.
4.1) Преимущества типа подсказок
- Подсказки типа также документируют код для функций ожидаемых типов аргументов и тип возврата.
- Он помогает пользователям API, чтобы убедиться, что правильный тип аргументов передается в функцию.
- Помогает улучшить IDE, тип шашки и линтам предупреждающих пользователей, когда в функцию передается несовместимый тип аргумента.
4.2) Недостатки типа подсказок
- Нет никаких временных пособий по подсказкам типа. Он не обеспечивает применения типов или повышает любое предупреждение или ошибки, если пропускается другой тип аргумента.
- Подсказки типа больше похожи на документацию. Если функция изменена, и разработчик пропускается, чтобы соответственно изменить подсказки типа, он даст неправильное сообщение для разработчика, используя функцию. Поддержка подсказки типа – это потребление времени и требует усилий разработчиков.
- Он замедляет скорость программы немного.
- Подсказки типа были введены в Python 3.5, поэтому он довольно новый и не будет работать с более старыми версиями Python.
4.3) __antations__ атрибут
Функции Python имеют атрибут __nathations__, который содержит информацию о подсказках типа.
def calculate(x, y, op='sum'): pass def calculate1(x: int, y: int, op: str = 'sum') -> int: pass print(calculate.__annotations__) # {} print(calculate1.__annotations__) # {'x':, 'y': , 'op': , 'return': }
5. Проверка типа Runtime Python
Мы можем использовать функцию типа (), чтобы получить тип переменной во время выполнения.
>>> x = 10 >>> type(x)>>> >>> s1 = 'Hello' >>> type(s1) >>>
Мы также можем использовать функцию IsinStance (), чтобы проверить, является ли переменная определенного типа или нет. Эта функция возвращает логическое значение и принимает два аргумента.
>>> x = 10 >>> isinstance(x, int) True >>> isinstance(x, str) False >>> >>> o = object() >>> isinstance(o, (int, str, object)) True
6. Проверка статического типа Python
Python – это динамически напечатанный язык. Но мы можем использовать Mypy модуль Для проверки статического типа. Обратите внимание, что это будет работать только тогда, когда мы добавили тип подсказки к функции.
Модуль Mypy проверит код и повышает ошибки, если мы вызываем функцию с несовместимыми аргументами типа данных. Мы можем установить Mypy Module с помощью команды PIP.
pip install mypy
Допустим, у нас есть сценарий Python type_checking.py
с контентом ниже.
def calculate(x, y, op='sum'): pass def calculate1(x: int, y: int, op: str = 'sum') -> int: pass calculate('a', 'b') calculate1('a', 'b')
Теперь мы можем запустить MAPY из командной строки, чтобы проверить этот файл для типов аргументов функции.
$ mypy type_checking.py type_checking.py:10: error: Argument 1 to "calculate1" has incompatible type "str"; expected "int" type_checking.py:10: error: Argument 2 to "calculate1" has incompatible type "str"; expected "int" Found 2 errors in 1 file (checked 1 source file) $
7. Заключение
В этом руководстве мы узнали о статически набранных и динамично набранных языках. Мы также узнали, что для большой кодовой базы статически набранный код более выгоден. Мы узнали о подсказках типа в Python и как использовать Mypy Module в качестве проверки статического типа.