我想要帮助递归地循环协议缓冲区消息中包含的所有属性/子对象,假设我们不知道它们的名称,或者有多少个。
作为示例,请从 google 网站上的教程中获取以下 .proto 文件:
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
并使用它...:
person = tutorial.Person()
person.id = 1234
person.name = "John Doe"
person.email = "[email protected] /cdn-cgi/l/email-protection"
phone = person.phone.add()
phone.number = "555-4321"
phone.type = tutorial.Person.HOME
Given Person
,然后如何访问每个元素的属性名称及其值:person.id
, person.name
, person.email
, person.phone.number
, person.phone.type
?
我已经尝试过以下操作,但它似乎没有重现person.phone.number
or person.phone.type
.
object_of_interest = Person
while( hasattr(object_of_interest, "_fields") ):
for obj in object_of_interest._fields:
# Do_something_with_object(obj) # eg print obj.name
object_of_interest = obj
我尝试过使用obj.DESCRIPTOR.fields_by_name.keys
访问子元素,但这些是子对象的字符串表示形式,而不是对象本身。
obj.name 给我名称的属性,但我不确定如何实际获取该属性的值,例如 obj.name 可能给我“名称”,但我如何从中获取“john doe”?