如何解决mymyy错误与sqlalchemy enum?



mypy报告以下代码中的错误:

import enum
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Enum
Base = declarative_base()
class MyEnum(enum.Enum):
A = 1
B = 2
class MyTable(Base):
__tablename__ = 'my_table'
col = Column(Enum(MyEnum), nullable=False)
c = MyTable(col=MyEnum.A)

错误如下:

a.py:16: error: type for " color ";MyTable"(有MyEnum", expected "str")

如果不添加"类型:ignore"? 我也可以替换MyEnum。A与myenuma .name使错误消失。但是这样做看起来不干净,在sqlalchemy文档中也不建议这样做。

我不知道究竟是什么使这个错误消失,但在我的设置中,经过一些重构和mypy配置,这个错误消失了。

我安装了sqlalchemy-stubs

pip install sqlalchemy-stubs

并创建setup.cfg文件:

[mypy]
files = **/*.py
plugins =
sqlalchemy.ext.mypy.plugin
import enum
from sqlalchemy import Column, Enum
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

class MyEnum(enum.Enum):
"""My enum."""
ONE = 1
TWO = 2

class MyTable(Base):
"""My table."""
__tablename__ = 'my_table'
col = Column(Enum(MyEnum), nullable=False)

table = MyTable(col=MyEnum.ONE)

您必须在脚本中自己介绍它们。动态创建的Base类类型为DeclarativeMeta。如果您输入annotate变量Base, mypy将不再显示错误。

from sqlalchemy.orm.decl_api import DeclarativeMeta
Base: DeclarativeMeta = declarative_base()

现在Base变量得到了正确的类型注释。我认为declarativeeta类不应该在API中公开,所以我不确定这个解决方案是否可持续。

您必须导入基类:

SQLAlchemy & lt; v2:

from sqlalchemy.orm.decl_api import DeclarativeMeta
Base: DeclarativeMeta = declarative_base()

见https://docs.sqlalchemy.org/en/13/orm/extensions/declarative/basic_use.html

或SQLAlchemy v2+:

from sqlalchemy.orm import DeclarativeBase
class Base(DeclarativeBase):
pass

见:https://docs.sqlalchemy.org/en/20/orm/mapping_styles.html mapped-class-essential-components

注意,第一个方法也适用于v2,但后者可能更可取,并且当然更容易理解,因为它遵循Python的常规继承系统。

相关内容

  • 没有找到相关文章

最新更新