Почему код печатает True (TypeVar и len в Python)

Почему код печатает True (TypeVar и len в Python)

@python_quiz

Разберем этот квиз

Коротко: приведённый фрагмент кода сравнивает длину двух строк — результат будет True. Разберём почему, и почему элементы модуля typing тут никак не влияют на выполнение.

Исходный код

python

Что здесь происходит по шагам:

  • TypeVar('T') создаёт объект, используемый для статической типизации (аннотаций). В рантайме это просто объект и он не меняет поведение программы.
  • "123" — строка длины 3, len("123") возвращает 3.
  • str(10) преобразует число 10 в строку "10", у которой длина 2, значит len(str(10)) возвращает 2.
  • Сравнение 3 > 2 даёт True, соответственно печатается True.

Вы можете легко проверить это:

python

Роль TypeVar и модуля typing

  • TypeVar и другие конструкции из модуля typing предназначены для статического анализа кода (mypy, Pyright и т.п.).
  • На выполнение выражений они обычно не влияют — они не перестраивают объекты и не вызывают ошибок во время выполнения просто потому, что использованы.
  • В данном примере объявление T = TypeVar('T') никак не участвует в вычислении выражения с len.

Анализ вариантов ответов (логика)

  • Утверждение, что вывод будет True, потому что 3 > 2 — соответствует фактическому поведению программы.
  • Утверждение, что вывод будет False, основано на неверном подсчёте длин строк.
  • Утверждения, что будет ошибка времени выполнения из-за Protocol или Generic, не применимы: в коде нет использования Protocol или Generic в смысле, который мог бы вызвать ошибку, а декларации типов сами по себе не приводят к runtime-ошибкам в таком контексте.

Выводы и практические советы

  • Не путайте аннотации типов и механики выполнения: TypeVar — инструмент для статического анализа, не для изменения логики во время запуска.
  • Если нужно проверить поведение программы — ориентируйтесь на фактические вычисления (в данном случае len и str).
  • Для отладки подобных случаев полезно распечатать промежуточные значения (len каждого выражения), чтобы явно увидеть, что и как сравнивается.

Небольшая шпаргалка:

  • str(10) -> "10", len -> 2
  • "123" -> len 3
  • 3 > 2 -> True

Конец.

Report Page