如何在使用upb后端的Python Protobuf 5.38.3中访问未知字段
在Protobuf 5.38.3中获取反序列化消息的未知字段列表
你遇到的NotImplementedError是因为UnknownFields()是旧版非原生Protobuf Python API的方法,而protobuf 5.x默认启用原生Python API,该API已移除了这个方法。以下是两种可行的解决方案:
方法一:使用原生API的list_unknown_fields()方法
这是官方推荐的标准方式,返回的是未知字段的列表,每个元素是一个包含三个元素的元组:(字段编号, Wire类型, 字段值)。示例代码:
# 假设msg是反序列化后的Protobuf消息对象 unknown_fields = msg.list_unknown_fields() for field_num, wire_type, value in unknown_fields: print(f"未知字段编号: {field_num}, Wire类型: {wire_type}, 值: {value}")
方法二:直接访问私有属性__unknown_fields__
如果因为特殊情况无法使用list_unknown_fields(),可以直接访问消息对象的__unknown_fields__私有属性,它存储的结构与上述方法返回的结果一致:
unknown_fields = msg.__unknown_fields__
注意事项
- 确保你的Protobuf代码是用新版
protoc编译器生成的,只有原生API生成的代码才支持上述两种方式。 - Wire类型对应Protobuf的底层编码类型,比如
0代表Varint、2代表Length-delimited,可参考Protobuf官方文档的Wire类型定义。
内容的提问来源于stack exchange,提问作者V.Lorz
相关产品推荐
相关产品推荐

