Python中如何将类泛型化以正确推断其方法的返回类型
解决方案
通过Python泛型体系绑定PGQuery子类的返回类型即可实现需求,具体修改如下:
第一步:引入泛型工具,改造基类定义
from asyncpg import Pool from typing import TypeVar, Generic # 定义代表查询返回值的泛型类型变量 T = TypeVar('T') class PGQuery(Generic[T]): async def execute(self, connection: Pool) -> T: raise NotImplementedError class PGQueryExecutor: def __init__(self, connection: Pool): self._connection = connection # 将execute方法声明为泛型方法,绑定输入查询的返回类型 async def execute(self, query: PGQuery[T]) -> T: return await query.execute(self._connection)
第二步:修改查询子类的继承声明,绑定返回类型
from pydantic import BaseModel, parse_obj_as class QualitySummary(BaseModel): count: int score: float # 继承时指定泛型参数为该查询的返回类型 class PGQueryQualitySummary(PGQuery[QualitySummary]): def __init__(self, node: str): self.node = node async def execute(self, connection: Pool) -> QualitySummary: result = await connection.fetchrow(...) return parse_obj_as(QualitySummary, result)
效果验证
改造完成后,执行原有调用代码:
pgqueryexecutor = PGQueryExecutor(...) result = await pgqueryexecutor.execute(PGQueryQualitySummary(...))
类型检查工具会自动推导result的类型为QualitySummary,任意PGQuery子类只要在继承时指定对应的泛型参数,都可以自动推导返回类型,完全符合需求。
内容的提问来源于stack exchange,提问作者edoedoedo
相关产品推荐
相关产品推荐

