如何为SQLAlchemy基础模型添加类型提示?代码中???处应填什么?
正确替换Repository类类型标注的方案
你不用纠结填Base,这场景应该用泛型来实现类型安全的仓库模式,既能保留类型提示,又能让每个具体仓库对应自己的模型类。具体修改步骤如下:
- 导入泛型相关的类型工具
- 定义绑定到
Base的类型变量,限制只能传入模型子类 - 让
Repository继承泛型类,实现类型参数化 - 给
model、create、get设置对应的泛型类型标注
修改后的完整代码:
import sqlalchemy as sa from sqlalchemy.orm import declarative_base from typing import TypeVar, Generic, Type metadata = sa.MetaData() Base = declarative_base(metadata=metadata) class User(Base): __tablename__ = 'user' first_name = sa.Column(sa.String) last_name = sa.Column(sa.String) id = sa.Column(sa.Integer, primary_key=True) # 定义类型变量,绑定Base,确保只能传入Base的子类 T = TypeVar('T', bound=Base) class Repository(Generic[T]): # 标注为Type[T],表示model是一个T类型的类(而非实例) model: Type[T] def create(self, **create_data) -> T: # 实际实现示例:用model创建实例 instance = self.model(**create_data) # 省略session存储逻辑 return instance def get(self, pk) -> T: # 实际实现示例:从数据库查询返回实例 # 省略session查询逻辑 return self.model(id=pk) class UserRepository(Repository[User]): # 绑定具体的模型类 model = User
关键说明:
- 不用
Base的原因:如果直接填Base,所有仓库的返回值都会被标注为Base类型,使用时需要强制类型转换,完全失去了类型提示的意义。 - 泛型的作用:通过
Generic[T]让Repository成为通用基类,每个具体仓库(比如UserRepository)指定对应的模型类型User,这样create和get会自动返回User类型,编辑器能提供准确的代码提示。 Type[T]的作用:标注model是一个类(比如User),而不是User的实例,符合仓库类中存储模型类的逻辑。
内容的提问来源于stack exchange,提问作者Альберт Александров
相关产品推荐
相关产品推荐

