AttributeError:协议消息对象中的复合字段"task"不允许赋值

gez*_*nta 28 python protocol-buffers

我正在使用协议缓冲区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.
Run Code Online (Sandbox Code Playgroud)

src如下:

原型文件:

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

message task_info {
    required task task = 1;
}
Run Code Online (Sandbox Code Playgroud)

python代码:

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

Joh*_*ane 66

试试CopyFrom:

ptask.task.CopyFrom(task)
Run Code Online (Sandbox Code Playgroud)

  • @Cu2S StackExchange 的黄金法则:始终至少阅读前*两个*答案! (8认同)
  • 这就是答案。其他答案中提到的“MergeFrom”有时也很有用。 (2认同)

Mar*_*ard 23

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

您无法为嵌入的消息字段分配值.相反,为子消息中的任何字段分配值意味着在父节点中设置消息字段.

所以我假设这应该工作:

task = yacc.task()
task.id = 1000
task.msg = u"test"
ptask = yacc.task_info() 
ptask.task.id = task.id
ptask.task.msg = task.msg
Run Code Online (Sandbox Code Playgroud)

  • 这是文档的[部分](https://developers.google.com/protocol-buffers/docs/reference/python- generated#embedded_message),其中讨论了这一点。它还提到了“CopyFrom”方法。 (3认同)

Ale*_*nda 17

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

我认为它应该工作:

task = yacc.task()
task.id = 1000
task.msg = u"test"
ptask = yacc.task_info() 
ptask.task.MergeFrom(task)
Run Code Online (Sandbox Code Playgroud)

  • CopyFrom() 在清除对象后调用 MergeFrom() (2认同)