Типизация в 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 во время выполнения эти несоответствия не отслеживает.
Потренируйтесь на задачах
Python Arena — задачи по Python с автопроверкой: от основ до вопросов с собеседований.
Открыть Python ArenaТипы для коллекций
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, все задачи уровня Easy бесплатно. Про аннотации типов в собственных классах и ООП в целом — в статье «ООП в Python на собеседовании: что реально спрашивают».
Потренируйтесь на задачах
Python Arena — задачи по Python с автопроверкой: от основ до вопросов с собеседований.
Открыть Python ArenaКурс «Инженер по ручному тестированию»
Учим с нуля до трудоустройства: персональный ментор, задания в Jira, подготовка к собеседованиям и поддержка на испытательном сроке.
Узнать о курсеQuality Academy — школа тестировщиков
