How to assign to repeated field?

我在 python 中使用了协议缓冲,并且我有一个 Person消息

repeated uint64 id

但是当我给它赋值时,比如:

person.id = [1, 32, 43432]

我得到一个错误: Assigment not allowed for repeated field "id" in protocol message object 如何为重复字段赋值?

120741 次浏览

根据 文件,您不能直接分配给重复的字段。在这种情况下,可以调用 extend将列表中的所有元素添加到字段中。

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

如果你不想覆盖 extend,但完全覆盖它,你可以这样做:

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

这一办法还将有助于彻底清除这一领域的障碍:

del person.id[:]

对于重复的复合类型,这种方法对我很有效。

del person.things[:]
person.things.extend([thing1, thing2, ..])

来自这些评论 如何对重复字段进行赋值? 如何对重复字段进行赋值?

在失去了大量的睡眠,试图得到一个重复领域工作的基本例子,我终于得到了它。

问题是:

  • 创建一个具有两个函数的 Calculator.py,这两个函数分别是 square 和 multilier。
  • 使用 GRPC,创建一个相同的 Proto 文件。
  • Write a server, a client.
  • 运行服务器,并运行客户端以获得正确的结果。

原型文件:

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

现在正方形部分很容易,但是对于乘法器,我想传递一个 Numbers 列表(如在原型文件中定义的 Number 类型)。

问题出在 重复字段上。简而言之,这是最终的解决方案。

解决办法:

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)

计算器乘法器函数(因为需要显示) :

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

Hope this helps someone. Hope this is as descriptive as it should be.