如何创建关联属性绑定的Python复合泛型类型?
实现关联Token组的泛型复合类型
你可以通过枚举+类型映射+泛型绑定的方式,把同组的AccessToken和RefreshToken绑定成不可拆分的关联类型,这样只用指定一个Token组标识,就能自动推导对应的两种Token类型。
具体实现步骤
- 补全并修正基础类型定义:
from typing import Generic, NewType, TypeVar, TypeAlias from enum import Enum # 基础Token类型别名 AccessToken: TypeAlias = str RefreshToken: TypeAlias = str # 各Token组的具体类型 XAccessToken = NewType("XAccessToken", AccessToken) YAccessToken = NewType("YAccessToken", AccessToken) XRefreshToken = NewType("XRefreshToken", RefreshToken) YRefreshToken = NewType("YRefreshToken", RefreshToken)
- 定义Token组枚举与类型映射:
# 定义Token组枚举,作为标识 class TokenGroup(Enum): X = "x" Y = "y" # 建立Token组到对应Token类型的绑定关系 TokenTypeMap = { TokenGroup.X: (XAccessToken, XRefreshToken), TokenGroup.Y: (YAccessToken, YRefreshToken), } # 限定泛型参数只能是TokenGroup的成员 T = TypeVar("T", bound=TokenGroup)
- 重写泛型AuthorizationData类,自动推导关联类型:
class AuthorizationData(Generic[T]): access_token: TokenTypeMap[T][0] refresh_token: TokenTypeMap[T][1] def __init__(self, access_token: TokenTypeMap[T][0], refresh_token: TokenTypeMap[T][1]): self.access_token = access_token self.refresh_token = refresh_token
- 使用示例:
class AuthorizationDataSet: x: AuthorizationData[TokenGroup.X] y: AuthorizationData[TokenGroup.Y] # 类型检查会自动校验Token组匹配 x_auth = AuthorizationData[TokenGroup.X](XAccessToken("x-access-token"), XRefreshToken("x-refresh-token")) # 若传入错误组的Token,类型检查工具(如mypy)会直接报错 # x_auth = AuthorizationData[TokenGroup.X](YAccessToken("y-access-token"), XRefreshToken("x-refresh-token")) # 类型不匹配
另一种简洁实现方式(基于TypedDict)
如果不想用枚举,也可以通过TypedDict直接定义Token组的类型关联:
from typing import Generic, NewType, TypeVar, TypedDict AccessToken: TypeAlias = str RefreshToken: TypeAlias = str XAccessToken = NewType("XAccessToken", AccessToken) YAccessToken = NewType("YAccessToken", AccessToken) XRefreshToken = NewType("XRefreshToken", RefreshToken) YRefreshToken = NewType("YRefreshToken", RefreshToken) # 定义每个Token组的类型结构 class TokenGroupX(TypedDict): access_token: XAccessToken refresh_token: XRefreshToken class TokenGroupY(TypedDict): access_token: YAccessToken refresh_token: YRefreshToken T = TypeVar("T", TokenGroupX, TokenGroupY) class AuthorizationData(Generic[T]): access_token: T["access_token"] refresh_token: T["refresh_token"] # 使用 class AuthorizationDataSet: x: AuthorizationData[TokenGroupX] y: AuthorizationData[TokenGroupY]
以上两种方式都能实现你的需求:通过单一标识(枚举成员或TypedDict类型),让AuthorizationData自动关联对应组的两种Token类型,避免拆分或传错类型。
内容的提问来源于stack exchange,提问作者Marek
相关产品推荐
相关产品推荐

