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

