安抚 MyPy 尝试使用实例变量

Appeasing MyPy trying to use an instance variable

如果我有这样的文件 mypytest/models.py:

from typing import Type


class FakeBaseModel:
    pass


class FakeDatabase:
    Base: Type[FakeBaseModel]

    def __init__(self) -> None:
        self.Base = FakeBaseModel


db = FakeDatabase()


class FakeModel(db.Base):
    pass

而我 运行 mypy .,我得到以下输出:

[mypytest {mypytest}]$ mypy .
mypytest/models.py:18: error: Name "db.Base" is not defined
Found 1 error in 1 file (checked 2 source files)

很明显,db.Base 已定义。我如何让 mypy 识别它?

我认为这里的问题是 db.Basevariable, not a type alias

从您的示例中不清楚为什么您需要动态基础 class。内联 FakeBaseModel 显然有效;您也可以在 运行 类型检查时使用类型别名:

from typing import Type, TYPE_CHECKING

# *snip*

db = FakeDatabase()

if TYPE_CHECKING:
    FakeBase = FakeBaseModel
else:
    FakeBase = db.Base

class FakeModel(FakeBase):
    pass

这将根据您提供的内容进行有效的类型检查(基本上,只要 FakeModel 只使用 FakeBaseModel 中的内容,因此将其视为一个是安全的)。