Obtener todos los nombres de campo de un búfer de protocolo?

Quiero obtener todos los nombres de campo de un proto en una lista. ¿Hay alguna forma de hacer esto? Miré la documentación y no parece haber nada para esto.

Cada clase proto posee una variable de clase DESCRIPTOR que se puede usar para inspeccionar los campos de los mensajes protobuf correspondientes.

Echa un vistazo a la documentación de las clases Descriptor y Descriptor de campo para obtener más detalles.

Aquí hay un ejemplo simple para obtener los FieldDescriptor s de todos los campos en message en una lista:

 res = message.DESCRIPTOR.fields 

Para obtener los nombres de los campos “exactamente como aparecen en el archivo .proto”:

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

o (a partir de los comentarios):

 res = message.DESCRIPTOR.fields_by_name.keys() 

Para obtener los nombres completos de los campos “incluido el scope que contiene”:

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

La respuesta de Qfiard no funcionó para mí. Al llamar a message.DESCRIPTOR.fields.keys() produjo AttributeError: 'list' object has no attribute 'keys' .

No estoy seguro de por qué no funcionaría. Tal vez tenga algo que ver con cómo se definió / compiló el mensaje.

La solución fue hacer una composición de lista de los objetos de campo individuales y obtener la propiedad de name para cada uno. Esto me dio una lista de cadenas de todos los campos en esta lista.

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

Tenga en cuenta que esto no le proporciona los nombres de campo dentro de esos campos de forma recursiva.