{"record":{"id":"5b6cb79e08f957bf","repo":"facebookresearch/detectron2","slug":"instances-object-is-not-iterable","errorCode":null,"errorMessage":"`Instances` object is not iterable!","messagePattern":"`Instances` object is not iterable!","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"detectron2/structures/instances.py","lineNumber":151,"sourceCode":"        if type(item) is int:\n            if item >= len(self) or item < -len(self):\n                raise IndexError(\"Instances index out of range!\")\n            else:\n                item = slice(item, None, len(self))\n\n        ret = Instances(self._image_size)\n        for k, v in self._fields.items():\n            ret.set(k, v[item])\n        return ret\n\n    def __len__(self) -> int:\n        for v in self._fields.values():\n            # use __len__ because len() has to be int and is not friendly to tracing\n            return v.__len__()\n        raise NotImplementedError(\"Empty Instances does not support __len__!\")\n\n    def __iter__(self):\n        raise NotImplementedError(\"`Instances` object is not iterable!\")\n\n    @staticmethod\n    def cat(instance_lists: List[\"Instances\"]) -> \"Instances\":\n        \"\"\"\n        Args:\n            instance_lists (list[Instances])\n\n        Returns:\n            Instances\n        \"\"\"\n        assert all(isinstance(i, Instances) for i in instance_lists)\n        assert len(instance_lists) > 0\n        if len(instance_lists) == 1:\n            return instance_lists[0]\n\n        image_size = instance_lists[0].image_size\n        if not isinstance(image_size, torch.Tensor):  # could be a tensor in tracing\n            for i in instance_lists[1:]:","sourceCodeStart":133,"sourceCodeEnd":169,"githubUrl":"https://github.com/facebookresearch/detectron2/blob/a2f4a8771ab77e8411c26b27f24f9489a28a2453/detectron2/structures/instances.py#L133-L169","documentation":"Instances deliberately does not implement __iter__ because per-instance iteration is ambiguous over which field drives the length; iterating with a for loop raises NotImplementedError.","triggerScenarios":"`for inst in instances:` or iter(instances) on any Instances object, populated or not.","commonSituations":"Treating Instances like a list of per-instance dicts (as some older Detectron1 or torchvision APIs allow); list comprehension over detections.","solutions":["Index explicitly: for i in range(len(instances)): use instances.pred_classes[i], instances.scores[i]","Convert to rows: instances_to_coco_json(instances, img_id) or zip(*fields.values())","Wrap in a helper that materializes per-instance dicts once"],"exampleFix":"# before\nfor inst in instances:\n    print(inst.scores)\n# after\nfor i in range(len(instances)):\n    print(instances.scores[i])","handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never iterate Instances with for-in; index fields by integer","Materialize per-instance dicts with a helper before iterating"],"tags":["detectron2","instances","iteration"],"backgroundTag":"unsupported-iteration-protocol","analyzedSha":"a2f4a8771ab77e8411c26b27f24f9489a28a2453","analyzedAt":"2026-08-27T12:08:21.260Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}