Означает ли процесс "проверки типа", что код не выполняется?
Да, точно. Средство проверки типов никогда не выполняет ваш код: вместо этого он анализирует его. Средства проверки типов реализованы практически так же, как и компиляторы, за исключением шага «генерировать байт-код / сборка / машинный код».
Это означает, что средство проверки типов имеет больше стратегий для разрешения циклов импорта (или циклов любого типа), который будет иметь интерпретатор Python во время выполнения, поскольку ему не нужно пытаться импортировать модули вслепую.
Например, mypy в основном начинает с анализа кода вашего модуля за модулем, отслеживание каждого нового класса / нового типа, который определяется. Во время этого процесса, если mypy видит подсказку типа, используя тип, который еще не был определен, замените его типом заполнителя.
Как только мы закончим проверять все модули, проверьте и посмотрите, есть ли все еще любые типы заполнителя, плавающие вокруг Если это так, попробуйте повторно проанализировать код, используя определения типов, которые мы собрали до сих пор, заменяя любые заполнители, когда это возможно. Мы промываем и повторяем до тех пор, пока не останется ни заполнителей, либо мы повторили слишком много раз.
После этого mypy предполагает, что все оставшиеся заполнители являются просто недопустимыми типами, и сообщает об ошибке.
В отличие от этого, интерпретатор Python не может позволить себе повторный повторный анализ таких модулей. Он должен запускать каждый модуль, который видит, и многократный повторный запуск модулей может нарушить некоторый пользовательский код / ожидания пользователя.
Аналогично, интерпретатор Python не может позволить себе просто поменяться местами. порядок, в котором мы анализируем модули. Напротив, mypy может теоретически анализировать ваши модули в любом произвольном порядке, игнорируя то, что импортирует что, - единственная выгода в том, что это будет просто супер неэффективно, так как нам потребуется много итераций для достижения фиксированной точки.
( Поэтому вместо этого mypy использует ваш импорт в качестве предложений , чтобы решить, в каком порядке анализировать модули. Например, если модуль A напрямую импортирует модуль B, мы, вероятно, сначала захотим проанализировать B. Но если A импортирует B позади if TYPE_CHECKING
, возможно, неплохо бы ослабить порядок, если это поможет нам разорвать цикл.)