Аннотация типов

Описание языка
Python поддерживает динамическую типизацию. Переменная может менять свой тип в зависимости от присвоенного ей значения. Может возникать ошибки в обработке функций.

Также при проектировании программ удобно понимать тип объектов, которые возвращаются или передаются в функцию, без погружения в ее контекст. Для этого удобно поддерживать аннотацию типов данных и модули обработки их.
Аннотация типов данных — это явное указание типа ожидаемых данных при объявлении переменных, классов и функций. При выполнении кода Python игнорирует аннотации типов и не выдаёт ошибок, если типизация нарушена, но она наглядно помогает избегать этого.

Аннотации типов могут считываться сторонними программами, предназначенными для проверки типизации. В случае обнаружения ошибок эти программы сообщат разработчику о проблемах.

Популярные пакеты отслеживания:
  • Mypy - анализатор от сообщества и разработчиков Python
  • Pyre анализатор о Facebook.
  • Pytype — анализатор от Google.
  • Pylance — анализатор от Майкрософт.
Аннотация простых типов
Для аннотации простых типов данных используется обозначение: int, float, str, bool. Также используется None для указания что функция не имеет возврата.
Пример

var1: int =5
var2: float = 5.0
var3: str = '5'
var4: bool = True

# Аннотация функций

def degree (var: int) -> int:
   return var*var

def answer (var: str) ->None:
   print(var)

# Аннотация в классе

class Example:
    Name: int = 5
    def __init__(self, var: str = 'Привет') -> None:
        self.x = x
    def ansmer (self) -> str:
        return self.x*5
Аннотации коллекций
Для типизации коллекций множеств, словарей, списков и кортежей используется обозначение: set, dict, list, tuple. Также используется пакет typing, где можно более гибко указывать аннотацию
Пример

var1: set = {1, 2, 3, 4, 5, 6,}    

var2: dict= {'forty_two': 42, 'hundred': 100,}        

var3: list = [1, 2, 3, 4,]  

var4: tuple = (1, 2, 'привет', 1.618,) 
Пакет typing
Функция может принимать несколько типов, а переменная может содержать число или None. В таких случаях для аннотирования типов данных применяют компоновщики.

С помощью компоновщика можно указать для переменной несколько возможных типов данных. Описание типов данных для компоновщиков указывается в квадратных скобках.

Компоновщики поддерживают вложенность: типы данных для компоновщика могут быть описаны другим компоновщиком.

Компоновщик Optional аннотирует типы данных для переменных, которые могут принять тип или значение None.
Компоновщик Union позволяет указывать типы данных через запятую.
Компоновoик Any позволяет указывать, что переменная может принимать объекты различных типов.
Пример

from typing import Optional

x: Optional[str] = 'Строка'

х: Union[int, str] = 5

x: Any = 12
Пакет typing для коллекций
Пакет позволяет указывать коллекции с аннотацией типов внутренних объектов. Типы имеют значения: Set, Dict,List, Tuple.
Пример использования пакета typing

var1: Set[int] = {1, 2, 3, 4, 5, 6,}    

var2: Dict[str, int]= {'forty_two': 42, 'hundred': 100,}        

var3: List[int] = [1, 2, 3, 4,]  

var4: Tuple [int, int, str, float] = (1, 2, 'привет', 1.618,) 
Собственные объекты
При написании кода можно указывать типы объектов от реализуемого класса. Например функция обрабатывает объекты только определенного класса
Пример

class Partner:
    def __init__(self, first_name: str, last_name: str) -> None:
        self.first_name = first_name
        self.last_name = last_name
    def ansmer (self) -> str:
        return f' Партнер: {first_name} {last_name}'

def registration ( member: Partner) -> str:
    return f'Регистрация участника {member.first_name} {member.last_name}'
Проверка типизации через IDE
Проверить типизацию можно прямо в IDE при установленном пакете mypy или аналогичном.

В Visual Studio Code в качестве линтера укажите mypy:

Ctrl+Shift+P → Python: Select Linter mypy