修复Python中gRPC列表对象的TypeError: No positional arguments allowed错误
解决gRPC Repeated字段赋值的"No position arguments are allowed"错误
错误原因
你用request.partnered_wh.add(partnered_wh)直接传位置参数,而gRPC生成的add()方法不接受位置参数,只能通过关键字参数初始化字段,或者先创建空实例再合并已有对象。
最佳解决方案
最简洁高效的方式是直接用extend()方法,一次性将Python列表中的所有对象添加到gRPC的repeated字段中,不需要循环:
def get_warehouses( self, base_wh: create_attributes_pb2.CreateAttributes, partnered_whs: List[create_attributes_pb2.CreateAttributes], ) -> int: start_time = utcnow().replace(tzinfo=None) request = get_warehouses_request_pb2.GetWarehousesRequest( base_wh=base_wh, ) # 直接用extend批量添加 request.partnered_wh.extend(partnered_whs)
替代方案(逐个添加)
如果需要逐个处理每个对象,可以先创建空的CreateAttributes实例,再用MergeFrom()合并已有对象,避免传位置参数:
for partnered_wh in partnered_whs: new_wh = request.partnered_wh.add() # 无参数调用add()创建空实例 new_wh.MergeFrom(partnered_wh) # 合并已有对象的字段
关于直接赋值
gRPC生成的repeated字段是RepeatedCompositeFieldContainer类型,不能直接用=赋值,必须通过extend()或add()方法来添加元素,这是因为它是绑定到proto消息的特殊容器,需要维护内部一致性和序列化规则。
内容的提问来源于stack exchange,提问作者Em Ae
相关产品推荐
相关产品推荐

