如何获取protobuf多个Address消息中指定字段的所有值列表?
getfielddescriptor() 是Protobuf消息类用来获取字段元数据的接口,仅返回字段的类型、编号、规则这类定义信息,不存储任何消息实例的业务数据,所以无法通过该方法获取具体字段值。
要获取指定字段的所有值,按以下步骤操作即可:
- 先将你创建的所有
Address实例存入一个列表 - 遍历列表提取对应字段的值即可
Python Protobuf 示例代码
# 引入你proto生成的对应Python模块 import address_pb2 # 初始化两条数据(如果是从序列化数据加载,可调用ParseFromString/ParseFromJson方法转成实例) addr1 = address_pb2.Address() addr1.Home = "Cornfield" addr1.state = address_pb2.Address.STATE_UNKNOWN addr1.Name = "Corner" addr2 = address_pb2.Address() addr2.Home = "Ham" addr2.state = address_pb2.Address.STATE_UNKNOWN addr2.Name = "Hammer" # 所有Address实例统一存入列表 addresses = [addr1, addr2] # 提取所有Home字段值 home_values = [item.Home for item in addresses] # 此时home_values即为你需要的 ['Cornfield', 'Ham']
动态获取字段的扩展写法
如果你需要用字段名字符串动态取值,可以用Python内置的getattr方法:
target_field = "Home" field_values = [getattr(item, target_field) for item in addresses]
补充说明
- 如果需要提取枚举字段的字符串标签而非数字值,可以调用枚举类的
Name()方法:address_pb2.Address.State.Name(item.state) - 如果是重复字段(repeated修饰的字段),直接取值后自行拉平即可。
内容的提问来源于stack exchange,提问作者hiuoi
相关产品推荐
相关产品推荐

