web-dev-qa-db-fra.com

AttributeError: Affectation non autorisée au champ composite "tâche" dans l'objet message de protocole

J'utilise des tampons de protocole python lib pour envoyer des données, mais il y a quelques problèmes, donc

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.

le src comme suit:

fichier proto:

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

message task_info {
    required task task = 1;
}

code python:

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

Je ne connais pas les tampons de protocole mais j'ai jeté un coup d'œil à la documentation et il dit:

Vous ne pouvez pas attribuer de valeur à un champ de message incorporé. Au lieu de cela, attribuer une valeur à n'importe quel champ dans le message enfant implique de définir le champ de message dans le parent.

Je suppose donc que cela devrait fonctionner:

task = yacc.task()
task.id = 1000
task.msg = u"test"
ptask = yacc.task_info() 
ptask.task.id = task.id
ptask.task.msg = task.msg
22
Martin Maillard

Essayez CopyFrom :

ptask.task.CopyFrom(task)
62
John McFarlane

Je suis nouveau dans les tampons de protocole et je suis confronté au même problème. J'ai trouvé cette méthode utile.

Je pense que cela devrait fonctionner:

task = yacc.task()
task.id = 1000
task.msg = u"test"
ptask = yacc.task_info() 
ptask.task.MergeFrom(task)
15
Aleksandro M Granda