2013-09-24 70 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旨在防止您嘗試。 (無論如何,這是推理 - 我不一定說這是一個很好的決定。) –

相關問題