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

如何定义作为另一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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:40:11