Tekrarlanan alana nasıl atanır?


93

Python'da protokol arabellekleri kullanıyorum ve bir Personmesajım var

repeated uint64 id

ama ona şöyle bir değer atamaya çalıştığımda:

person.id = [1, 32, 43432]

Bir hata alıyorum: Assigment not allowed for repeated field "id" in protocol message object Tekrarlanan bir alana nasıl değer atanır?

Yanıtlar:


121

Gereğince belgeleri , doğrudan yinelenen bir alan atamak mümkün değildir. Bu durumda, extendlistedeki tüm öğeleri alana eklemek için arayabilirsiniz .

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

11
Benzer şekilde, tek bir değer eklemek için append(), ör person.id.append(1). Bu, herhangi bir protobuf repeated alanı için geçerlidir .
Hindol

17
appendalan bir ham türden ziyade bir ileti türündeyse (string, int32 vb. gibi) çalışmaz. extendmesaj türleri için çalışır.
abeboparebop

4
Tekrarlanan bir mesaj türü alanının üzerine yazmak istiyorsanız, önce silmeniz ve ardından genişletmeniz gerekir. del person.siblings[:] person.siblings.extend([Person(), Person()])
Neil


1
Bir dizi (veya liste) olarak genişletmek için argümanları iletmeyi unutmayın, gerekirse parantez içine alın!
Nicholas Gentile

35

Sen istemiyorsan uzatmak ama tamamen üzerine yazmak, yapabileceğiniz:

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

Bu yaklaşım aynı zamanda alanı tamamen temizlemek için de çalışacaktır:

del person.id[:]

3
Yinelenen bileşik türler için, değiştirmeyi atamak için person.id [:] = [xxx] kullanamazsınız. Önce tüm silin ve ardından uzatmak zorunda
ospider


0

Tekrarlanan alanlarda çalışma için temel bir örnek almaya çalışırken çok fazla uykuyu kaybettikten sonra, sonunda anladım.

Sorun:

  • Kare ve çarpan olmak üzere iki işlevli bir calculator.py oluşturun.
  • GRPC kullanarak, bunun için bir Proto dosyası oluşturun.
  • Bir sunucu, bir istemci yazın.
  • Sunucuyu çalıştırın ve doğru sonuçları almak için istemciyi çalıştırın.

Proto dosyası:

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) {}
}

Şimdi kare kısım kolay, ancak Çarpan için bir Sayılar listesi geçirmek istedim (proto dosyasında tanımlandığı gibi Sayı türünde olduğu gibi).

Sorun tekrarlanan alandaydı. Ve işte kısaca nihai çözüm.

Çözüm:

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)

Hesap Makinesi Çarpanı işlevi (çünkü bunun gösterilmesi gerekir):

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

Umarım bu birine yardımcı olur. Umarım bu olması gerektiği kadar açıklayıcıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.