Getting all field names from a protocol buffer?

霸气de小男生 提交于 2019-12-04 15:34:13

问题


I want to get all the field names of a proto into a list. Is there a way to do this? I looked in the documentation and there doesn't seem to be anything for this.


回答1:


Every proto class possess a DESCRIPTOR class variable that can be used to inspect the fields of corresponding protobuf messages.

Have a look at the documentation of the Descriptor and FieldDescriptor classes for more details.

Here is a simple example to get the FieldDescriptors of all the fields in message into a list:

res = message.DESCRIPTOR.fields

To get the names of the fields "exactly as they appear in the .proto file":

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

or (from the comments):

res = message.DESCRIPTOR.fields_by_name.keys()

To get the full names of the fields "including containing scope":

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



回答2:


qfiard's answer didn't work for me. Calling message.DESCRIPTOR.fields.keys() produced AttributeError: 'list' object has no attribute 'keys'.

Not sure why it wouldn't work. Maybe it has something to do with how the message was defined/compiled.

The workaround was to do a list composition of the individual field objects and get the name property for each. This gave me a list of strings of all fields in this list.

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

Note that this does not get you the field names within those fields recursively.



来源:https://stackoverflow.com/questions/24639562/getting-all-field-names-from-a-protocol-buffer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!