Блог
Python

Типизация и type hints в Python: как читать на собеседовании

Типизация в Python — тема, которая на собеседовании внешне выглядит простой, но проверяет понимание философии языка. Python остаётся динамически типизированным языком, но type hints (аннотации типов) стали фактическим стандартом в коммерческой разработке, и умение их читать и писать всё чаще ожидают даже от Junior.

Что такое type hints и зачем они нужны

def greet(name: str, age: int) -> str:
return f'{name}, тебе {age} лет'

print(greet('Анна', 28)) # Анна, тебе 28 лет

name: str и age: int — аннотации типов аргументов, -> str — аннотация типа возвращаемого значения. Важно понимать: type hints не заставляют Python проверять типы во время выполнения — вы всё ещё можете вызвать greet(123, 'abc'), и код не упадёт с ошибкой типа сам по себе. Type hints — это подсказка для разработчика, редактора кода и специальных инструментов статического анализа, а не встроенная защита времени выполнения.

Проверка типов — отдельный инструмент

def greet(name: str, age: int) -> str:
return f'{name}, тебе {age} лет'

greet(123, 'abc') # Python это выполнит без ошибки на этом этапе!

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

Типы для коллекций

from typing import List, Dict, Optional

def get_names(users: List[Dict[str, str]]) -> List[str]:
return [user['name'] for user in users]

def find_user(user_id: int) -> Optional[str]:
users = {1: 'Анна', 2: 'Борис'}
return users.get(user_id) # вернёт None, если ключа нет

List[Dict[str, str]] описывает список словарей со строковыми ключами и значениями. Optional[str] означает «либо str, либо None» — распространённый паттерн для функций, которые могут не найти результат. В современных версиях Python можно писать короче, без импорта из typing: начиная с Python 3.9 — list[dict[str, str]] вместо List[Dict[str, str]] (PEP 585), а начиная с Python 3.10 — str | None вместо Optional[str] (PEP 604).

Type hints для собственных классов

class User:
def __init__(self, name: str, age: int):
self.name = name
self.age = age

def print_user(user: User) -> None:
print(f'{user.name}, {user.age}')

Аннотация user: User показывает, что функция ожидает именно объект класса User, а не произвольный аргумент. -> None явно указывает, что функция ничего не возвращает — это часто пропускают, хотя такая аннотация тоже часть хорошего стиля.

Частые вопросы про типизацию в Python

Заставляют ли type hints Python проверять типы во время выполнения? Нет. Type hints — это аннотации для разработчиков, редакторов кода и инструментов статического анализа вроде mypy. Сам интерпретатор Python во время обычного выполнения кода их не проверяет и не блокирует несоответствия.
Обязательно ли использовать type hints в Python? Формально нет — язык остаётся динамически типизированным без них. Но в коммерческой разработке type hints стали фактическим стандартом, потому что упрощают чтение чужого кода и ловят ошибки раньше, если использовать вместе с mypy.
Как проверить, что аннотации типов реально соблюдаются в коде? Через отдельный инструмент статического анализа, самый распространённый — mypy. Он запускается отдельно от обычного выполнения программы и анализирует код на соответствие аннотациям.
В чём разница между Optional[str] и просто str? Optional[str] означает, что значение может быть либо строкой, либо None. Просто str подразумевает, что значение всегда будет строкой. Это важное различие для функций поиска, которые могут не найти результат и вернуть None.

Закрепить типизацию на практике

mypy и Optional разбираются быстрее на своих ошибках, чем в теории. Потренироваться можно на тренажёре Python Arena от Quality Academy — 1339 задач уровней Easy/Medium/Hard/Expert.

-------

Полезные ссылки школы

Сайт Quality Academy:
/main
Telegram-канал:
https://t.me/quality_academy
YouTube-канал:
https://www.youtube.com/@quality_academy
ВКонтакте:
https://vk.com/quality_academy
Канал отзывов учеников (58+ отзывов):
https://t.me/quality_academy_reviews
Задать вопрос менеджеру:
https://t.me/quality_academy_bot
Тест «Подойдёт ли вам тестирование»:
https://quiz.quality-academy.ru
5000+ вопросов с собесов тестировщика — бот-тренажёр:
https://t.me/quality_academy_interview_bot
3 практические задачи и дорожная карта:
https://t.me/quality_academy_tasks_bot
Бесплатные тренажёры — SQL Arena, Playwright Arena, Python Arena:
SQL Arena · Playwright Arena · Python Arena