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

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])

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[:]

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.