Как назначить повторяющееся поле?

88

Я использую буферы протокола в Python, и у меня есть Personсообщение

repeated uint64 id

но когда я пытаюсь присвоить ему значение, например:

person.id = [1, 32, 43432]

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

PaolaJ.
источник

Ответы:

118

Согласно документации , вы не можете напрямую назначать повторяющееся поле. В этом случае вы можете вызвать, extendчтобы добавить все элементы в списке в поле.

person.id.extend([1, 32, 43432])
Тим
источник
11
Точно так же для добавления одного значения используйте append(), например person.id.append(1). Это применимо к любым полям protobuf repeated .
Hindol
17
appendне работает, если поле является типом сообщения, а не необработанным типом (например, string, int32 и т. д.). extendработает для типов сообщений.
abeboparebop
4
Если вы хотите перезаписать повторяющееся поле типа сообщения, вам нужно сначала удалить, а затем расширить. del person.siblings[:] person.siblings.extend([Person(), Person()])
Нил
1
не забудьте передать аргументы для расширения в виде массива (или списка), при необходимости заключите их в скобки!
Николас Джентиле
33

Если вы не хотите расширять, а полностью перезаписывать его, вы можете сделать:

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

Этот подход также будет работать для полной очистки поля:

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