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

Python 从协议缓冲区获取所有字段名?,python,protocol-buffers,Python,Protocol Buffers,我想把proto的所有字段名都放到一个列表中。有办法做到这一点吗?我查看了文档,似乎没有任何相关内容 每个proto类都有一个可用于检查相应protobuf消息字段的 有关更多详细信息,请查看和类的文档 下面是一个简单的示例,可以将消息中所有字段的字段描述符放入列表: res = message.DESCRIPTOR.fields 要获取字段名称“与.proto文件中显示的字段名称完全相同”: 或(从评论中): 要获取字段“包括包含范围”的全名,请执行以下操作: 这个答案对我不起作用。调用me

我想把proto的所有字段名都放到一个列表中。有办法做到这一点吗?我查看了文档,似乎没有任何相关内容

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

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

下面是一个简单的示例,可以将
消息
中所有字段的
字段描述符
放入列表:

res = message.DESCRIPTOR.fields
要获取字段名称“与.proto文件中显示的字段名称完全相同”:

或(从评论中):

要获取字段“包括包含范围”的全名,请执行以下操作:


这个答案对我不起作用。调用
message.DESCRIPTOR.fields.keys()
生成的
AttributeError:'list'对象没有属性“keys”

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

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

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

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

您可以很容易地获得如下字段列表

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

我跳到了Python3.9,其中一些解决方案出现了问题,因此我找到了一个使用消息对象的公共接口的解决方案,而不是使用
描述符
属性

fields=[desc.name代表desc,val在message.ListFields()中]
但是请注意,此解决方案将仅获取已设置的字段


文档在这里:

这在protobufs的cpp实现中也起作用吗?是的,请看一个示例。如果您知道消息的类别,您可以通过调用
descriptor
class方法获取protobuf消息的描述符,或者通过调用instance.FYI
message.descriptor.fields.keys()上的
GetDescriptor
方法获取protobuf消息的描述符。
message.descriptor.fields.keys()
对我不起作用,但
message.DESCRIPTOR.fields\u by\u name.keys()
对我起作用。要获取列表中x的实际名称
[x.full\u name(message.DESCRIPTOR.fields)]
您知道如何获取这些字段中的字段名吗recursively@vks查看的
message\u type
属性-它向消息类型返回一个
描述符
,您可以使用该描述符获取其中的字段
res = [field.full_name for field in message.DESCRIPTOR.fields]
res = [f.name for f in message.DESCRIPTOR.fields]
message_fields = [field for field in message.DESCRIPTOR.fields_by_name]