能否从元组为Proto Message赋值?如何快速转换元组列表为Proto行列表
用元组列表快速生成Protocol Buffers消息列表
目前创建Proto消息只能通过逐个显式赋值字段的方式,示例如下:
customer = customer_pb2.customer() customer.user_id = 1 customer.name = 'Mary'
但如果有元组列表[(1, 'Mark'), (2, 'Mary')],想要不用显式引用字段名,快速生成对应的Proto消息列表,有没有更简洁的实现方式?下面提供两种可行方案:
方案一:基于字段描述器+字典初始化
利用Proto消息的描述器(DESCRIPTOR)获取字段定义顺序,将元组映射为字段字典后直接初始化消息:
# 获取customer消息的字段名列表(与.proto文件定义顺序一致) field_names = [field.name for field in customer_pb2.customer.DESCRIPTOR.fields] tuple_list = [(1, 'Mark'), (2, 'Mary')] customer_list = [] for item in tuple_list: # 元组转字段字典 customer_dict = dict(zip(field_names, item)) # 用字典直接初始化Proto消息 customer = customer_pb2.customer(**customer_dict) customer_list.append(customer)
方案二:自定义类方法简化调用
给Proto消息类添加一个从元组创建的类方法,让调用更贴近你期望的简洁写法:
# 定义从元组创建消息的类方法 @classmethod def from_tuple(cls, data_tuple): field_names = [field.name for field in cls.DESCRIPTOR.fields] return cls(**dict(zip(field_names, data_tuple))) # 将方法绑定到customer消息类 customer_pb2.customer.from_tuple = from_tuple # 后续即可快速生成消息列表 tuple_list = [(1, 'Mark'), (2, 'Mary')] customer_list = [customer_pb2.customer.from_tuple(t) for t in tuple_list]
注意事项
两种方案都要求元组的元素顺序必须与.proto文件中字段的定义顺序完全匹配,比如你的customer.proto中先定义user_id再定义name,元组的第一个元素就对应user_id,第二个对应name,顺序不能错乱。
内容的提问来源于stack exchange,提问作者CClarke
相关产品推荐
相关产品推荐

