从协议缓冲区获取所有字段名称?

时间:2014-07-08 18:51:48

标签: python protocol-buffers

我想将原型的所有字段名称放入列表中。有没有办法做到这一点?我查看了文档,似乎没有任何内容。

4 个答案:

答案 0 :(得分:24)

每个proto类都有一个DESCRIPTOR class variable,可用于检查相应protobuf消息的字段。

有关详细信息,请查看DescriptorFieldDescriptor类的文档。

以下是将FieldDescriptor中所有字段的message放入列表的简单示例:

res = message.DESCRIPTOR.fields

要获取字段的名称“与它们在.proto文件中显示的完全相同”:

res = [field.name for field in message.DESCRIPTOR.fields]

或(来自评论):

res = message.DESCRIPTOR.fields_by_name.keys()

获取“包含范围”字段的全名:

res = [field.full_name for field in message.DESCRIPTOR.fields]

答案 1 :(得分:13)

qfiard's回答对我不起作用。致电message.DESCRIPTOR.fields.keys()制作了AttributeError: 'list' object has no attribute 'keys'

不确定为什么它不起作用。也许它与消息的定义/编译方式有关。

解决方法是对各个字段对象进行列表组合,并为每个字段对象获取name属性。这给了我这个列表中所有字段的字符串列表。

res = [f.name for f in message.DESCRIPTOR.fields]

请注意,这并不能以递归方式获取这些字段中的字段名称。

答案 2 :(得分:1)

您可以轻松获得以下字段列表

message_fields = [field for field in message.DESCRIPTOR.fields_by_name]

答案 3 :(得分:0)

我遇到了 Python 3.9,其中一些解决方案失败了,所以我找到了一个使用消息对象的公共接口的解决方案,而不是使用 DESCRIPTOR 属性。

fields = [desc.name for desc, val in message.ListFields()]

但是请注意,此解决方案只会获取已设置的字段。

文档在这里:https://googleapis.dev/python/protobuf/latest/google/protobuf/message.html#google.protobuf.message.Message.ListFields