61

我正在使用协议缓冲区 python lib 发送数据,但它有一些问题,所以

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.

源代码如下:

原型文件:

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

message task_info {
    required task task = 1;
}

蟒蛇代码:

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

3 回答 3

113

尝试CopyFrom

ptask.task.CopyFrom(task)
于 2014-03-31T20:33:04.860 回答
39

我不知道协议缓冲区,但我查看了文档,它说:

您不能为嵌入的消息字段分配值。相反,为子消息中的任何字段分配值意味着在父消息中设置消息字段。

所以我假设这应该有效:

task = yacc.task()
task.id = 1000
task.msg = u"test"
ptask = yacc.task_info() 
ptask.task.id = task.id
ptask.task.msg = task.msg
于 2013-08-22T09:28:49.993 回答
21

我也是协议缓冲区的新手,面临同样的问题。我发现这个方法很有帮助。

我认为它应该工作:

task = yacc.task()
task.id = 1000
task.msg = u"test"
ptask = yacc.task_info() 
ptask.task.MergeFrom(task)
于 2013-12-27T21:59:25.010 回答