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:错误:“MyTable”的“col”的类型不兼容(得到“MyEnum”,应为“str”)
如何在不添加“type:ignore”?我也可以用www.example.com替换MyEnum.AMyEnum.A.name来消 debugging 误。但这看起来不干净,在sqlalchemy文档中也不建议这样做。
3条答案
按热度按时间up9lanfz1#
我不知道到底是什么让这个错误消失了,但在我的设置后,一些重构和
mypy
配置这个错误消失了。我安装了
sqlalchemy-stubs
并创建了setup.cfg文件:
fnvucqvd2#
你必须自己在脚本中引入它们。动态创建的
Base
类的类型是DeclarativeMeta
。如果你输入annotate变量Base,mypy不会再显示错误。现在Base变量被正确地类型注解了。我认为DeclarativeMeta类不会在API中公开,所以我不确定这个解决方案的可持续性如何。
aoyhnmkz3#
你必须导入基类:
SQLAlchemy〈v2:
参见https://docs.sqlalchemy.org/en/13/orm/extensions/declarative/basic_use.html
或SQLAlchemy v2+:
参见:https://docs.sqlalchemy.org/en/20/orm/mapping_styles.html#mapped-class-essential-components
注意,第一种方法也适用于v2,但后者可能更可取,而且肯定更容易理解,因为它遵循Python的正常继承系统。