Какие характеристики имеет система типов в Python?

Ответ

Python использует динамическую и сильную типизацию.

  1. Динамическая типизация (Dynamic Typing) Тип переменной определяется в момент выполнения (runtime), а не на этапе компиляции. Это позволяет присваивать одной и той же переменной значения разных типов.

    # Тип переменной определяется значением, которое ей присвоено
    data = 42      # data - это int
    print(type(data))
    
    data = "hello" # Теперь data - это str. Ошибки нет.
    print(type(data))
  2. Сильная типизация (Strong Typing) Операции между несовместимыми типами запрещены без явного преобразования. Это предотвращает неожиданное поведение и ошибки.

    # Попытка сложить строку и число вызовет ошибку
    # TypeError: can only concatenate str (not "int") to str
    result = "Your score is: " + 100 
    
    # Необходимо явное преобразование типа
    result_correct = "Your score is: " + str(100) # OK

С версии Python 3.5 также поддерживаются аннотации типов (type hints). Они не влияют на исполнение кода, но используются статическими анализаторами (например, Mypy) для поиска потенциальных ошибок на этапе разработки.

def greet(name: str) -> str:
    return f"Hello, {name}"

Ответ 18+ 🔞

А, ну вот, смотри, классика жанра, про которую все так любят спорить, пока не порежутся об острые углы. Python и его типизация — это как история про Герасима и Муму, только с переменными.

Слушай сюда, разберём по полочкам, чтобы ни у кого не осталось вопросов, кроме «нахуя?».

1. Динамическая типизация (Dynamic Typing) Это когда переменная — как та самая ткачиха из сказки: сегодня она ткёт полотно, а завтра, блядь, уже царица лебедь. Тип определяется не когда ты пишешь код, а прямо в момент, когда программа бежит. Переменная — это просто имя, которое ты прилепил к чему-то в памяти. И ты можешь это «что-то» менять на что угодно, хоть на изумрудные ядра.

# Сначала переменная `data` — это здоровый русский мужик-целое число.
data = 42      # data - это int
print(type(data)) # <class 'int'>, ёпта

# А потом она взяла и стала строкой. Никакой ошибки, просто пиздец какой поворот.
data = "hello" # Теперь data - это str. Всё, Герасим стал говорить.
print(type(data)) # <class 'str'>

Вот это и есть динамичность. Не «зашито» в переменную навечно, а «как карта ляжет». Удобно? Да. Может привести к неожиданностям, если не следить? О, блядь, ещё как может.

2. Сильная типизация (Strong Typing) А вот это — наша защита от распиздяйства. Это как если бы Герасим пытался сложить свою собаку Муму с кирпичом, которым он работает. Нельзя просто взять и сложить «собаку» и «кирпич», получив «собако-кирпич». Нужно явно преобразовать. Python не будет делать за тебя тупые неявные преобразования, которые могут привести к ебическим последствиям. Он скажет: «Стой, мудак! Ты что творишь?»

# Пытаемся сложить строку и число. Это как попросить ткачиху спеть арию.
# TypeError: can only concatenate str (not "int") to str
result = "Your score is: " + 100 # Пиздец, ошибка! Нельзя!

# Правильно — нужно явно сказать: «Эй, число, стань строкой, блядь!»
result_correct = "Your score is: " + str(100) # Вот теперь ОК. Ядрёна вошь, работает.

Сильная типизация — это наш внутренний максималист. Либо ты делаешь всё чётко и по правилам, либо нихуя не получится. Это не даёт языку сойти с ума и начать делать какую-то хуйню за кулисами.

А теперь про аннотации (Type Hints) С версии 3.5 Python, этот, с позволения сказать, Тургенев от мира программирования, решил: «А давайте-ка я буду не только писать, но и делать пометки на полях для будущих поколений!». Появились аннотации типов.

def greet(name: str) -> str:
    return f"Hello, {name}"

Смотри, что здесь: name: str — это намёк, что name должен быть строкой. -> str — это намёк, что функция вернёт строку.

ВНИМАНИЕ, КАПСЛОКОМ: ЭТО НИХУЯ НЕ ОБЯЗАТЕЛЬНО ДЛЯ ИНТЕРПРЕТАТОРА! Python на эти подсказки в работе — чих-пых! Он их проигнорирует и выполнит код как обычно. Если ты передашь число, он попытается его использовать, и если не выйдет — получишь свой законный TypeError.

Зачем они тогда? Это как записка от автора для статических анализаторов вроде Mypy. Ты запускаешь mypy на свой код, а он тебе говорит: «Чувак, блядь, ты тут в функцию, которая ждёт строку, суёшь число! Подозрение ебать чувствую! Проверь-ка!». Это для того, чтобы отловить потенциальные косяки ещё до запуска программы.

Итог:

  • Динамическая — тип переменной узнаётся и может меняться на ходу.
  • Сильная — нельзя делать операции между разными типами без явного «разрешения».
  • Аннотации — это просто подсказки для умных программ-помощников, а не железное правило для самого Python.

Вот так вот, на хуй. Кажется, всё просто, а сколько в этом глубины, блядь. Прямо как в «Муму».