Flask SQL Alchemy 和 MyPy 与 db.model 发生错误 - 赋值中的类型不兼容

问题描述 投票:0回答:1
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 忽略它,但我以某种方式想要拥有这个权利。

python sqlalchemy flask-sqlalchemy mypy
1个回答
0
投票

所以,我自己也遇到了这个问题,并花了不合理的时间来尝试解决这个问题。我使用的是 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 中的一大堆问题,我怀疑很快就会有比解决方法更多的东西。

© www.soinside.com 2019 - 2024. All rights reserved.