¿Cómo asignar a un campo repetido?

88

Estoy usando búferes de protocolo en Python y tengo un Personmensaje

repeated uint64 id

pero cuando trato de asignarle un valor como:

person.id = [1, 32, 43432]

Recibo un error: Assigment not allowed for repeated field "id" in protocol message object ¿Cómo asignar un valor a un campo repetido?

PaolaJ.
fuente

Respuestas:

118

Según la documentación , no puede asignar directamente a un campo repetido. En este caso, puede llamar extendpara agregar todos los elementos de la lista al campo.

person.id.extend([1, 32, 43432])
Tim
fuente
11
De manera similar, para agregar un solo valor, use append(), por ejemplo person.id.append(1). Esto se aplica a cualquier campo protobuf repeated .
Hindol
17
appendno funciona si el campo es un tipo de mensaje en lugar de un tipo sin formato (como cadena, int32, etc.). extendfunciona para tipos de mensajes.
abeboparebop
4
Si desea sobrescribir un campo de tipo de mensaje repetido, primero debe eliminarlo y luego extenderlo. del person.siblings[:] person.siblings.extend([Person(), Person()])
Neil
1
recuerde pasar los argumentos para extenderlos como una matriz (o lista), ¡envuélvalos entre corchetes si es necesario!
Nicholas Gentile
33

Si no desea extenderlo pero sobrescribirlo por completo, puede hacer:

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

Este enfoque también funcionará para despejar el campo por completo:

del person.id[:]
kirpit
fuente
3
Para tipos compuestos repetidos, no puede usar person.id [:] = [xxx] para asignar reemplazo. Primero debe eliminarlos todos y luego extenderlos
ospider