使用多行f-string构建SPARQL查询时出现KeyError问题求助
解决Python中SPARQL查询格式化的KeyError问题
错误原因
你同时混用了f-string和str.format()方法,导致语法冲突:
- f-string会把字符串内的双大括号
{{}}转义为单个大括号{},最终生成的查询字符串里WHERE {{会变成WHERE { - 调用
format()时,它会把所有{}都视为占位符,包括SPARQL语句里的{ wd:...,误以为wd是需要替换的键,因此抛出KeyError。
解决办法(无需拆分语句)
方案1:仅使用str.format()
把SPARQL里的大括号用双大括号转义,直接用format()替换占位符:
query = '''SELECT ?age WHERE {{ wd:{0} wdt:{1} ?birthdate. BIND(now() - ?birthdate AS ?age) }}''' print(query.format('Q84','P1082'))
方案2:仅使用f-string
直接用变量代替{0}、{1}占位符,双大括号依然用于转义SPARQL的大括号:
wd_id = 'Q84' wdt_id = 'P1082' query = f'''SELECT ?age WHERE {{ wd:{wd_id} wdt:{wdt_id} ?birthdate. BIND(now() - ?birthdate AS ?age) }}''' print(query)
方案3:使用string.Template
通过$符号作为占位符,完全避免大括号冲突:
from string import Template query = Template('''SELECT ?age WHERE { wd:$wd_id wdt:$wdt_id ?birthdate. BIND(now() - ?birthdate AS ?age) }''') print(query.substitute(wd_id='Q84', wdt_id='P1082'))
内容的提问来源于stack exchange,提问作者m.rp
相关产品推荐
相关产品推荐

