Python中含大括号的GraphQL查询字符串格式化问题求解
解决Python中GraphQL查询字符串的格式化问题
你遇到的问题本质是GraphQL的大括号和Python字符串格式化语法的大括号冲突了,下面逐个分析错误原因并给出可行的解决方案:
错误原因分析
- f-string报错:f-string会把所有
{}都识别为占位符,而你的GraphQL查询里的{ scripts(... }中的大括号会被Python误判为f-string的占位符,导致语法错误。 - .format()报错:同样,
format()方法会把字符串中所有未转义的{}当作占位符,查询开头的{会被解析成需要填充的key,自然找不到对应的'\n scripts(developers'这个key,抛出KeyError。
可行解决方案
方案1:转义大括号(推荐,适配.format()和f-string)
把GraphQL查询中所有不需要作为格式化占位符的{和}都改成{{和}},这样Python就会把它们当作普通字符处理:
用.format()实现
query = """ {{ scripts(developers: "{dev_id}") {{ ... ... ... ... ... }} }} """ formatted_query = query.format(dev_id=123) print(formatted_query)
用f-string实现
dev_id = 123 query = f""" {{ scripts(developers: "{dev_id}") {{ ... ... ... ... ... }} }} """ print(query)
方案2:使用字符串拼接(简单但不推荐复杂场景)
如果你的查询结构简单,可以直接把变量和字符串片段拼接起来,避免大括号冲突:
dev_id = 123 query = """ { scripts(developers: "%s") { ... ... ... ... ... } } """ % dev_id
注意:这种方法在变量是字符串时需要额外处理引号,复杂查询容易出错,不推荐。
方案3:使用专业的GraphQL客户端库(最佳实践)
如果你的项目经常和GraphQL交互,建议使用专门的库比如gql,它能自动处理变量注入,避免手动格式化的麻烦:
from gql import Client, gql from gql.transport.requests import RequestsHTTPTransport # 初始化客户端 transport = RequestsHTTPTransport(url="your_graphql_endpoint") client = Client(transport=transport, fetch_schema_from_transport=True) # 定义带变量的查询 query = gql(""" query GetScripts($dev_id: String!) { scripts(developers: $dev_id) { ... ... ... ... ... } } """) # 执行查询时传入变量 result = client.execute(query, variable_values={"dev_id": "123"})
这种方式更安全,能避免注入问题,也更符合GraphQL的规范。
内容的提问来源于stack exchange,提问作者JPG
相关产品推荐
相关产品推荐

