You need to enable JavaScript to run this app. Python3遍历整型键字典触发'int object is not subscriptable'报错 无法完成Protobuf变量赋值
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.05 06:15:06