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

Python 3.11.4中|运算符为何无法用于类型标注表示或?

为什么Python 3.11.4中None | True作为类型提示会报错?

核心问题是你混淆了类型对象和实例值:

  • True是布尔类型的实例,不是类型本身;类型提示要求使用的是bool这个类型对象。
  • 当你写None | True时,Python会将这两个当成普通实例执行|位运算(类似1 | 2的逻辑),而非作为类型联合处理,因此触发TypeError——NoneType和bool实例不支持位运算。

Python 3.10+ |类型联合的规则

Python 3.10+支持用|表示联合类型,但要求运算符两侧必须是合法的类型注解元素:

  • None是特例,在类型注解语境下会被自动解析为type(None)(即None的类型);
  • 另一侧必须是类型对象(如bool、int),而非具体的实例值(如True、100)。

因此正确的写法应为:

def func() -> None | bool:
    ...

为什么Union[None, True]能正常运行?

typing.Union在处理参数时,会自动将非类型对象转换为它的类型:当你传入True时,它会自动取type(True)也就是bool,所以Union[None, True]实际上等价于Union[None, bool]。这是typing模块的兼容处理,但属于不规范写法,推荐直接使用类型bool。

总结

  • 类型注解必须使用类型对象,不能用具体的实例值;
  • 使用|做联合类型时,确保两侧都是合法的类型注解(None除外,它会被解析为type(None));
  • 规范写法是None | bool或Union[None, bool],而非None | True或Union[None, True]。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:10:21