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?

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])

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[:]

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.