{"record":{"id":"ae9c96571cab412f","repo":"Lightning-AI/pytorch-lightning","slug":"please-call-iter-combined-loader-first","errorCode":null,"errorMessage":"Please call `iter(combined_loader)` first.","messagePattern":"Please call `iter\\(combined_loader\\)` first\\.","errorType":"validation","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"src/lightning/pytorch/utilities/combined_loader.py","lineNumber":358,"sourceCode":"        assert self._iterator is not None\n        out = next(self._iterator)\n        if isinstance(self._iterator, _Sequential):\n            return out\n        out, batch_idx, dataloader_idx = out\n        return tree_unflatten(out, self._spec), batch_idx, dataloader_idx\n\n    @override\n    def __iter__(self) -> Self:\n        cls = _SUPPORTED_MODES[self._mode][\"iterator\"]\n        iterator = cls(self.flattened, self._limits)\n        iter(iterator)\n        self._iterator = iterator\n        return self\n\n    def __len__(self) -> int:\n        \"\"\"Compute the number of batches.\"\"\"\n        if self._iterator is None:\n            raise RuntimeError(\"Please call `iter(combined_loader)` first.\")\n        return len(self._iterator)\n\n    def reset(self) -> None:\n        \"\"\"Reset the state and shutdown any workers.\"\"\"\n        if self._iterator is not None:\n            self._iterator.reset()\n            self._iterator = None\n        for iterable in self.flattened:\n            _shutdown_workers_and_reset_iterator(iterable)\n\n    def _dataset_length(self) -> int:\n        \"\"\"Compute the total length of the datasets according to the current mode.\"\"\"\n        datasets = [getattr(dl, \"dataset\", None) for dl in self.flattened]\n        lengths = [length for ds in datasets if (length := sized_len(ds)) is not None]\n        if not lengths:\n            raise NotImplementedError(\"All datasets are iterable-style datasets.\")\n        fn = _SUPPORTED_MODES[self._mode][\"fn\"]\n        return fn(lengths)","sourceCodeStart":340,"sourceCodeEnd":376,"githubUrl":"https://github.com/Lightning-AI/pytorch-lightning/blob/9fed5c27d2a62ff0efd6c3573599921d6ff67c14/src/lightning/pytorch/utilities/combined_loader.py#L340-L376","documentation":"CombinedLoader.__len__ requires an active iterator because length depends on the combination mode's iterator state. Calling len() before iter(combined_loader) raises RuntimeError.","triggerScenarios":"cl = CombinedLoader(...); len(cl) without ever calling iter(cl) or looping over it.","commonSituations":"Inspecting loader length right after construction; calling len() in setup() before iteration begins.","solutions":["Call it = iter(cl) first, then len(cl) works","Or loop over the loader once (for-loop implicitly calls iter) before checking length"],"exampleFix":"# before\ncl = CombinedLoader([dl1, dl2])\nn = len(cl)  # RuntimeError\n# after\nit = iter(cl)\nn = len(cl)","handlingStrategy":"validation","validationCode":"assert cl._iterator is not None, \"call iter(cl) before len(cl)\"","typeGuard":null,"tryCatchPattern":"try:\n    n = len(cl)\nexcept RuntimeError:\n    _ = iter(cl)\n    n = len(cl)","preventionTips":["Initialize iteration before any length queries in setup/inspection code"],"tags":["combined-loader","iteration-order","runtime-state"],"backgroundTag":"iterating-before-initialization","analyzedSha":"9fed5c27d2a62ff0efd6c3573599921d6ff67c14","analyzedAt":"2026-08-28T11:52:41.083Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}