如何将Protobuf ListValue转换为Python列表?解决mypy类型报错
解决Protobuf ListValue转Python列表的mypy报错问题
正确转换方式
Protobuf的ListValue对象本身不可迭代,它的元素实际存储在values属性中,直接操作这个属性即可完成转换,且不会触发mypy报错:
方法1:直接转为Python列表
from google.protobuf.struct_pb2 import ListValue my_list_value: ListValue = ... my_list = list(my_list_value.values) # 访问values属性获取可迭代的元素集合
方法2:循环遍历构建列表
from typing import List from google.protobuf.struct_pb2 import ListValue, Value prob_output_list: List[float] = [] for elt in my_list_value.values: # 显式将Protobuf的Value类型转为Python float类型 prob_output_list.append(float(elt.number_value))
报错原因说明
ListValue类本身没有实现__iter__方法,因此直接对对象本身使用list()或循环遍历,会被mypy判定为不可迭代对象。- 它的
values属性属于RepeatedCompositeFieldContainer类型,天然支持迭代和列表转换操作,mypy能正确识别该类型的可迭代性。
无需使用#pragma ignore
完全不需要通过忽略mypy报错的方式解决问题,通过访问values属性就能合规完成转换。如果需要将Protobuf的Value类型转为具体Python类型(如float),只需显式处理每个元素的类型转换,mypy也能识别这种合法操作。
内容的提问来源于stack exchange,提问作者information_interchange
相关产品推荐
相关产品推荐

