
本文介绍一种简洁、安全且符合 python 3.6+ 风格的方法,用于从源字典中提取指定键,并对不存在的键自动赋予预设默认值,避免原字典被意外修改。
本文介绍一种简洁、安全且符合 python 3.6+ 风格的方法,用于从源字典中提取指定键,并对不存在的键自动赋予预设默认值,避免原字典被意外修改。
在实际开发中(如函数参数解析、配置合并或 API 请求校验),我们常需从一个动态字典(如 params)中提取一组“期望键”,同时为其中可能缺失的键提供合理默认值。理想方案应满足:不修改原始输入、语义清晰、代码简短、支持键值对形式的默认定义。
最推荐的实现是使用字典推导式 + dict.get(),既保持不可变性,又具备极高的可读性与性能:
def filter_with_defaults(defaults_dict, source_dict):
"""
从 source_dict 中提取 defaults_dict 中声明的键,
若键存在则取其值,否则使用 defaults_dict 中对应的默认值。
Args:
defaults_dict (dict): 键为待保留字段名,值为对应默认值
source_dict (dict): 源字典,提供实际数据
Returns:
dict: 新建字典,仅含 defaults_dict 的键及其最终值
"""
return {key: source_dict.get(key, default)
for key, default in defaults_dict.items()}使用示例如下:
params = {'a': 1, 'b': 2, 'z': 'bad'}
paramsToKeepWithDefaults = {'a': 0, 'c': 0}
result = filter_with_defaults(paramsToKeepWithDefaults, params)
print(result) # {'a': 1, 'c': 0}
assert result == {'a': 1, 'c': 0}✅ 优势说明:
立即学习“Python免费学习笔记(深入)”;
- ✅ 安全无副作用:不修改
defaults_dict或source_dict,返回全新字典; - ✅ 语义明确:
source_dict.get(key, default)直观表达“有则取之,无则用默认”; - ✅ 灵活扩展:
defaults_dict可为任意字典(包括空字典、嵌套结构或含None/False等 falsy 默认值); - ✅ 兼容性强:在 Python 3.6+ 中保证插入顺序,在 3.7+ 为语言规范,结果有序可靠。
⚠️ 注意事项:
- 避免直接修改传入的
defaults_dict(如原答案中前两种写法),否则可能引发难以追踪的副作用; - 若需支持“默认值可选”(即某些键无默认值、缺失时报错),可稍作增强,例如接受
default_factory或使用collections.defaultdict,但会牺牲简洁性——本方案以“显式即安全”为设计原则,推荐将所有预期键及其默认值统一声明在defaults_dict中; - 如需深度过滤嵌套字典,应另配递归逻辑,本函数仅处理顶层键。
总之,该模式已成为 Python 中参数规范化(parameter normalization)的标准实践之一,兼顾表达力、健壮性与可维护性。


















