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

Python中如何用复杂联合类型定义函数返回类型注解?

如何简洁定义带附加信息的多分支返回类型

方法1:用Literal精确指定字面量返回类型

你原来的写法不被支持是因为直接使用了True/False字面量作为类型,正确的做法是用typing.Literal(Python 3.8+)标记这些字面量值,让类型检查器(如mypy、pyright)能准确识别返回分支:

from typing import Literal, Tuple

def validate(inp: str) -> Literal[True] | Tuple[Literal[False], str]:
    if len(inp) < 3:  # 示例无效判断逻辑
        return (False, "输入长度不足3位")
    return True

这种写法能精准区分两种返回情况,避免使用宽泛的bool | Tuple[bool, str]类型。

方法2:用dataclass封装返回结果(复杂场景首选)

当返回分支更复杂(比如你提到的枚举多分支场景),用dataclass定义不同的结果类型,再通过联合类型组合,可读性和可维护性会大幅提升:

from dataclasses import dataclass
from enum import Enum
from typing import Union, Literal

class Color(Enum):
    RED = "red"
    GREEN = "green"
    BLUE = "blue"

@dataclass(frozen=True)
class RedResult:
    type: Literal[Color.RED] = Color.RED

@dataclass(frozen=True)
class GreenResult:
    type: Literal[Color.GREEN] = Color.GREEN
    error_msg: str

@dataclass(frozen=True)
class BlueResult:
    type: Literal[Color.BLUE] = Color.BLUE
    count: int
    data: set

def process(input: str) -> Union[RedResult, GreenResult, BlueResult]:
    if input == "ok":
        return RedResult()
    elif input == "err":
        return GreenResult(error_msg="处理失败")
    else:
        return BlueResult(count=5, data={1,2,3})

后续使用时,还能通过Python 3.10+的模式匹配轻松处理不同分支:

result = process("test")
match result:
    case RedResult():
        print("成功返回红色结果")
    case GreenResult(error_msg=msg):
        print(f"绿色结果,错误信息:{msg}")
    case BlueResult(count=c, data=d):
        print(f"蓝色结果,计数:{c},数据:{d}")

方法3:用TypedDict替代dataclass(字典风格返回)

如果更倾向于返回字典结构,可以用TypedDict定义不同的返回类型,同样能获得清晰的类型注解:

from typing import TypedDict, Literal, Union
from enum import Enum

class Color(Enum):
    RED = "red"
    GREEN = "green"
    BLUE = "blue"

class RedResult(TypedDict):
    type: Literal[Color.RED]

class GreenResult(TypedDict):
    type: Literal[Color.GREEN]
    error_msg: str

class BlueResult(TypedDict):
    type: Literal[Color.BLUE]
    count: int
    data: set

def process(input: str) -> Union[RedResult, GreenResult, BlueResult]:
    if input == "ok":
        return {"type": Color.RED}
    elif input == "err":
        return {"type": Color.GREEN, "error_msg": "处理失败"}
    else:
        return {"type": Color.BLUE, "count": 5, "data": {1,2,3}}

总结

  • 简单布尔结果场景:用Literal+元组的组合,精准标注返回类型。
  • 复杂多分支场景:优先用dataclass封装结果,配合模式匹配使用;偏好字典结构则选择TypedDict。

内容的提问来源于stack exchange,提问作者Dylan Cancelliere

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:12:55