python proto repeated对象赋值报错 ‘Assignment not allowed to repeated field “***“ in protocol messag‘

文章讲述了在Proto3语法中,如何正确处理被`repeated`修饰的字段。`repeatedint32ids`表示一个可重复的整数序列。错误示例尝试直接赋值给字段导致AttributeError,而正确的做法是将`ids`视为列表并使用`append`方法添加元素。
Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

proro文件

syntax = "proto3";

message TestRequest {
    # 修饰符  类型  字段名 序号
    repeated int32 ids = 1;  
}    

ids的类型是int32,然后被repeated修饰,即这个字段是可重复赋值的。

错误示例:

request = TestRequest()
request.ids = [0]

报错

AttributeError: Assignment not allowed to repeated field “ids” in protocol message object.

正确方法:

request = TestRequest()
request.ids.append(1)

将被repeated修饰的字段看作是一个空列表,往里面添加值即可

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

当你在使用Protocol Buffers (protobuf) 编码数据并尝试通过`Marshal()`函数序列化数据时,如果遇到这个错误提示"proto: required field protocol.Version.major not set",这意味着你在protobuf消息结构中有一个被称为`protocol.Version.major`的字段被标记为必需(Required),但在实际编码之前这个字段的值未被设置。 `protocol.Version`是一个嵌套的结构,通常包含版本号的两个部分(major和minor),protobuf要求在发送数据前这些必需字段必须有非空的值。解决这个问题,你需要检查以下几个步骤: 1. 确保在创建`ProtocolVersion`实例时设置了`major`和`minor`字段。例如: ```go version := &yourpb.ProtocolVersion{} version.Major = 1 version.Minor = 0 // 根据实际情况填充 message := &yourpb.YourMessage{ ProtocolVersion: version, // 其他字段... } ``` 2. 如果`ProtocolVersion`是一个嵌套结构,可能需要将其作为整个消息的一个字段来设置: ```go message := &yourpb.YourMessage{ Protocol: &yourpb.ProtocolVersion{ Major: 1, Minor: 0, }, // 其他字段... } ``` 3. 检查是否有初始化`YourMessage`时漏掉字段的情况。确保所有必需字段都有对应值。 4. 如果是在解析数据时出错,可能是服务器端发送的数据不完整。确认服务端是否正确地生成了protobuf消息。 如果你已经按照上述步骤检查过还是出现问题,那么可以提供具体的代码片段以便更好地诊断问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值