Python三引号字符串添加变量时触发KeyError的问题分析与解决
Python字符串格式化出现KeyError: '\n "query"'的原因与修复方案
嘿,我来帮你搞定这个问题!你碰到的这个KeyError是Python字符串格式化时的典型坑,咱们一步步拆解清楚:
问题成因
你用的str.format()方法会把字符串里所有的{}都视为占位符,需要对应位置或关键字的参数来替换。但你在多行字符串里写的JSON格式内容(比如{ "query": ... })里的大括号,也被format()当成了要替换的占位符——而你并没有为这些额外的大括号提供对应的参数,所以Python找不到匹配的键,就抛出了KeyError: '\n "query"'(错误信息里的内容是它识别到的占位符开头后的部分)。
简单说:你只想让{0}、{1}、{2}被替换,但其他的{}也被误判成了占位符,导致报错。
修复方案
解决方法很直接:把字符串里不需要被format替换的大括号都改成双大括号{{}},这样str.format()会自动把双大括号解析成单个大括号,而你定义的{0}、{1}、{2}依然会正常替换。
修改后的代码
configuration_str= """ configuration={{ "query": {{ "query": "CALL `{0}.{1}.{2}`(); ", "useLegacySql": False, }} }}, """.format("server_name", "dataset_name", "sp_name")
验证效果
运行这段代码后,你会得到正确的格式化结果:
configuration={ "query": { "query": "CALL `server_name.dataset_name.sp_name`(); ", "useLegacySql": False, } },
如果你用的是Python 3.6+,也可以用更直观的f-string实现(同样需要转义大括号):
server_name = "server_name" dataset_name = "dataset_name" sp_name = "sp_name" configuration_str= f""" configuration={{ "query": {{ "query": "CALL `{server_name}.{dataset_name}.{sp_name}`(); ", "useLegacySql": False, }} }}, """
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

