Один из методов, который вы могли бы сделать, - создать фиктивную переменную с типом Any
, а затем использовать ее вместо установки переменных ...
или None
.Например:
from typing import Any
_bogus = None # type: Any
log = _bogus # type: logging.Logger
pollset = _bogus # type: select.poll
Однако это решение не идеально.С помощью аннотаций к переменным мы избегали фактического назначения присваивания значения этим переменным, поэтому попытка использовать log
до его создания приведет к возникновению ошибки NameError во время выполнения.
Однако при таком подходе мы вместо этого получимNone
, что противоречит нашему объявленному типу.
Может быть, это нормально для вашего варианта использования, но если это не так, мы можем приблизиться к поведению аннотаций переменных, вставив их внутрь if TYPE_CHECKING
block:
from typing import Any, TYPE_CHECKING
if TYPE_CHECKING:
_bogus = None # type: Any
log = _bogus # type: logging.Logger
pollset = _bogus # type: select.poll
Переменная TYPE_CHECKING
всегда имеет значение False во время выполнения, но обрабатывается, как если бы она была True, средствами проверки типов, такими как mypy.
(Doing if False
также работаетЭто достаточно распространенное соглашение, что mypy напрямую поддерживает это как альтернативу использованию TYPE_CHECKING
.)