Comment attribuer un champ répété?


88

J'utilise des tampons de protocole en python et j'ai un Personmessage

repeated uint64 id

mais quand j'essaye de lui attribuer une valeur comme:

person.id = [1, 32, 43432]

J'obtiens une erreur: Assigment not allowed for repeated field "id" in protocol message object comment attribuer une valeur à un champ répété?

Réponses:


118

Selon la documentation , vous ne pouvez pas attribuer directement à un champ répété. Dans ce cas, vous pouvez appeler extendpour ajouter tous les éléments de la liste au champ.

person.id.extend([1, 32, 43432])

11
De même, pour ajouter une valeur unique, utilisez append(), par exemple person.id.append(1). Cela s'applique à tous les champs protobuf repeated .
Hindol

17
appendne fonctionne pas si le champ est un type de message plutôt qu'un type brut (comme string, int32, etc.). extendfonctionne pour les types de messages.
abeboparebop

4
Si vous souhaitez écraser un champ de type de message répété, vous devez d'abord supprimer, puis étendre. del person.siblings[:] person.siblings.extend([Person(), Person()])
Neil le


1
n'oubliez pas de passer les arguments à étendre sous forme de tableau (ou de liste), mettez-les entre crochets si vous en avez besoin!
Nicholas Gentile

33

Si vous ne voulez pas l' étendre mais l'écraser complètement, vous pouvez faire:

person.id[:] = [1, 32, 43432]

Cette approche fonctionnera également pour nettoyer entièrement le champ:

del person.id[:]

3
Pour les types composites répétés, vous ne pouvez pas utiliser person.id [:] = [xxx] pour affecter replace. Vous devez d'abord les supprimer tous, puis les prolonger
ospider

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.