如何给重复字段赋值?

136 投票
4 回答
151353 浏览
提问于 2025-04-18 06:56

我在用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])

撰写回答