You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中含大括号的GraphQL查询字符串格式化问题求解

解决Python中GraphQL查询字符串的格式化问题

你遇到的问题本质是GraphQL的大括号和Python字符串格式化语法的大括号冲突了,下面逐个分析错误原因并给出可行的解决方案:

错误原因分析

  1. f-string报错:f-string会把所有{}都识别为占位符,而你的GraphQL查询里的{ scripts(... }中的大括号会被Python误判为f-string的占位符,导致语法错误。
  2. .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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:52:43