Làm thế nào để gán cho trường lặp lại?


88

Tôi đang sử dụng bộ đệm giao thức trong python và tôi có một Personthông báo

repeated uint64 id

nhưng khi tôi cố gắng gán một giá trị cho nó như:

person.id = [1, 32, 43432]

Tôi gặp lỗi: Assigment not allowed for repeated field "id" in protocol message object Làm cách nào để gán giá trị cho trường lặp lại?

Câu trả lời:


118

Theo tài liệu , bạn không thể chỉ định trực tiếp cho một trường lặp lại. Trong trường hợp này, bạn có thể gọi extendđể thêm tất cả các phần tử trong danh sách vào trường.

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

11
Tương tự như vậy, để thêm một giá trị duy nhất, sử dụng append(), ví dụ person.id.append(1). Điều này áp dụng cho bất kỳ trường protobuf nàorepeated .
Hindol

17
appendkhông hoạt động nếu trường là một loại thông báo chứ không phải là một loại thô (như chuỗi, int32, v.v.). extendkhông hoạt động cho các loại tin nhắn.
abeboparebop

4
Nếu bạn muốn ghi đè trường loại thông báo lặp lại thì trước tiên bạn cần xóa và sau đó mở rộng. del person.siblings[:] person.siblings.extend([Person(), Person()])
Neil


1
hãy nhớ chuyển vào các đối số để mở rộng dưới dạng một mảng (hoặc danh sách), bọc chúng bằng dấu ngoặc nếu bạn cần!
Nicholas Gentile

33

Nếu bạn không muốn mở rộng nhưng ghi đè nó hoàn toàn, bạn có thể làm:

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

Cách tiếp cận này cũng sẽ hoạt động để xóa hoàn toàn trường:

del person.id[:]

3
Đối với các loại kết hợp lặp lại, bạn không thể sử dụng person.id [:] = [xxx] để chỉ định thay thế. Trước tiên bạn phải xóa tất cả chúng và sau đó mở rộng
ospider

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.