Python命名字符串格式化:提取格式键并替换缺失参数为NR
缺失参数自动补"NR"的模板格式化实现
从模板中提取格式占位键
不需要手动编写容易出错的正则表达式,Python标准库string模块内置的Formatter类可以精准识别所有合法的格式化占位符,兼容转义大括号、嵌套属性/索引等特殊写法:
- 导入解析组件:
from string import Formatter - 编写键提取函数:
def get_template_placeholder_keys(template: str) -> list: fmt = Formatter() keys = [] # 遍历模板所有解析片段,跳过无占位符的普通文本片段 for _, field_name, _, _ in fmt.parse(template): if field_name is None: continue # 提取占位符的根键,兼容带属性/索引的写法如{foo[0].bar} root_key = field_name.split(".")[0].split("[")[0] keys.append(root_key) return keys
实现无报错的模板格式化
针对“缺失参数自动替换为'NR'”的需求,有两种成熟的实现方式,适配不同的使用场景:
方式1:兜底字典自动补全
通过自定义字典的缺失值返回逻辑,把原始参数字典包装成支持默认值的对象,传入format_map方法完成格式化:
class NRFallbackDict(dict): # 字典查询不到对应键时,自动返回默认值"NR" def __missing__(self, key): return "NR" def safe_format(template: str, params: dict) -> str: wrapped_params = NRFallbackDict(params) return template.format_map(wrapped_params)
这种方式不会修改你的原始参数字典,运行效率高,适合纯批量格式化的场景。
方式2:缺失键显式补全
结合前面的占位键提取逻辑,先把模板需要但参数字典里缺失的键统一补上"NR",再执行正常的字符串格式化:
def format_with_missing_check(template: str, params: dict) -> str: required_keys = get_template_placeholder_keys(template) # 为缺失的键补默认值"NR" full_params = {k: params.get(k, "NR") for k in required_keys} return template.format(**full_params)
这种方式可以明确识别哪些参数是缺失的,适合需要同步排查实验参数遗漏的场景。
批量处理你的实验数据集
针对你给出的多组实验参数字典结构,直接套用上面的函数即可完成批量处理:
# 原始实验数据 experiment_list = [ {"parameters": {"foo": 1, "bar": 2}, "format": "{foo}_{bar}"}, {"parameters": {"biz": 3}, "format": "{biz}_{baz}"} ] # 批量生成格式化结果 for exp in experiment_list: exp["formatted"] = safe_format(exp["format"], exp["parameters"])
最终输出的结构和你预期完全一致:第一组的格式化结果为1_2,第二组因为缺失baz参数,格式化结果为3_NR。
提示:如果你的模板中存在转义写法(比如需要输出字面量的
{,会写成{{),上面的解析和格式化逻辑都能正确识别,不会把转义符号误判为占位符。
内容的提问来源于stack exchange,提问作者Parmandeep Chaddha
相关产品推荐
相关产品推荐

