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

如何在Python中定义兼具联合类型与实例化能力的状态类型?

如何让Status同时作为联合类型和状态变体集合使用?

解决方案

结合Python的类型别名(TypeAlias)和类属性,就能同时满足类型注解和便捷实例化的需求。具体实现如下:

from dataclasses import dataclass
from typing import TypeAlias, Union

# 定义基础状态数据类
@dataclass
class StatusWaiting:
    pass

@dataclass
class StatusRunning:
    progress: float

@dataclass
class StatusComplete:
    result: int

@dataclass
class StatusFailure:
    reason: str

# 1. 定义便捷实例化的状态集合类
class Status:
    Waiting = StatusWaiting
    Running = StatusRunning
    Complete = StatusComplete
    Failed = StatusFailure  # 对应原StatusFailure,统一命名风格

# 2. 将Status标记为联合类型别名(仅用于类型检查,运行时不影响类的功能)
Status: TypeAlias = StatusWaiting | StatusRunning | StatusComplete | StatusFailure

使用示例

这样你就可以同时实现两种需求:

# 类型注解:用Status表示联合类型
def get_status() -> Status:
    # 便捷实例化:通过Status类的属性调用状态构造方法
    return Status.Failed("Something has gone horribly wrong")

# 模式匹配(Python 3.10+)或类型判断都能正常工作
status = get_status()
match status:
    case Status.Waiting():
        print("任务等待中")
    case Status.Running(p):
        print(f"任务运行中,进度:{p:.1%}")
    case Status.Complete(res):
        print(f"任务完成,结果:{res}")
    case Status.Failed(msg):
        print(f"任务失败,原因:{msg}")

为什么Enum不可行?

你尝试的Enum方案无法实例化,是因为枚举的成员是枚举实例而非类。比如Status.Complete是Status枚举的一个实例,不是StatusComplete类本身,自然无法调用它来创建新的状态对象。

版本兼容说明

  • Python 3.10+:直接用|运算符定义联合类型
  • Python 3.9及以下:替换成Union[StatusWaiting, StatusRunning, StatusComplete, StatusFailure]

内容的提问来源于stack exchange,提问作者Maddy Guthridge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:10:19