2013-09-24 73 views
2

当构建原始对象时,“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 

回答

2

的协议缓冲区的Python API自动构建扩展消息的实例为您服务。因此,而不是分配给message.content.Extensions[TestPb_pb2.actionRequest],你可以写信给预先构建的消息:

message.content.Extensions[TestPb_pb2.actionRequest].token = "foobar"

(至于为什么API被设计成这样,我不知道)

+1

需要注意的是常规(非-extension)字段的工作方式类似。它是这样设计的,以便Python API可以包装C++实现以提高性能。由于C++ API没有GC或引用计数,所以不能将同一个消息对象链接到两个不同的父级,因此API旨在防止您尝试。 (无论如何,这是推理 - 我不一定说这是一个很好的决定。) –

相关问题