Python是一种高级编程语言,具有简洁语法、跨平台特性及丰富库支持,广泛应用于Web开发、数据分析、人工智能等领域。

Python
写 str | int 在 Python 3.9 或更早版本里,解释器在 parse 阶段就拒绝——根本不会走到 mypy 或运行时。错误信息是 SyntaxError: invalid syntax,位置精准指向类型注解那一行。这不是类型检查器不支持,而是 Python 解释器根本不认识这个语法。
- 常见误判:看到报错就去调 mypy 配置,其实连
import都失败,根本没机会执行类型检查 - 验证方法:在目标环境跑
python -c "def f(x: str | int): pass",如果报错,说明版本不够,别折腾 typing 配置 - CI/CD 中尤其容易踩坑:构建机是 3.10,但测试脚本用 3.9 运行,
import失败导致整个 pipeline 中断
typing.Union 导入失败可能是环境污染,不是代码写错了
ImportError: cannot import name 'Union' from 'typing' 看似是代码问题,实际常因虚拟环境里装了第三方 typing 包(比如过时的 typingPyPI),覆盖了标准库模块。Python 3.10+ 的 typing 模块内部结构有调整,第三方包可能未适配。
- 先查加载路径:
python -c "import typing; print(typing.__file__)",确认输出是不是标准库路径(如lib/python3.10/typing.py) - 误装的
typing包通常来自旧项目残留或手动 pip install typing(标准库不需要装) - 修复方式:删掉
typing和typing-extensions,再重装typing-extensions(仅用于兼容旧版本),不要碰typing
字符串字面量注解能绕过 SyntaxError,但带来新限制
写 def f(x: "str | int") 可让旧版本 Python 安全跳过解析,但它不是“完美兼容方案”,而是一种妥协。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
-
get_type_hints()返回的是原始字符串,无法直接拿到Union对象,反射逻辑会失效 - 嵌套场景如
Callable[[], str | int]会被某些检查器拒绝,必须加括号写成Callable[[], (str | int)] -
NewType或TypeVar的bound参数不接受字符串,只能传真实类型对象,这类地方仍得用Union
| 运算符只在类型标注中合法,运行时不能当类型对象用
int | str 是 AST 层级的语法糖,它生成 types.UnionType 实例,但该类型不参与运行时类型判断逻辑。
-
isinstance(x, int | str)必报TypeError,必须写成isinstance(x, (int, str)) - 动态构造类型(比如传给第三方库的类型注册函数)时,
int | str无法替代Union[int, str] - IDE 补全依赖 Python 版本识别:PyCharm / Pylance 若没设对 interpreter version,输完
int |可能不提示后续类型
真正容易被忽略的是:环境兼容性问题从来不是单一维度的事。你改了注解写法,可能触发解释器、typing 模块、类型检查器、IDE 插件四层不同行为。每层都有自己的支持边界和缓存机制,排查时得一层层剥离,而不是统一归因到“版本太低”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










