如何定义作为另一Enum子集的Exchange枚举并实现类型校验
解决枚举无法继承的类型约束问题
针对你遇到的枚举无法继承,同时需要严格类型校验的场景,这里提供三种可行的解决方案:
方案一:使用 Literal 类型限定子集
利用 Python 的 Literal 类型直接复用 Platform 的成员,无需额外定义枚举,类型检查工具(如 mypy、pyright)能精准识别合法输入:
from enum import StrEnum, auto from typing import Literal class Platform(StrEnum): binance = auto() kraken = auto() trading_view = auto() # 定义Exchange为Platform的交易所成员字面量集合 Exchange = Literal[Platform.binance, Platform.kraken] def exchange_func(ex: Exchange): pass def platform_func(p: Platform): pass # 合法调用 exchange_func(Platform.binance) platform_func(Platform.binance) platform_func(Platform.trading_view) # 类型检查会触发错误(传入非交易所平台) exchange_func(Platform.trading_view)
优点:无需维护额外枚举,代码简洁,类型校验精准;
缺点:如果后续新增交易所成员,需要手动更新 Literal 的集合。
方案二:基于 Protocol 实现结构类型校验
通过定义协议(Protocol)标记交易所平台,利用 Python 的结构子类型特性实现类型约束:
from enum import StrEnum, auto from typing import Protocol # 定义交易所协议,要求成员具备is_exchange属性 class ExchangeProtocol(Protocol): is_exchange: bool class Platform(StrEnum): binance = auto() kraken = auto() trading_view = auto() # 为枚举成员添加标记属性 Platform.binance.is_exchange = True Platform.kraken.is_exchange = True Platform.trading_view.is_exchange = False def exchange_func(ex: ExchangeProtocol): pass def platform_func(p: Platform): pass # 合法调用 exchange_func(Platform.binance) platform_func(Platform.binance) platform_func(Platform.trading_view) # 类型检查会触发错误 exchange_func(Platform.trading_view)
优点:保持单一枚举结构,无需重复定义成员;
缺点:需要手动维护成员的标记属性,新增成员时容易遗漏。
方案三:共享无成员的基础枚举
定义一个空的基础枚举,让 Platform 和 Exchange 都继承它,同时确保两者的交易所成员值一致:
from enum import StrEnum, auto # 空的基础枚举,仅作为父类使用 class BasePlatform(StrEnum): pass class Platform(BasePlatform): binance = auto() kraken = auto() trading_view = auto() class Exchange(BasePlatform): binance = auto() kraken = auto() def exchange_func(ex: Exchange): pass # 接受基础枚举类型,兼容Platform和Exchange的实例 def platform_func(p: BasePlatform): pass # 合法调用 exchange_func(Exchange.binance) platform_func(Exchange.binance) platform_func(Platform.trading_view) # 类型检查会触发错误 exchange_func(Platform.trading_view)
优点:类型层级清晰,符合传统继承思维;
缺点:需要维护两个枚举的成员一致性,新增交易所成员时需同步更新 Exchange 枚举。
内容的提问来源于stack exchange,提问作者Jeffrey Chen
相关产品推荐
相关产品推荐

