Python 3.10 的 | 仅限类型标注中替代 Union,如 int | str 等价于 Union[int, str];不可用于 isinstance 或运行时类型构造,复杂嵌套或需反射操作时仍须用 Union。

Python 3.10 的 | 语法能直接替代 Union,但仅限于类型标注上下文
是的,Python 3.10 起支持用 | 作为类型联合运算符,比如 int | str 等价于 Union[int, str]。但它不是万能替换——只在类型提示(type annotation)中生效,不能用于运行时逻辑判断或构造类型对象。
常见误用场景:
- 写
if isinstance(x, int | str)→ 报错:TypeError: isinstance() arg 2 must be a type or tuple of types - 写
type_union = int | str再传给函数 → 运行时报错,因为此时|返回的是types.UnionType实例(3.10+),而非传统typing.Union类型对象
哪些地方能安全用 |,哪些必须保留 Union
| 在绝大多数标注位置可直接替代 Union,但以下情况仍需显式导入和使用 Union:
- 需要调用
Union的类方法(如Union.__args__)或做类型反射操作 - 与旧版 Python(from __future__ import annotations
- 使用某些静态检查工具(如 mypy 0.910 之前版本)对
|支持不完整 - 标注返回类型为泛型联合,如
list[int] | dict[str, int]是合法的,但若写成Union[list[int], dict[str, int]]更易读(尤其嵌套深时)
| 和 Union 在运行时行为不同,会影响类型检查器和 IDE 补全
虽然语义等价,但底层表示不同:int | str 生成 types.UnionType,而 Union[int, str] 生成 typing.Union(实际是特殊构造的类型对象)。这会导致:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
立即学习“Python免费学习笔记(深入)”;
- mypy 默认开启
--python-version 3.10+才能正确解析|;否则报SyntaxError: invalid syntax - PyCharm 在未识别 Python 版本时可能无法补全右侧类型(如输完
int |后不提示str) -
get_type_hints()返回结果中,|形式会被标准化为Union对象(取决于 Python 版本和from __future__ import annotations是否启用)
实际编码建议:优先用 |,但注意嵌套与可读性权衡
简单联合直接用 | 更简洁,例如函数参数:def parse(data: str | bytes) -> int | None:。但遇到复杂嵌套时,括号和缩进容易混乱:
def process(
items: list[dict[str, int | float | None]] | tuple[str, ...] | None
) -> dict[str, list[int]] | set[float]:
...
这种情况下,改用 Union 并分行书写反而更清晰:
from typing import Union, Dict, List, Tuple, Set, Optional
def process(
items: Union[
List[Dict[str, Union[int, float, None]]],
Tuple[str, ...],
None
]
) -> Union[Dict[str, List[int]], Set[float]]:
...
真正容易被忽略的是:| 不支持空联合(如 int | 语法错误),也不支持单操作数(int | 或 | int 均非法),它必须是两个及以上类型的明确并列。

















