Bagaimana cara menetapkan ke bidang berulang?

93

Saya menggunakan buffer protokol dengan python dan saya mendapat Personpesan

repeated uint64 id

tetapi ketika saya mencoba untuk memberikan nilai seperti:

person.id = [1, 32, 43432]

Saya mendapatkan kesalahan: Assigment not allowed for repeated field "id" in protocol message object Bagaimana cara menetapkan nilai ke bidang berulang?

PaolaJ.
sumber

Jawaban:

121

Sesuai dokumentasi , Anda tidak dapat langsung menetapkan ke bidang berulang. Dalam hal ini, Anda dapat memanggil extenduntuk menambahkan semua elemen dalam daftar ke bidang.

person.id.extend([1, 32, 43432])
Tim
sumber
11
Demikian pula, untuk menambahkan nilai tunggal, gunakan append(), mis person.id.append(1). Ini berlaku untuk bidang protobuf apa pun . repeated
Hindol
17
appendtidak berfungsi jika bidang adalah tipe pesan daripada tipe mentah (seperti string, int32, dll). extendberfungsi untuk jenis pesan.
abeboparebop
4
Jika Anda ingin menimpa bidang jenis pesan yang berulang, Anda harus menghapusnya terlebih dahulu, lalu memperpanjang. del person.siblings[:] person.siblings.extend([Person(), Person()])
Neil
1
ingat untuk meneruskan argumen untuk diperluas sebagai larik (atau daftar), bungkus dengan tanda kurung jika perlu!
Nicholas Gentile
35

Jika Anda tidak ingin memperpanjang tetapi menimpanya sepenuhnya, Anda dapat melakukan:

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

Pendekatan ini juga akan bekerja untuk membersihkan seluruh bidang:

del person.id[:]
kirpit
sumber
3
Untuk tipe komposit berulang, Anda tidak dapat menggunakan person.id [:] = [xxx] untuk menetapkan penggantian. Anda harus terlebih dahulu menghapus semuanya dan kemudian memperpanjang
ospider
0

Setelah kehilangan banyak waktu untuk mencoba mendapatkan contoh dasar untuk pekerjaan berulang kali, saya akhirnya mendapatkannya.

Masalah:

  • Buat kalkulator.py dengan dua fungsi, kuadrat dan pengganda.
  • Menggunakan GRPC, buat file Proto yang sama.
  • Tulis server, klien.
  • Jalankan server, dan jalankan klien untuk mendapatkan hasil yang benar.

File Proto:

syntax = "proto3";

message Number {
    int32 value = 1;
}

message NumList {
    string name = 1;
    repeated Number nums = 2;
}

service Calculator {
    rpc Multiplier(NumList) returns (Number) {}
    rpc Square(Number) returns (Number) {}
}

Sekarang bagian persegi itu mudah, tetapi untuk Pengganda, saya ingin meneruskan daftar Bilangan (seperti dalam tipe Angka seperti yang didefinisikan dalam file proto).

Masalahnya adalah dengan bidang yang berulang . Dan inilah solusi pamungkas singkatnya.

Solusinya:

import grpc

# import the generated classes
import calculator_pb2
import calculator_pb2_grpc
# open a gRPC channel
channel = grpc.insecure_channel('localhost:50051')

# create a stub (client)
stub = calculator_pb2_grpc.CalculatorStub(channel)
num_list = calculator_pb2.NumList()
num_list.name = 'MyFirstList'
n1 = num_list.nums.add()
n2 = num_list.nums.add()
n3 = num_list.nums.add()
n1.value = 10
n2.value = 20
n3.value = 30

assert len(num_list.nums) == 3

response = stub.Multiplier(num_list)
print(response.value)

Fungsi Pengali Kalkulator (karena ini perlu ditampilkan):

def multiplier(numlist, name):
    mul = 1
    for num in numlist:
        mul = mul * num.value
    print(f'Result of list {name}')
    return mul

Semoga ini bisa membantu seseorang. Semoga ini deskriptif sebagaimana mestinya.

Arindam Roychowdhury
sumber