Como atribuir a campo repetido?

88

Estou usando buffers de protocolo em python e tenho uma Personmensagem

repeated uint64 id

mas quando tento atribuir um valor a ele:

person.id = [1, 32, 43432]

Recebo um erro: Assigment not allowed for repeated field "id" in protocol message object Como atribuir um valor a um campo repetido?

PaolaJ.
fonte

Respostas:

118

De acordo com a documentação , você não pode atribuir diretamente a um campo repetido. Nesse caso, você pode chamar extendpara adicionar todos os elementos da lista ao campo.

person.id.extend([1, 32, 43432])
Tim
fonte
11
Da mesma forma, para adicionar um único valor, use append(), por exemplo person.id.append(1). Isso se aplica a qualquer campo protobuf repeated .
Hindol de
17
appendnão funciona se o campo for um tipo de mensagem em vez de um tipo bruto (como string, int32, etc). extendfunciona para tipos de mensagem.
abeboparebop
4
Se você quiser sobrescrever um campo de tipo de mensagem repetido, primeiro exclua e depois estenda. del person.siblings[:] person.siblings.extend([Person(), Person()])
Neil
1
lembre-se de passar os argumentos para estender como um array (ou lista), envolva-os com colchetes se precisar!
Nicholas Gentile
33

Se você não deseja estender, mas substituí-lo completamente, pode fazer:

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

Essa abordagem também funcionará para limpar o campo inteiramente:

del person.id[:]
Kirpit
fonte
3
Para tipos compostos repetidos, você não pode usar person.id [:] = [xxx] para atribuir substituição. Você tem que primeiro deletar todos eles e então estender
ospider