如何给重复字段赋值?
我在用Python编程的时候,使用了协议缓冲区(protocol buffers),并且我有一个叫做Person
的消息。
repeated uint64 id
但是当我试着给它赋值,比如:
person.id = [1, 32, 43432]
我遇到了一个错误:在协议消息对象中,不允许对重复字段 "id" 进行赋值
。我该怎么给一个重复字段赋值呢?
4 个回答
10
在花了很多时间试图让一个关于重复字段的基本例子正常工作后,我终于搞定了。
问题:
- 创建一个名为 calculator.py 的文件,里面有两个函数,分别是 square(平方)和 multiplier(乘法器)。
- 使用 GRPC 创建一个对应的 Proto 文件。
- 写一个服务器和一个客户端。
- 运行服务器,然后运行客户端以获得正确的结果。
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) {}
}
平方的部分比较简单,但对于乘法器,我想传递一个数字列表(这个数字类型在 proto 文件中定义)。
问题出在 repeated 字段上。下面是最终的解决方案,简明扼要。
解决方案:
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
希望这能帮助到某个人。希望这个描述足够清晰。
13
对于重复的复合类型,这个方法对我有效。
del person.things[:]
person.things.extend([thing1, thing2, ..])
这个内容来自于以下评论: 如何给重复字段赋值? 如何给重复字段赋值?
62
如果你不想在原来的基础上添加内容,而是想完全替换掉它,你可以这样做:
person.id[:] = [1, 32, 43432]
这种方法也可以用来完全清空这个字段:
del person.id[:]
174
根据文档,你不能直接给一个重复字段赋值。也就是说,如果你想往这个字段里添加多个元素,可以使用extend
这个方法,把列表里的所有元素都加进去。
person.id.extend([1, 32, 43432])