error: Incompatible types in assignment (expression has type "Type[Any]", variable has type "DefaultMeta") [assignment]
error: Variable "application.models.BaseModel" is not valid as a type [valid-type]
以前这样声明就可以工作
from sqlalchemy.ext.declarative import DeclarativeMeta
BaseModel: DeclarativeMeta = db.Model
但是在软件包更新后,我再次看到该错误。我从here读到DeclarativeMeta已移至
sqlalchemy.orm
,但是当尝试时
from sqlalchemy.orm import DeclarativeMeta
BaseModel: DeclarativeMeta = db.Model
我仍然可以看到错误。我还注意到有时会使用
flask_sqlalchemy
from flask_sqlalchemy.model import DefaultMeta
BaseModel: DefaultMeta = db.Model
但这没有什么区别,我仍然看到 mypy 错误。
当前版本的软件包是这样的:
mypy │ 1.1.1
SQLAlchemy │ 2.0.6
Flask-SQLAlchemy │ 3.0.3
有人知道如何写这个让 mypy 高兴吗?我总是可以让 mypy 忽略它,但我以某种方式想要拥有这个权利。
所以,我自己也遇到了这个问题,并花了不合理的时间来尝试解决这个问题。我使用的是 Flask-SQLAlchemy 3.1.1,不兼容的类型不是
Type[Any]
而是 type[_FSAModel]
。但我认为同样的普遍问题。
长话短说,什么对我有用:
from typing import TYPE_CHECKING
...
if TYPE_CHECKING:
from flask_sqlalchemy.model import Model
else:
Model = db.Model
...
class MyModel(Model):
...
我在这里使用
Model
而不是 BaseModel
,但在其他方面与您提到的解决方法类似。我在 MyPy 问题 8603 中找到了这个。
Flask-SQLAlchemy 项目还有另一个推荐的解决方法:只需忽略模型类的
name-defined
错误。不幸的是,这最终也忽略了我模型类中的attr-defined
,实际上让我错过了 MyPy 通常会捕获的问题。
由于我花了几个小时才找到适合我的解决方法,因此我在 Flask-SQLAlchemy 项目中写了一个冗长的问题,希望我们能获得一些有关现有解决方法及其优缺点的文档。
阅读了 Flask-SQLAlchemy 和 MyPy 中的一大堆问题,我怀疑很快就会有比解决方法更多的东西。