AttributeError: присваивание не разрешено задавать "задача" составного поля в объекте сообщения протокола
Я использую протокол-буферы 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.
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
Ответы
Ответ 1
Я не знаю протокольных буферов, но я посмотрел документы, и он говорит:
Вы не можете присвоить значение встроенному полю сообщения. Вместо, присвоение значения любому полю в дочернем сообщении означает установка поля сообщения в родительском.
Итак, я предполагаю, что это должно работать:
task = yacc.task()
task.id = 1000
task.msg = u"test"
ptask = yacc.task_info()
ptask.task.id = task.id
ptask.task.msg = task.msg
Ответ 2
Попробуйте CopyFrom:
ptask.task.CopyFrom(task)
Ответ 3
Я тоже новичок в протокольных буферах и столкнулся с одной и той же проблемой. Я нашел этот метод полезным.
Я думаю, что он должен работать:
task = yacc.task()
task.id = 1000
task.msg = u"test"
ptask = yacc.task_info()
ptask.task.MergeFrom(task)