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的常规继承系统。