小智 30
每个proto类都有一个DESCRIPTOR类变量,可用于检查相应protobuf消息的字段.
有关更多详细信息,请查看Descriptor和FieldDescriptor类的文档.
这是一个简单的例子,可以将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)
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)
请注意,这不会递归地获取这些字段中的字段名称.