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.