mypy的disallow_any_unimported规则未按预期生效问题咨询
嘿,我来帮你搞定这个问题!你遇到的核心情况是:mypy默认识别不了SQLAlchemy通过元类动态注入的ORM属性,所以不会触发"缺少类型注解"的检查提示。下面是具体的解决步骤:
为什么原来的配置没效果?
SQLAlchemy的ORM类依赖元类(就是@as_declarative装饰器背后的逻辑)来动态生成数据库字段对应的类属性。默认情况下,mypy不会把这些Column定义的属性当成需要显式注解的普通类属性。再加上你在mypy.ini里忽略了SQLAlchemy的缺失导入,mypy对Column的类型信息几乎为零,自然不会报错。
解决方案:用mypy-sqlalchemy插件
这个第三方插件专门为SQLAlchemy的类型检查做了适配,能让mypy正确识别ORM属性并强制检查注解。
安装插件
先执行安装命令:pip install mypy-sqlalchemy更新
mypy.ini配置
修改你的配置文件,启用插件并添加严格检查规则:[mypy] plugins = mypy_sqlalchemy disallow_untyped_attributes = True # 强制所有类属性必须有类型注解 disallow_any_unimported = True [mypy-sqlalchemy.*] ignore_missing_imports = True为ORM属性添加正确注解
现在mypy会主动提示你补全类型注解,你需要把SQLAlchemy的字段类型对应到Python原生类型(比如Integer对应int):from sqlalchemy import Column, Integer from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import as_declarative @as_declarative class Base: pass class Foo(Base): __tablename__ = 'foo' oid: int = Column(Integer, primary_key=True) # 补全int类型注解
额外提示:处理relationship的注解
如果你的ORM类有关联关系(relationship),也要记得添加正确的类型注解。比如关联另一个Bar类:
from typing import List # Python 3.7需要导入List,3.9+可以直接用原生list类型 from sqlalchemy import ForeignKey class Bar(Base): __tablename__ = 'bar' id: int = Column(Integer, primary_key=True) foo_id: int = Column(Integer, ForeignKey('foo.oid')) class Foo(Base): # ... 其他属性 bars: List[Bar] = relationship("Bar")
这样配置后,mypy就会严格检查所有ORM属性的类型注解,一旦缺少或者类型不匹配就会给出错误提示啦。
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

