protobuf python错误“无法分配给扩展,因为它是重复或复合类型”
问题描述:
当构建原始对象时,“TypeError:无法分配给扩展名”actionRequest“,因为它是重复或复合类型。protobuf python错误“无法分配给扩展,因为它是重复或复合类型”
原型文件:
message Message{
message MessageContent{
extensions 100 to max;
}
optional MessageContent content = 1;
}
message ActionRequest{
optional string token = 1;
}
extend Message.MessageContent {
optional ActionRequest actionRequest = 200;
}
代码:
import TestPb_pb2
message = TestPb_pb2.Message()
request = TestPb_pb2.ActionRequest()
message.content.Extensions[TestPb_pb2.actionRequest] = request
答
的协议缓冲区的Python API自动构建扩展消息的实例为您服务。因此,而不是分配给message.content.Extensions[TestPb_pb2.actionRequest]
,你可以写信给预先构建的消息:
message.content.Extensions[TestPb_pb2.actionRequest].token = "foobar"
(至于为什么API被设计成这样,我不知道)
需要注意的是常规(非-extension)字段的工作方式类似。它是这样设计的,以便Python API可以包装C++实现以提高性能。由于C++ API没有GC或引用计数,所以不能将同一个消息对象链接到两个不同的父级,因此API旨在防止您尝试。 (无论如何,这是推理 - 我不一定说这是一个很好的决定。) –