如何修复:TypeError:使用gRPC的python List对象中不允许使用位置参数

vxqlmq5t  于 2023-05-27  发布在  Python
关注(0)|答案(1)|浏览(151)

我已经看过这个post了,它没有回答我的问题
下面是我的proto文件的样子

message GetWarehousesRequest {
  CreateAttributes base_wh = 1;
  repeated CreateAttributes partnered_wh = 2;
}

(我不张贴grpc方法签名,因为他们是微不足道的)

注意partnered_wh是一个数组。

在python中我有这个方法

def get_warehouses(
        self,
        base_wh: create_attributes_pb2,
        partnered_whs: List[create_attributes_pb2],
    ) -> int:
        start_time = utcnow().replace(tzinfo=None)
        request = get_warehouses_request_pb2(
            base_wh=base_wh,
        )

        for partnered_wh in partnered_whs:
            request.partnered_wh.add(partnered_wh)

在for循环中,我得到错误 No position arguments are allowed。我需要将python List转换为gRPC数组。最好的办法是什么?我可以把这个列表分配给对象吗?还是有更好的办法?

zpgglvta

zpgglvta1#

你有三个选择:

  1. c = p.add()--添加一个新的子节点并返回(!)它
    1.p.append(c)--追加子级 1.p.extend([c1,.. cn])--追加多个子项
    假设create_attributes.proto
syntax = "proto3";

message CreateAttributes {}

message GetWarehousesRequest {
  CreateAttributes base_wh = 1;
  repeated CreateAttributes partnered_wh = 2;
}

并且:

protoc \
--proto_path=${PWD} \
--python_out=${PWD} \
--pyi_out=${PWD} \
${PWD}/create_attributes.proto

然后:

import create_attributes_pb2
import datetime

def get_warehouses(
  self,
  base_wh: create_attributes_pb2.CreateAttributes,
  partnered_whs: List[create_attributes_pb2.CreateAttributes],
) -> int:
  start_time = datetime.datetime.utcnow().replace(tzinfo=None)
  request =create_attributes_pb2.GetWarehousesRequest(
    base_wh=base_wh,
  )

  # You can append the list (!) using `extend`
  request.partnered_wh.extend(partnered_whs)

  return(1)

演示每种方法(1..3):

import create_attributes_pb2

gwr = create_attributes_pb2.GetWarehousesRequest()

# 1 `add` adds a new and returns a CreateAttributes (ca1)
ca1 = gwr.partnered_wh.add()
assert(type(ca1) == create_attributes_pb2.CreateAttributes)

# 2 `append` adds an existing CreateAttributes (ca2)
ca2 = create_attributes_pb2.CreateAttributes()
gwr.partnered_wh.append(ca2)

# 3 `extends` adds a list of existing CreateAttributes
ca3 = create_attributes_pb2.CreateAttributes()
ca4 = create_attributes_pb2.CreateAttributes()
gwr.partnered_wh.extend([ca3,ca4])

print(gwr)

相关问题