Appeasing MyPy trying to use an instance variable

Viewed 117

If I have the file mypytest/models.py that looks like this:

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

And I run mypy ., I get the following output:

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

Clearly, though, db.Base is defined. How do I get mypy to recognize it?

1 Answers

I believe the problem here is that db.Base is a variable, not a type alias.

It's unclear from your example exactly why you need a dynamic base class. Inlining FakeBaseModel would obviously work; you could also just use a type alias while running the type checking:

from typing import Type, TYPE_CHECKING

# *snip*

db = FakeDatabase()

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

class FakeModel(FakeBase):
    pass

This will produce valid type checking based on what you've provided (basically, as long as FakeModel only uses what's in FakeBaseModel so it's safe to treat it as one).

Related