You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用string.format可变键时出现KeyError问题求助

问题分析与解决

报错原因

你遇到的KeyError: 'dntier'是因为text_string.format(text_variable=replacement)的参数传递逻辑错误:你传递的是名为text_variable的关键字参数,但字符串里的占位符是{dntier},format方法找不到对应名称的参数,因此抛出异常。

解决方案

方案1:动态生成参数字典(适配单个占位符场景)

把提取到的占位符名称作为键,替换值作为值构建字典,通过**解包传递给format,让参数名和占位符名匹配:

import re

class Test:
    def __init__(self,mdtier,rxtier,dntier,vstier):
        self.mdtier = mdtier,
        self.rxtier = rxtier,
        self.dntier = dntier,
        self.vstier = vstier,

rec = Test('You Only','You Only','You + Family','You + Spouse')
text_string = 'Dental coverage for {dntier}.'

try:
    text_variable = re.search('\{(.+?)\}', text_string).group(1)
except AttributeError:
    text_variable = '' 
if text_variable:
    replacement = getattr(rec, text_variable)[0]
    # 用字典解包传递对应名称的参数
    new_text_string = text_string.format(**{text_variable: replacement})
else:
    new_text_string = text_string

print(new_text_string)  # 输出:Dental coverage for You + Family.

方案2:利用实例属性字典(适配多占位符场景)

先修正Test类的初始化代码——你给每个属性加了逗号,导致属性值变成元组(比如self.dntier是('You + Family',)),去掉逗号简化取值;之后直接用实例的__dict__属性传递所有属性,自动匹配所有占位符:

import re

class Test:
    def __init__(self,mdtier,rxtier,dntier,vstier):
        self.mdtier = mdtier
        self.rxtier = rxtier
        self.dntier = dntier
        self.vstier = vstier

rec = Test('You Only','You Only','You + Family','You + Spouse')
text_string = 'Dental coverage for {dntier}, medical for {mdtier}.'

# 自动匹配所有占位符,无需手动提取
new_text_string = text_string.format(**rec.__dict__)
print(new_text_string)  # 输出:Dental coverage for You + Family, medical for You Only.

这种方式无需正则提取占位符,不管字符串里有多少个占位符,只要实例有对应名称的属性就能自动替换,灵活性更高。

内容的提问来源于stack exchange,提问作者J Web

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 10:27:34