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é?

PaolaJ.
la source

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])
Tim
la source
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[:]
kirpit
la source
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