安抚 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.Base
是 variable, 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
中的内容,因此将其视为一个是安全的)。
如果我有这样的文件 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.Base
是 variable, 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
中的内容,因此将其视为一个是安全的)。