
本文介绍一种简洁、安全且符合 python 3.6+ 最佳实践的方式:从源字典中提取指定键,对存在的键保留其值,对缺失的键自动填充预设默认值,全程不修改原始字典。
本文介绍一种简洁、安全且符合 python 3.6+ 最佳实践的方式:从源字典中提取指定键,对存在的键保留其值,对缺失的键自动填充预设默认值,全程不修改原始字典。
在实际开发中(尤其是参数解析、配置合并或 API 请求校验场景),我们常需从一个动态输入字典(如 params)中提取一组“关注字段”,同时为其中可能缺失的字段提供合理默认值。理想函数应满足三点:只保留目标键、自动回退默认值、不污染输入数据。
最推荐的实现是使用字典推导式,结合 dict.get(key, default) 方法:
def filter_with_defaults(keep_defaults, source_dict):
"""
从 source_dict 中筛选指定键,缺失时使用 keep_defaults 中定义的默认值。
Args:
keep_defaults (dict): 键为需保留的字段名,值为对应默认值
source_dict (dict): 原始输入字典
Returns:
dict: 新建字典,仅含 keep_defaults 的键,值优先取自 source_dict,否则取默认值
"""
return {key: source_dict.get(key, default)
for key, default in keep_defaults.items()}使用示例如下:
params = {'a': 1, 'b': 2, 'z': 'bad'}
params_to_keep_with_defaults = {'a': 0, 'c': 0}
result = filter_with_defaults(params_to_keep_with_defaults, params)
print(result) # {'a': 1, 'c': 0}
assert result == {'a': 1, 'c': 0}✅ 优势说明:
-
安全无副作用:不修改
keep_defaults或source_dict,返回全新字典; -
语义清晰:
source_dict.get(key, default)明确表达了“有则取之,无则用默认”的逻辑; -
简洁高效:单行推导式替代循环,符合 Python 惯用法,且时间复杂度为 O(n),n 为
keep_defaults的键数; -
灵活扩展:若需支持“可选默认值”(即某些键可不设默认),只需将
keep_defaults中对应值设为None,并在推导式中加判断——但更推荐保持接口统一,缺失键一律显式声明默认值,以提升可读性与健壮性。
⚠️ 注意事项:
- 避免直接修改传入的
keep_defaults字典(如原答案中前两种写法),否则易引发隐蔽的副作用; -
source_dict.get(key, default)是核心,它比source_dict[key]更安全(不抛KeyError),也比key in source_dict and source_dict[key] or default更准确(能正确处理source_dict[key]为False等 falsy 值的情况)。
综上,该方案兼顾可读性、安全性与性能,是 Python 参数过滤与默认填充任务的标准解法。

















