История вопроса:
Динамическая типизация характерна для Python с первых версий. Это означает, что переменные не привязаны к конкретному типу данных заранее, в отличие от языков вроде Java или C++. Тип определяется во время исполнения.
Проблема:
Главная сложность — потеря явного контроля типов. Это усложняет обнаружение ошибок на этапе написания кода, что может привести к логическим багам в рантайме, особенно при масштабировании кода.
Решение:
Python решает эту проблему через duck typing (если объект ведёт себя как утка, то это утка), а также с помощью аннотаций типов (type hints), однако аннотации не обязательны и не проверяются во время выполнения, а только сторонними инструментами.
Пример кода:
x = 42 # int x = "foo" # теперь строка def process(val): return val + val print(process(5)) # 10 print(process("ha")) # haha
Ключевые особенности:
Можно ли использовать одну переменную сначала как список, а потом как число в одном блоке кода, и приведёт ли это к синтаксической ошибке?
Можно — синтаксической ошибки не будет. Ошибка возникнет только при попытке совершить невалидную с новым типом операцию.
x = [1, 2, 3] x = 5 # print(x[0]) # Ошибка будет только при этом вызове
Гарантирует ли type hint в Python то, что переменная всегда будет обладать указанным типом во время исполнения?
Нет — type hint — это лишь подсказка, интерпретатор её не проверяет. Проверять типы могут только linters и mypy.
def foo(x: int) -> int: return x + 1 foo("string") # ошибки не будет до вызова
Является ли тип функции тоже динамическим? Можно ли изменить сигнатуру функции во время исполнения?
Функция — объект первого класса. Тип её можно переопределить, но сигнатуру — нельзя (можно заменить функцию новой).
def f(): return 5 f = lambda: "abc" print(f()) # 'abc'
Негативный кейс
В одном проекте тип входных параметров функции не проверялся, что привело к тому, что данные из пользовательских форм приходили в виде строк, а работали с ними как с числами. Возникали непредсказуемые ошибки на продакшене.
Плюсы:
Быстрое прототипирование, короткие функции, мало boilerplate.
Минусы:
Сложно отлаживать, ошибки проявляются в самых неожиданных местах и только при определённых данных.
Позитивный кейс
При использовании type hints и статической валидации типизации с помощью mypy проблемы обнаруживались на этапе CI/CD до выхода в продакшен.
Плюсы:
Раннее обнаружение потенциальных проблем, лёгкая поддерживаемость кода.
Минусы:
Тратится время на дополнительную проверку, иногда добавляется немного лишнего кода.