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


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не работает, если поле является типом сообщения, а не необработанным типом (например, 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.