2013-08-22 19 views
18

我使用協議緩衝區蟒蛇LIB發送數據協議消息的對象不得合成場的「任務」,但它是有一些問題,所以AttributeError的:分配在

Traceback (most recent call last): 
    File "test_message.py", line 17, in <module> 
    ptask.task = task 
    File "build\bdist.win32\egg\google\protobuf\internal\python_message.py", line 
513, in setter 
AttributeError: Assignment not allowed to composite field "_task" in protocol message object. 

在src如下:

原型文件:

message task { 
    required int32 id = 1; 
    required string msg = 2; 
} 

message task_info { 
    required task task = 1; 
} 

Python代碼:

task = yacc.task() 
task.id = 1000 
task.msg = u"test" 
ptask = yacc.task_info() 
ptask.task = task # this line happen the runtime error 

回答

15

我不知道協議緩衝區但我在the docs看了看,它說:

You cannot assign a value to an embedded message field. Instead, assigning a value to any field within the child message implies setting the message field in the parent.

所以我假定這應該工作:

task = yacc.task() 
task.id = 1000 
task.msg = u"test" 
ptask = yacc.task_info() 
ptask.task.id = task.id 
ptask.task.msg = task.msg 
14

我新的協議緩衝區也面臨同樣的問題。我發現this method有幫助。

,我認爲它應該工作:

task = yacc.task() 
task.id = 1000 
task.msg = u"test" 
ptask = yacc.task_info() 
ptask.task.MergeFrom(task) 
29

嘗試CopyFrom

ptask.task.CopyFrom(task)