Как в Python указать типы для аргументов функции и возвращаемого значения?

Ответ

В Python для указания типов используются аннотации типов (type hints), введенные в PEP 484. Они добавляют информацию о типах, но не влияют на исполнение кода, так как Python остается языком с динамической типизацией.

Основное назначение:

  • Статический анализ: Инструменты, такие как mypy, могут проверить код на наличие ошибок типизации до его запуска.
  • Подсказки в IDE: Редакторы кода используют аннотации для автодополнения и навигации.
  • Читаемость: Код становится более понятным и самодокументируемым.

Синтаксис:

Тип аргумента указывается через двоеточие (:) после его имени, а тип возвращаемого значения — через стрелку (->) перед двоеточием функции.

# name должен быть строкой, age - целым числом
# Функция должна вернуть строку
def get_user_info(name: str, age: int) -> str:
    return f"Пользователь: {name}, возраст: {age}"

# Пример использования
user_data = get_user_info("Alice", 30)
print(user_data)

Ключевые особенности:

  • Нет принудительной проверки: Python не выдаст ошибку, если вы передадите в функцию аргумент неверного типа. Проверка типов — задача внешних инструментов.
  • Модуль typing: Для сложных типов (списки, словари, опциональные значения) используются специальные конструкции из модуля typing.

    from typing import List, Optional
    
    def process_ids(user_ids: List[int]) -> Optional[str]:
        if not user_ids:
            return None
        return f"Обработано ID: {', '.join(map(str, user_ids))}"

Ответ 18+ 🔞

Да ты посмотри, что эти умники придумали! В Python, который всегда был таким свободным, таким распиздяйским — припёрли, блядь, аннотации типов! Это как на дискотеку в клуб прийти в костюме-тройке и с галстуком. PEP 484, ёпта, вот откуда ноги растут.

А зачем это всё, спрашивается?

Ну, типа, чтобы было не как у нас в жизни — «на, держи, разберёшься». А чтобы заранее, блядь, мозги включать.

  • Статический анализ: Есть такие зануды-инструменты, типа mypy. Они твой код читают и орут: «Э, дружок-пирожок, ты тут строку в число суёшь, а там надо int! Пиздец, исправляй!» — ещё до запуска.
  • Подсказки в IDE: Редактор кода смотрит на эти пометки и такой: «О, я знаю, что тут будет список! Держи автодополнение, лови подсказку!» Удобно, чё.
  • Читаемость: Глянул на функцию — и сразу, блядь, ясно, что она жрёт и что обратно плюёт. Не надо гадать, как гадалка на кофейной гуще.

Как это выглядит, эта ваша магия?

Тип аргумента — через двоеточие (:), а что функция отдаёт — через стрелочку (->), прям как указатель, куда идти.

# name — это строка, age — целое число, понял, да?
# А вернёт эта штука тоже строку, так и знай.
def get_user_info(name: str, age: int) -> str:
    return f"Пользователь: {name}, возраст: {age}"

# Используем как обычно
user_data = get_user_info("Alice", 30)
print(user_data)

Важные нюансы, чтобы не обосраться:

  • Питон — он не ментор, ёпта! Он тебе ошибку не выкинет, если ты передашь число вместо строки. Он скажет: «Ну окей, раз ты так хочешь...» и попробует работать. Вся проверка — это на совести внешних зануд-инструментов.
  • Модуль typing — для сложных пацанов. Когда нужно указать не просто «строка», а «список целых чисел» или «может быть строка, а может и хуй с горы (None)» — вот тут подключаем тяжёлую артиллерию.

    from typing import List, Optional
    
    def process_ids(user_ids: List[int]) -> Optional[str]:
        if not user_ids:  # Если список пустой
            return None   # Вернём ничто, пустоту, пиздец
        return f"Обработано ID: {', '.join(map(str, user_ids))}"

Короче, штука полезная, но не панацея. Можно жить и без неё, но с ней — как с GPS в незнакомом городе: меньше шансов уехать в пизду.