Подтвердить что ты не робот

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 
4b9b3361

Ответ 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)