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
相关产品推荐
相关产品推荐

