如何分配重复的字段?

时间:2014-05-18 20:06:46

标签: python protocol-buffers

我在python中使用协议缓冲区,我有Person消息

repeated uint64 id

但是当我尝试分配

person.id = [1, 32, 43432]

我收到错误Assigment not allowed for repeated field "id" in protocol message object 如何分配重复的字段?

5 个答案:

答案 0 :(得分:73)

根据documentation,您无法直接指定重复字段。在这种情况下,您可以调用extend将列表中的所有元素添加到字段中。

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

答案 1 :(得分:17)

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

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

这种方法也可以完全清除这个领域:

del person.id[:]

答案 2 :(得分:1)

对于重复的复合类型,这对我有用。

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

摘自这些评论 How to assign to repeated field? How to assign to repeated field?

答案 3 :(得分:1)

在睡了很多觉之后试图获得一个重复字段工作的基本示例后,我终于明白了。

问题:

  • 创建一个带有两个函数(平方和乘法器)的calculator.py。
  • 使用 GRPC,为其创建一个 Proto 文件。
  • 编写一个服务器,一个客户端。
  • 运行服务器,并运行客户端以获得正确的结果。

Proto 文件:

if errors.Is(opErr,syscall.ECONNRESET) {
  fmt.Println("Found a ECONNRESET")
}

现在正方形部分很简单,但是对于乘数,我想传递一个数字列表(如 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) {}
}

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

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)

希望这对某人有所帮助。希望这是描述性的。

答案 4 :(得分:-1)

您可以尝试使用MergeFrom

查看这些文档以获取可用的消息方法的完整列表: https://developers.google.com/protocol-buffers/docs/reference/python/google.protobuf.message.Message-class