Saya menggunakan buffer protokol dengan python dan saya mendapat Person
pesan
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?
python
protocol-buffers
PaolaJ.
sumber
sumber
append()
, misperson.id.append(1)
. Ini berlaku untuk bidang protobuf apa pun .repeated
append
tidak berfungsi jika bidang adalah tipe pesan daripada tipe mentah (seperti string, int32, dll).extend
berfungsi untuk jenis pesan.del person.siblings[:]
person.siblings.extend([Person(), Person()])
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[:]
sumber
Untuk tipe komposit berulang, inilah yang berhasil untuk saya.
del person.things[:] person.things.extend([thing1, thing2, ..])
diambil dari komentar ini Bagaimana menugaskan ke bidang berulang? Bagaimana cara menetapkan ke bidang berulang?
sumber
Setelah kehilangan banyak waktu untuk mencoba mendapatkan contoh dasar untuk pekerjaan berulang kali, saya akhirnya mendapatkannya.
Masalah:
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.
sumber