微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 sqlalchemy 枚举解决 mypy 错误?

如何解决如何使用 sqlalchemy 枚举解决 mypy 错误?

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”)

如何在不添加“类型:忽略”的情况下消除此错误?我也可以用 MyEnum.A.name 替换 MyEnum.A 以使错误消失。但这看起来并不干净,在 sqlalchemy 文档中也不建议这样做。

解决方法

由于 sqlalchemy 不使用类型注释,您必须自己在脚本中引入它们。动态创建的 Base 类的类型为 DeclarativeMeta。如果您键入 annotate 变量 Base,mypy 将不再显示错误。

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

现在 Base 变量已正确类型注释。我认为 DeclarativeMeta 类不会在 API 中公开,所以我不确定这个解决方案的可持续性。

然而,这并不奇怪,人们可能会问在动态类型语言中强制静态类型检查的目的是什么。但那是另一天。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。