如何分配重复的字段?

Pao*_*aJ. 66 python protocol-buffers

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

repeated uint64 id
Run Code Online (Sandbox Code Playgroud)

但是当我尝试分配时

person.id = [1, 32, 43432]
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*Tim 88

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

person.id.extend([1, 32, 43432])
Run Code Online (Sandbox Code Playgroud)

  • 如果字段是消息类型而不是原始类型(如string,int32等),则`append`不起作用.`extend`适用于消息类型. (13认同)
  • 同样,要添加单个值,请使用`append()`,例如`person.id.append(1)`.这适用于**任何***protobuf*`重复`字段. (8认同)
  • 如果要覆盖重复的消息类型字段,则需要先删除然后再进行扩展.`del person.siblings [:]``person.siblings.extend([Person(),Person()])` (2认同)
  • https://developers.google.com/protocol-buffers/docs/reference/python- generated?csw=1#repeated-message-fields (2认同)

kir*_*pit 21

如果您不想扩展但完全覆盖它,您可以执行以下操作:

person.id[:] = [1, 32, 43432]
Run Code Online (Sandbox Code Playgroud)

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

del person.id[:]
Run Code Online (Sandbox Code Playgroud)

  • 对于重复的复合类型,您不能使用 person.id[:] = [xxx] 来分配替换。您必须先将它们全部删除,然后再扩展 (4认同)

Ari*_*ury 10

经过大量睡眠尝试获得重复领域工作的基本示例后,我终于明白了。

问题:

  • 创建一个包含两个函数(平方和乘数)的计算器.py。
  • 使用 GRPC,为其创建一个 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) {}
}
Run Code Online (Sandbox Code Playgroud)

现在平方部分很简单,但对于乘数,我想传递一个数字列表(如原型文件中定义的数字类型)。

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

解决方案:

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)
Run Code Online (Sandbox Code Playgroud)

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

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

希望这对某人有帮助。希望这具有应有的描述性。


Cha*_*ler 6

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

del person.things[:]
person.things.extend([thing1, thing2, ..])
Run Code Online (Sandbox Code Playgroud)

取自这些评论 如何分配给重复的字段? 如何分配给重复字段?