我想将原型的所有字段名称放入列表中。有没有办法做到这一点?我查看了文档,似乎没有任何内容。
答案 0 :(得分:24)
每个proto类都有一个DESCRIPTOR class variable,可用于检查相应protobuf消息的字段。
有关详细信息,请查看Descriptor和FieldDescriptor类的文档。
以下是将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()]
但是请注意,此解决方案只会获取已设置的字段。