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
相关产品推荐
相关产品推荐

