python 如何解决mypy错误与sqlalchemy枚举?

gt0wga4j  于 2023-04-19  发布在  Python
关注(0)|答案(3)|浏览(117)

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文档中也不建议这样做。

up9lanfz

up9lanfz1#

我不知道到底是什么让这个错误消失了,但在我的设置后,一些重构和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)
fnvucqvd

fnvucqvd2#

你必须自己在脚本中引入它们。动态创建的Base类的类型是DeclarativeMeta。如果你输入annotate变量Base,mypy不会再显示错误。

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

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

aoyhnmkz

aoyhnmkz3#

你必须导入基类:
SQLAlchemy〈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的正常继承系统。

相关问题