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?

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

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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.