Что такое проверка типов в Python и как она работает

Ответ

Проверка типов (type checking) — это процесс анализа кода с целью убедиться, что типы данных, используемые в операциях, совместимы друг с другом. В Python существует два подхода:

  1. Динамическая типизация (по умолчанию) Проверка типов происходит во время выполнения кода. Если операция недопустима (например, сложение числа и строки), интерпретатор вызовет исключение TypeError.

    # Этот код выполнится, но упадет с ошибкой TypeError
    def add(a, b):
        return a + b
    
    add(5, "text") # Ошибка возникнет только в момент вызова
  2. Статическая типизация (опционально) Проверка выполняется до запуска программы с помощью специальных инструментов (линтеров), таких как mypy. Для этого используется синтаксис аннотаций типов (type hints), введенный в PEP 484.

    Пример со статической проверкой:

    # mypy обнаружит ошибку до запуска этого кода
    def greet(name: str) -> str:
        return f"Hello, {name}"
    
    greet("Alice")  # OK
    greet(42)       # Ошибка: Argument 1 to "greet" has incompatible type "int"; expected "str"

Ключевые преимущества статической проверки:

  • Раннее обнаружение ошибок: Проблемы с типами выявляются на этапе разработки, а не у пользователя.
  • Улучшение читаемости: Аннотации служат документацией, делая код понятнее.
  • Помощь IDE: Редакторы кода используют аннотации для более точного автодополнения и анализа.

Ответ 18+ 🔞

А, слушай, ну это же про ту самую магию, когда твой код не превращается в тыкву в самый неподходящий момент! Проверка типов, блядь — это как раз про то, чтобы не вышло, что ты складываешь помидоры с гвоздями, а потом охуеваешь от результата.

Вот смотри, в Питоне, этой нашей свободолюбивой зверюге, по умолчанию всё — динамика, ёпта! Проверяет он типы прямо на ходу, когда код уже бежит. Сделал какую-то хуйню — сложил число со строкой — он тебе тут же, на месте, и выдаст: «Э, дружок-пирожок, TypeError, иди нахуй, так нельзя».

# Вот эта штука скомпилируется, но потом, в самый ответственный момент, пизданет!
def сложить(a, b):
    return a + b

сложить(5, "текст") # И вот тут-то тебя и накроет ошибкой, когда уже поздно пить боржоми.

Ну а есть второй путь — для параноиков и любителей порядка, блядь. Статическая проверка. Это когда ты заранее, как хитрая жопа, расставляешь по коду подсказки-аннотации, а потом специальный стукач, типа mypy, проходит по нему и говорит: «Э, мудила, тут у тебя на 42-й строке потенциальный пиздец, чини давай». И всё это — ДО того, как ты вообще запустил скрипт.

Пример, где мы умные и всё предвидим:

# mypy этот код просканирует и сразу начнёт орать, что что-то не так
def поздороваться(имя: str) -> str:
    return f"Привет, {имя}"

поздороваться("Алиса")  # Всё ок, идём дальше
поздороваться(42)       # А вот тут mypy взвоет: "Аргумент 1 для 'поздороваться' имеет несовместимый тип 'int'; ожидался 'str'"

И зачем, спрашивается, этот геморрой? А вот зачем, ебать мои старые костыли:

  • Ловим гадов раньше: Ошибки с типами вылезают не у пользователя в три часа ночи, а у тебя на компе, пока ты пьёшь кофе. Волнение ебать — ноль.
  • Код не как китайская грамота: Аннотации — это такая встроенная документация. Глянул на функцию — и сразу ясно, что она жрёт и что блевать обратно.
  • IDE умнеет: Разные там PyCharm'ы и VS Code смотрят на эти аннотации и начинают тебе такое умное автодополнение подсказывать, что просто охуенно.