7 Добавление типов в функцию

Давайте рассмотрим пример функции, которая получает два аргумента и возвращает значение, указывающее их сумму:

 def two_sum(a, b):
    return a + b

 

Глядя на этот код, один не может безопасно и без сомнения указать тип аргументов для функции two_sum . Он работает как при поставке с int значения:

 print(two_sum(2, 1))  # result: 3

 

и со строками:

 print(two_sum("a", "b"))  # result: "ab"

 

а также с другими значениями, например, list с, tuple ов и так далее.

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

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

Для того, чтобы указать , что мы хотим , чтобы int типы мы можем изменить наше определение функции выглядеть следующим образом :

 def two_sum(a: int, b: int):
    return a + b

 

Аннотации следовать имя аргумента и отделены друг от друга : характер.

Точно так же, чтобы указать только str тип разрешен, мы бы изменить нашу функцию , чтобы определить его:

 def two_sum(a: str, b: str): 
    return a + b

 

Помимо указания типа аргументов, можно также указать возвращаемое значение вызова функции. Это делается путем добавления -> символа с последующим типом после закрывающей скобки в списке аргументов , но до того , как : в конце объявления функции:

 def two_sum(a: int, b: int) -> int: 
    return a + b

 

Теперь мы показали , что возвращаемое значение при вызове two_sum должно быть типа int . Точно так же мы можем определить соответствующие значения для str , float , list , set и другие.

Хотя подсказки типов в основном используются средствами проверки типов и средами разработки, иногда вам может потребоваться получить их. Это может быть сделано с помощью __annotations__ специального атрибута:

 two_sum.__annotations__
# {'a': <class 'int'>, 'b': <class 'int'>, 'return': <class 'int'>}