Python3遍历整型键字典触发'int object is not subscriptable'报错 无法完成Protobuf变量赋值
报错原因
直接遍历Python字典默认只会拿到字典的所有键,也就是整数21、22、23、31,并非带"device_type"、"device_status"键的子字典对象。代码尝试对整数做下标取键值的操作,自然会抛出'int' object is not subscriptable的错误。
修正方案
要拿到字典的完整键值对应关系,需要调用字典的items()遍历方法,直接获取每个键和对应的取值,匹配Protobuf字段的赋值逻辑:
- 字典的key(21、22这类整数)对应
device.type字段 - 字典的value(False/True这类布尔值)对应
device.state字段 - 每轮循环新建独立的Device实例,避免复用同一个对象导致所有属性被最后一轮循环覆盖
- 填充完属性的Device实例,需要手动追加到DeviceStatusMsg对应的repeated列表字段中,否则最终序列化的内容不会包含这些设备状态数据
修正后可运行代码
def get_encoded_payload(self, payload): self.logger.debug("started") # 入参payload实际结构:{21: False, 22: False, 23: False, 31: False} device_status = DeviceStatusMsg() # 用items()遍历直接拿到键值对,不再对元素做下标取键的操作 for device_type_id, device_state in payload.items(): device = Device() device.type = device_type_id device.state = device_state # 替换为你Protobuf定义中实际的repeated设备列表字段名 # 例如定义了repeated Device device_list = 1; 则执行如下追加 # device_status.device_list.append(device) return device_status
提示:原示例代码里的
//是其他语言的注释写法,Python里统一用#写注释,避免触发语法报错。
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

