73

I'm using protocol-buffers python lib to send data,but it's have some problems, so

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.

the src as follows:

proto file:

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

message task_info {
    required task task = 1;
}

python code:

task = yacc.task()
task.id = 1000
task.msg = u"test"
ptask = yacc.task_info() 
ptask.task = task # this line happen the runtime error 
gezhonglunta
  • 1,301
  • 3
  • 13
  • 17

3 Answers3

129

Try CopyFrom:

ptask.task.CopyFrom(task)
John McFarlane
  • 5,528
  • 4
  • 34
  • 38
44

I don't know protocol-buffers but I took a look at the docs and it says:

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.

So I'm assuming this should work:

task = yacc.task()
task.id = 1000
task.msg = u"test"
ptask = yacc.task_info() 
ptask.task.id = task.id
ptask.task.msg = task.msg
Martin Maillard
  • 2,751
  • 19
  • 24
  • 2
    This is the [section of the docs](https://developers.google.com/protocol-buffers/docs/reference/python-generated#embedded_message) where it talks about that. It also mentions the `CopyFrom` method. – Ferran Maylinch May 17 '21 at 15:36
22

I'm new to protocol-buffers too and faced with the same problem. I've found this method helpful.

I think it should work:

task = yacc.task()
task.id = 1000
task.msg = u"test"
ptask = yacc.task_info() 
ptask.task.MergeFrom(task)
Aleksandro M Granda
  • 665
  • 1
  • 8
  • 13