Короткий ответ
В языке с динамической типизацией проверка типов происходит во время исполнения программы, а не на этапе компиляции. В Python не нужно объявлять тип переменной: интерпретатор выводит его из присвоенного значения, поэтому одна переменная может хранить объекты разных типов.
Как это работает подробнее
Динамическая типизация в Python сочетается с сильной: это разные оси, и вместе они определяют поведение языка.
- Вывод типа по значению. Переменная не привязана к типу: интерпретатор назначает его в момент присваивания, и позже переменной можно присвоить значение другого типа.
- Сильная типизация. Python не выполняет неявных преобразований, если они небезопасны: например, сложение строки с числом приводит к ошибке
TypeError. - Проверка в рантайме. Ошибки, связанные с типами, обнаруживаются при выполнении кода, а не до запуска, что требует внимательности и тестов.
Пример кода
Переменная меняет тип
x = 10 # x — целое число
x = 'Hello' # теперь x — строкаЧто использовать на практике
- Компактный код. Отсутствие объявлений типов ускоряет написание и сокращает объём кода.
- Аннотации типов. Для самодокументирования добавляй аннотации: они не влияют на поведение интерпретатора, но помогают разработчикам и инструментам анализа.
- Внимательность. Рассчитывай, что ошибки типов проявятся в рантайме, поэтому покрывай код тестами.
Подводные камни
- Поздние ошибки. Неверный тип обнаруживается только при выполнении строки, а не в момент написания кода.