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
相关产品推荐
相关产品推荐

