Рубрики
Без рубрики

Проверка типа Python

1. Что такое проверка типа? Проверка типа – это функция языка программирования, которая указывает, как создаются переменные, и их типы идентифицированы

Автор оригинала: Pankaj Kumar.

1. Что такое проверка типа?

Проверка типа – это функция языка программирования, которая указывает, как создаются переменные, и их типы идентифицируются языковым компилятором или интерпретатором.

2. Каковы различные типы проверки типа?

Язык программирования может быть классифицирован в следующем на основе проверки типа.

  1. Статически напечатанные языки – C, Java, C ++ и др.
  2. Динамически напечатанные языки – 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) Статически напечатанные языки против динамически набранных языков

  1. Преимущество статически напечатанного языка состоит в том, что многие ошибки, связанные с несовместимыми типами, пойманы в момент компиляции. То же самое не верно с динамически напечатанными языками. Это может занять много времени, прежде чем вы получите ошибку, связанную с несовместимым типом.
  2. Преимущество динамически напечатанного языка – более короткое время разработки. Но эта польза исчезает, когда размер проекта увеличивается. Очень трудно отладить ошибку программы, из-за неправильного типа, поскольку это произойдет только один раз в то время, на основе пользовательского ввода или данных, полученных из другого источника.

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, in 
    print(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 в качестве проверки статического типа.

8. Ссылки