Что такое type hinting в Python и для чего он используется

Ответ

Type hinting (аннотации типов) — это синтаксис в Python, позволяющий указывать ожидаемые типы данных для переменных, аргументов функций и возвращаемых значений.

Важно: Аннотации типов не влияют на выполнение кода и не делают Python статически типизированным языком. Интерпретатор их игнорирует. Их основная цель — улучшение качества кода.

Основные цели использования:

  1. Статический анализ: Инструменты, такие как mypy или pyright, могут анализировать код до его запуска и находить потенциальные ошибки, связанные с несоответствием типов.
  2. Улучшение читаемости: Аннотации служат дополнительной документацией, делая код более понятным для других разработчиков.
  3. Поддержка IDE: Редакторы кода (VS Code, PyCharm) используют type hints для более точного автодополнения, навигации по коду и выявления ошибок «на лету».

Пример:

from typing import List, Optional

def process_data(items: List[int], user_id: Optional[int] = None) -> str:
    """Обрабатывает список чисел и возвращает отчет."""
    if user_id:
        report = f"Отчет для пользователя {user_id}:n"
    else:
        report = "Анонимный отчет:n"

    total = sum(items)
    report += f"Сумма элементов: {total}"
    return report

# Корректное использование
result = process_data([1, 2, 3], user_id=101)
print(result)

# Статический анализатор (mypy) обнаружит здесь ошибку,
# так как мы передаем строку вместо списка чисел.
# process_data("неверный тип", user_id=102)

Ответ 18+ 🔞

А, слушай, про эти ваши type hints в Python! Ну, это такая штука, когда ты пишешь код и как бы намекаешь, что вот сюда, сука, должен прилететь int, а оттуда, блядь, вылететь str. Но это всё, понимаешь, для галочки! Интерпретатору Python на эти твои намёки, в рот меня чих-пых, вообще похуй! Он их просто игнорирует, как будто их и нет.

А зачем тогда это всё, спрашивается? Ну, во-первых, чтобы всякие умные анализаторы, вроде mypy, могли заранее, до запуска, сказать: «Э, дружок-пирожок, ты тут строку суёшь, а я по твоим же намёкам вижу, что тут список чисел должен быть! Ты ебанутый?». Это называется статический анализ, и он, блядь, реально спасает от тупых ошибок.

Во-вторых, код читать становится проще. Открыл функцию, а там ясно написано, что она жрёт и что блюёт. Не надо гадать, что за хуйню ты туда год назад передавал.

Ну и в-третьих, твоя IDE, будь то VS Code или PyCharm, начинает тебя лучше понимать. Автодополнение умнеет, подсказки становятся точнее. В общем, жизнь налаживается, хоть и ненамного.

Вот смотри, как это выглядит в деле. Код не трогаю, он правильный, оставляю как есть.

from typing import List, Optional

def process_data(items: List[int], user_id: Optional[int] = None) -> str:
    """Обрабатывает список чисел и возвращает отчет."""
    if user_id:
        report = f"Отчет для пользователя {user_id}:n"
    else:
        report = "Анонимный отчет:n"

    total = sum(items)
    report += f"Сумма элементов: {total}"
    return report

# Корректное использование
result = process_data([1, 2, 3], user_id=101)
print(result)

# Статический анализатор (mypy) обнаружит здесь ошибку,
# так как мы передаем строку вместо списка чисел.
# process_data("неверный тип", user_id=102)

Видишь? Функция process_data объявляет: «Дайте мне, блядь, список целых чисел (List[int]) и, может быть, айдишник пользователя (Optional[int]), а я вам взамен, сука, строчку отдам (-> str)». И если какой-нибудь распиздяй попробует запихнуть туда строку, как в закомментированной строчке, то mypy ему такую оплеуху мысленную влепит — мало не покажется. Вот и вся магия, ёпта. Не панацея, но иногда охуенно помогает не наступать на одни и те же грабли.