Як призначити повторне поле?


88

Я використовую буфери протоколів у python і маю Personповідомлення

repeated uint64 id

але коли я намагаюся призначити йому таке значення, як:

person.id = [1, 32, 43432]

Я отримую повідомлення про помилку: Assigment not allowed for repeated field "id" in protocol message object Як призначити значення повторюваному полю?

Відповіді:


118

Відповідно до документації , ви не можете безпосередньо призначити повторюване поле. У цьому випадку ви можете зателефонувати, extendщоб додати всі елементи зі списку в поле.

person.id.extend([1, 32, 43432])

11
Аналогічним чином , для додавання одного значення, використовувати append(), наприклад person.id.append(1). Це стосується будь-яких полів protobuf repeated .
Hindol

17
appendне працює, якщо поле має тип повідомлення, а не необроблений тип (наприклад, рядок, int32 тощо). extendпрацює для типів повідомлень.
abeboparebop

4
Якщо ви хочете замінити поле типу повторюваного повідомлення, вам потрібно спочатку видалити, а потім розширити. del person.siblings[:] person.siblings.extend([Person(), Person()])
Ніл


1
не забудьте передати аргументи для розширення як масив (або список), оберніть їх дужками, якщо вам потрібно!
Nicholas Gentile

33

Якщо ви не хочете розширювати, але повністю його перезаписати, ви можете зробити:

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

Цей підхід також допоможе повністю очистити поле:

del person.id[:]

3
Для повторюваних складених типів ви не можете використовувати person.id [:] = [xxx] для призначення заміни. Ви повинні спочатку видалити їх усі, а потім продовжити
ospider

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.