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

Python解析.graphqls文件的工具推荐与自定义解析方法问询

解析GraphQL SDL文件的Python工具与自定义方案

一、现成工具推荐

可以用graphql-core库,它是GraphQL规范的Python实现,能直接解析.graphqls格式的SDL文件,将内容转换为抽象语法树(AST),你可以遍历AST或把它转成字典结构,效果类似json.loads()。

使用示例:

from graphql import parse

# 读取SDL文件内容
with open("schema.graphqls", "r") as f:
    sdl_content = f.read()

# 解析为AST结构
ast = parse(sdl_content)

# 遍历AST提取各类定义
parsed_data = {
    "enums": {},
    "types": {},
    "query": {},
    "mutation": {}
}

for definition in ast.definitions:
    # 识别枚举类型
    if definition.__class__.__name__ == "EnumTypeDefinition":
        enum_name = definition.name.value
        parsed_data["enums"][enum_name] = [val.name.value for val in definition.values]
    # 识别普通对象类型
    elif definition.__class__.__name__ == "ObjectTypeDefinition":
        type_name = definition.name.value
        fields = {field.name.value: field.type.__str__() for field in definition.fields}
        if type_name == "Query":
            parsed_data["query"] = fields
        elif type_name == "Mutation":
            parsed_data["mutation"] = fields
        else:
            parsed_data["types"][type_name] = fields
    # 识别输入类型
    elif definition.__class__.__name__ == "InputObjectTypeDefinition":
        input_name = definition.name.value
        parsed_data["inputs"][input_name] = {field.name.value: field.type.__str__() for field in definition.fields}

二、自定义解析的可行方案

如果不想依赖现成库,不推荐单纯逐行读取——SDL存在嵌套结构、多行注释、跨换行的字段定义等情况,逐行处理容易遗漏或误判。更稳妥的实现步骤如下:

1. 先做词法分析(Token化)

把SDL内容拆分为标准化标记(Token),可以用正则表达式匹配:

  • 关键字:\benum\b|\btype\b|\binput\b|\bQuery\b|\bMutation\b
  • 标识符(名称类):[a-zA-Z_][a-zA-Z0-9_]*
  • 符号:\{|\}|:|,|!
  • 注释:#.*$(单行注释)、"""[\s\S]*?"""(多行注释)

先过滤掉所有注释,再把剩余内容拆分为Token序列。

2. 基于Token做语法分析

遍历Token序列,按GraphQL SDL规则识别结构:

  • 识别枚举:当遇到enum关键字时,下一个Token是枚举名称,后续直到}的Token(跳过逗号)都是枚举值。
  • 识别对象/输入类型:遇到type或input关键字后,下一个Token是类型名称,{}内部的Token按「字段名: 类型」的规则提取字段信息。
  • 识别Query/Mutation:本质是type Query或type Mutation的特殊对象类型,处理逻辑和普通对象类型一致。

3. 构建目标数据结构

把识别到的信息存入字典或自定义类,比如:

parsed_schema = {
    "enums": {
        "OrderStatus": ["CREATED", "PAID", "SHIPPED", "DELIVERED"]
    },
    "types": {
        "Order": {
            "id": "ID!",
            "status": "OrderStatus",
            "total": "Float!"
        }
    },
    "query": {
        "getOrder": "Order"
    },
    "mutation": {
        "createOrder": "Order"
    }
}

内容的提问来源于stack exchange,提问作者Ebad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 23:47:39