You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:29:51