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

Rah*_*hul 11 python 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)
Run Code Online (Sandbox Code Playgroud)

以下是错误:

a.py:16: 错误:“MyTable”的“col”类型不兼容(得到“MyEnum”,预期“str”)

如何在不添加“type:ignore”的情况下消除此错误?我还可以将 MyEnum.A 替换为 MyEnum.A.name 以使错误消失。但这看起来并不干净,并且 sqlalchemy 文档中也没有建议。

小智 6

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

我安装了sqlalchemy-stubs

pip install sqlalchemy-stubs
Run Code Online (Sandbox Code Playgroud)

并创建了 setup.cfg 文件:

[mypy]
files = **/*.py
plugins =
  sqlalchemy.ext.mypy.plugin
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)


mar*_*her 4

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

from sqlalchemy.orm.decl_api import DeclarativeMeta
Base: DeclarativeMeta = declarative_base()
Run Code Online (Sandbox Code Playgroud)

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