Python3.9函数参数类型提示用|运算符触发TypeError的原因是什么
问题原因
你遇到的报错是因为PEP 604 定义的|运算符表示联合类型的语法,是Python 3.10及以上版本才默认支持的特性。
你使用的Python 3.9版本原生不支持该语法,运行时会把types.FrameType | None当作普通的位或运算执行,而type类型和NoneType类型并没有实现位或运算符,因此抛出TypeError。
其他人能正常运行该代码通常有两种可能:一是对方使用的Python版本≥3.10,二是对方在代码开头添加了未来特性适配声明。
解决方案
你可以根据自己的场景选择以下任意一种方案解决问题:
- 方案1:添加未来特性声明(适配Python 3.7~3.9)
在代码文件的最顶部(所有业务代码之前)添加如下导入语句即可:from __future__ import annotations
该导入会让解释器将所有类型注解以字符串形式存储,运行时不会立即解析|运算符,因此不会触发类型错误。 - 方案2:使用传统
typing模块的类型写法
如果不想引入未来特性声明,可以将注解替换为typing.Optional或typing.Union的传统写法:
import types from typing import Optional # Optional[X] 等价于 Union[X, None] def start(caller_frame: Optional[types.FrameType] = None): pass
- 方案3:升级Python版本
直接将Python环境升级到3.10或更高版本,即可原生支持|运算符写联合类型的语法,无需额外修改代码。
内容的提问来源于stack exchange,提问作者porosity
相关产品推荐
相关产品推荐

