Python3格式化含{}的字符串时出现KeyError: "'class'"问题求助
为什么调用.format(N)会抛出KeyError: "'class'"?
嘿,这个问题我之前也踩过坑!咱们来一步步拆解原因和解决办法:
问题根源
当你使用字符串的.format()方法时,Python会把字符串里的**单大括号{}**当成占位符,尝试匹配你传入的参数或者关键字参数。你的原始字符串是:
'replication = {\'class\' : \'NetworkTopologyStrategy\', \'datacenter1\' : {}};'
这里面的{'class' : ...}部分,会被.format()解析成“需要替换名为'class'的参数”,但你只传了N这个参数,根本没有提供'class'对应的值,所以直接触发了KeyError。
解决办法
要保留字符串里的大括号结构,同时只替换指定的{},你需要把那些不需要被.format()替换的大括号用**双大括号{{}}**转义:
方法1:修改原始字符串的大括号
把原始字符串里的静态大括号(就是'class'周围的那些)改成双大括号,只留最后一个{}作为N的占位符:
# 转义不需要替换的大括号 template = 'replication = {{\'class\' : \'NetworkTopologyStrategy\', \'datacenter1\' : {}}};' result = template.format(N)
这样.format()会把{{和}}解析成单个的{和},只替换最后那个单独的{}为N的值。
方法2:使用f-string(Python 3.6+推荐)
如果你的Python版本支持f-string,写法会更简洁直观,同样用双大括号转义静态部分:
result = f"replication = {{\'class\' : \'NetworkTopologyStrategy\', \'datacenter1\' : {N}}};";
效果和方法1完全一致,但代码可读性更高。
总结
.format()会把所有单大括号对视为占位符,如果你想保留字符串里的大括号结构,必须用双大括号转义,否则Python会误以为你要替换那个位置的参数,而当找不到对应参数时就会抛出KeyError。
内容的提问来源于stack exchange,提问作者przemyslaw.sagalo
相关产品推荐
相关产品推荐

