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)
您必须在脚本中亲自介绍它们。动态创建的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 中公开,所以我不确定这个解决方案的可持续性。
| 归档时间: |
|
| 查看次数: |
5750 次 |
| 最近记录: |