让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
| 是 Python 3.9+ 浅层右覆盖合并字典最直接安全的选择,适用于需新字典、不改原数据、强调可读性与链式操作的场景;但不支持 None、就地更新、自定义合并逻辑或深合并。

| 运算符就是 Python 3.9+ 合并字典最直接、最安全的默认选择,前提是你要的是浅层右覆盖合并,且两个操作数都是 dict 或其标准子类。
什么时候该用 d1 | d2 而不是 update()
当你需要新字典、不能动原数据、又想一眼看懂“这是合并”时,| 是唯一不带副作用的表达式级操作。
update() 返回 None,写 result = d1.update(d2) 会得到 None;而 | 天然支持链式:d1 | d2 | d3。
update() 支持传入列表或关键字参数,| 只认 dict——这反而是优点:类型意图明确,不会因输入格式不一致导致静默失败。
常见误用:d1 |= d2 在 Python 3.9+ 是语法错误(|= 是就地更新,但必须由类自己实现;dict 没提供),真要就地改,请用 d1.update(d2)。
| 遇到 None 或空值就崩,怎么防?
真实配置场景中,user_config 很可能为 None、空 dict,甚至是个未初始化的变量。
| 不接受 None:default | None 直接抛 TypeError: unsupported operand type(s) for |: 'dict' and 'NoneType'。
必须提前兜底:
-
user_config or {}—— 最轻量,适用于确定user_config要么是dict要么是None -
isinstance(user_config, dict) and user_config or {}—— 更严谨,排除其他假值(如0、False)被误转为空字典 - 别写
config = default | user_config就完事,加一行检查是底线
空字典 {} 安全:d | {} 等价于 d.copy(),但性能略优。
想对重复键做求和/取大值/拼列表?别硬套 |
| 的语义固定:右值无条件覆盖左值。它不提供钩子,也不递归。
需要自定义逻辑时,必须降级为函数:
- 用
set(d1.keys()) & set(d2.keys())找冲突键 - 先用
{**d1, **d2}或d1 | d2做骨架(选哪个看 Python 版本) - 再遍历冲突键,按需重赋值:
merged[k] = resolve_func(d1[k], d2[k]) - 示例:相加 →
lambda a,b: a+b;取大 →max;转列表 →lambda a,b: [a,b]
注意:这种函数不处理嵌套结构。若值本身是字典且你想深合并,| 和这个函数都无效,得用 deepcopy + 递归,或引入 deepmerge 库。
合并大字典链时,a | b | c | d 的实际开销
它是左结合的:((a | b) | c) | d,每一步都新建一个字典。
如果 a 有 10 万键,b 有 1 万键,a | b 生成一个 11 万键的新字典;再 | c 时,又要复制这 11 万键 + c 的键——内存和时间成本线性增长。
高频或大数据量场景下,不如循环调用 update() 到一个目标字典上,或者用 collections.ChainMap 做只读视图(不真正合并)。
| 的优势在可读性和小规模合并;一旦链条变长或数据变大,就得重新评估是否“优雅”还成立。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










