Python中从依赖Protobuf文件获取关联类型字段名的方法
问题描述
现有如下Protobuf定义文件abc.proto:
syntax = "proto3"; import "auditData.proto"; import "Date.proto"; import "column_name.proto"; message abc { AuditData auditData = 1; int32 field2 = 2; Date date=3; column_name colnm=4 }
已将其编译为abc_pb2.py文件,但因依赖文件数量过多,无法手动查看AuditData、Date、column_name的字段名。需在Python中仅通过abc消息类型,自动获取这三个依赖类型的所有字段名,当前使用protobuf 3.19.4版本。
解决方案
可以利用Protobuf的反射API实现需求,生成的pb2文件中每个消息类都包含DESCRIPTOR属性,通过该属性可获取消息的元数据(包括字段、依赖类型等)。
实现代码
import sys # 如果依赖的pb2文件不在当前路径,添加其所在目录到Python路径 sys.path.append("./path/to/proto_files") # 替换为实际存放pb2文件的路径 import abc_pb2 # 获取abc消息的描述符 abc_msg_descriptor = abc_pb2.abc.DESCRIPTOR # 遍历abc的所有字段,筛选出引用外部消息类型的字段 for field in abc_msg_descriptor.fields: # 仅处理自定义消息类型的字段(排除int32等基础类型) if field.message_type: target_type_name = field.message_type.name print(f"=== {target_type_name} 的字段列表 ===") # 遍历目标类型的所有字段,输出字段名 for nested_field in field.message_type.fields: print(f"- {nested_field.name}")
代码说明
- 路径配置:确保所有依赖的pb2文件(如
auditData_pb2.py、Date_pb2.py等)所在目录被添加到Python的导入路径,否则abc_pb2无法正常加载依赖。 - DESCRIPTOR属性:每个Protobuf消息类的
DESCRIPTOR包含了该消息的完整元数据,包括字段列表、字段类型、依赖关系等核心信息。 - 筛选消息类型字段:通过
field.message_type判断字段是否为自定义消息类型(基础类型的该属性为None),进而获取对应类型的字段列表。
输出示例
假设AuditData包含id和operator字段,Date包含year、month、day字段,column_name包含name字段,执行代码后会输出:
=== AuditData 的字段列表 === - id - operator === Date 的字段列表 === - year - month - day === column_name 的字段列表 === - name
内容的提问来源于stack exchange,提问作者Santhana Krishnan
相关产品推荐
相关产品推荐

