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

use*_*332 23 python protocol-buffers

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

小智 30

每个proto类都有一个DESCRIPTOR类变量,可用于检查相应protobuf消息的字段.

有关更多详细信息,请查看DescriptorFieldDescriptor类的文档.

这是一个简单的例子,可以将FieldDescriptor所有字段的s message放入列表中:

res = message.DESCRIPTOR.fields
Run Code Online (Sandbox Code Playgroud)

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

res = [field.name for field in message.DESCRIPTOR.fields]
Run Code Online (Sandbox Code Playgroud)

或(来自评论):

res = message.DESCRIPTOR.fields_by_name.keys()
Run Code Online (Sandbox Code Playgroud)

要获取"包含范围"字段的全名:

res = [field.full_name for field in message.DESCRIPTOR.fields]
Run Code Online (Sandbox Code Playgroud)

  • `message.DESCRIPTOR.fields.keys()`对我来说不起作用,但`message.DESCRIPTOR.fields_by_name.keys()`做了. (5认同)
  • 这是否也适用于protobufs的cpp实现? (3认同)

ypx*_*ypx 13

qfiard的回答对我不起作用.调用message.DESCRIPTOR.fields.keys()产生的AttributeError: 'list' object has no attribute 'keys'.

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

解决方法是做单个字段对象的列表组成,并得到了name每个属性.这给了我这个列表中所有字段的字符串列表.

res = [f.name for f in message.DESCRIPTOR.fields]
Run Code Online (Sandbox Code Playgroud)

请注意,这不会递归地获取这些字段中的字段名称.