Python Модуль typing
может использовать имена строковых типов, а также сам тип, как у вас в примере.
Если вы не хотите, чтобы тип оценивался при код запускается и выдается исключение, если модуль не был импортирован, тогда вы можете использовать строковое имя. В таком случае ваш фрагмент кода будет выглядеть следующим образом:
def f(*, model: Optional[Type["pydantic.BaseModel"]] = None)
Ваша проверка типа stati c с использованием mypy
должна продолжать работать, но ваш пакет больше не всегда будет нуждаться в зависимости от pydantic
.
Как вы обнаружили в документах , в модуле python *1031* есть способ указать, что некоторые операции импорта требуются только для (строкового литерала) аннотаций типа:
from typing import TYPE_CHECKING
if TYPE_CHECKING:
import pydantic
Это будет выполнять оператор import pydantic
только тогда, когда TYPE_CHECKING
равен True
, главным образом при использовании mypy
для анализа типов в коде. При нормальном запуске программы оператор импорта не выполняется. По этой причине опция должна использоваться только с подсказками строкового литерала; в противном случае отсутствующий импорт приведет к сбою нормального выполнения программы.
Поскольку ленивая оценка подсказок типа должна быть реализована в Python 4.0,
from __future__ import annotations
можно использовать для включения этого поведения в Python 3. С этим оператором импорта типы строковых литералов не требуются.