Типизация в Python — тема, которая на собеседовании внешне выглядит простой, но проверяет понимание философии языка. Python остаётся динамически типизированным языком, но type hints (аннотации типов) стали фактическим стандартом в коммерческой разработке, и умение их читать и писать всё чаще ожидают даже от Junior.
Что такое type hints и зачем они нужны
def greet(name: str, age: int) -> str:
return f'{name}, тебе {age} лет'
print(greet('Анна', 28)) # Анна, тебе 28 лет
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 это выполнит без ошибки на этом этапе!
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, если ключа нет
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}')
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.
Обязательно ли использовать 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:
https://quality-academy.ru/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
https://quality-academy.ru/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