Python中泛型模板类继承泛型类的实现问题(Pydantic/SQLAlchemy)
解决泛型仓库继承的TypeError问题
你遇到的TypeError: Some type variables (~SCHEMA) are not listed in Generic[~MODEL],本质是二级继承的泛型类没有完整声明所有依赖的类型变量。父类GenericSchemaRepository已经用到了SCHEMA泛型,子类继承时必须把SCHEMA和新增的MODEL一起放到Generic的参数里,否则Python类型检查器会认为父类的泛型变量未被正确声明。
修正后的代码示例
1. 定义基础泛型仓库类
from typing import Generic, TypeVar from pydantic import BaseModel # 定义Schema类型变量,约束为BaseModel子类 SCHEMA = TypeVar("SCHEMA", bound=BaseModel) class GenericSchemaRepository(Generic[SCHEMA]): def __init__(self, schema_type: type[SCHEMA]): self.schema_type = schema_type def serialize(self, data: dict) -> SCHEMA: return self.schema_type(**data)
2. 定义SQLAlchemy专属泛型仓库类
from sqlalchemy.orm import DeclarativeBase # 定义Model类型变量,约束为DeclarativeBase子类 MODEL = TypeVar("MODEL", bound=DeclarativeBase) # 子类需同时声明SCHEMA和MODEL两个泛型变量,且Generic放在继承列表最前 class SQLAlchemyRepository(Generic[SCHEMA, MODEL], GenericSchemaRepository[SCHEMA]): def __init__(self, schema_type: type[SCHEMA], model_type: type[MODEL]): super().__init__(schema_type) self.model_type = model_type def model_to_schema(self, model: MODEL) -> SCHEMA: # 忽略SQLAlchemy内部属性,只取用户定义字段 model_data = {k: v for k, v in model.__dict__.items() if not k.startswith("_")} return self.schema_type(**model_data)
关键说明
- 子类继承时,必须将父类依赖的
SCHEMA和自身新增的MODEL都声明在Generic的参数中,确保类型检查器能追踪所有泛型变量。 - Python多重继承中,
Generic类要放在继承列表最前面,这样类型系统才能正确识别泛型参数的关联关系。
内容的提问来源于stack exchange,提问作者Hervé LE BARS
相关产品推荐
相关产品推荐

