{"record":{"id":"71560a1c41518e29","repo":"Lightning-AI/pytorch-lightning","slug":"you-cannot-pass-both-trainer-validate-dataloader","errorCode":null,"errorMessage":"\"You cannot pass both `trainer.validate(dataloaders=..., datamodule=...)`\"","messagePattern":"\"You cannot pass both `trainer\\.validate\\(dataloaders=\\.\\.\\., datamodule=\\.\\.\\.\\)`\"","errorType":"validation","errorClass":"MisconfigurationException","httpStatus":null,"severity":"error","filePath":"src/lightning/pytorch/trainer/trainer.py","lineNumber":732,"sourceCode":"        model: Optional[\"pl.LightningModule\"] = None,\n        dataloaders: Optional[Union[EVAL_DATALOADERS, LightningDataModule]] = None,\n        ckpt_path: Optional[_PATH] = None,\n        verbose: bool = True,\n        datamodule: Optional[LightningDataModule] = None,\n        weights_only: Optional[bool] = None,\n    ) -> Optional[Union[_PREDICT_OUTPUT, _EVALUATE_OUTPUT]]:\n        # --------------------\n        # SETUP HOOK\n        # --------------------\n        log.debug(f\"{self.__class__.__name__}: trainer validate stage\")\n\n        # if a datamodule comes in as the second arg, then fix it for the user\n        if isinstance(dataloaders, LightningDataModule):\n            datamodule = dataloaders\n            dataloaders = None\n        # If you supply a datamodule you can't supply val_dataloaders\n        if dataloaders is not None and datamodule:\n            raise MisconfigurationException(\"You cannot pass both `trainer.validate(dataloaders=..., datamodule=...)`\")\n\n        if model is None:\n            model = self.lightning_module\n            model_provided = False\n        else:\n            model_provided = True\n\n        self.validate_loop.verbose = verbose\n\n        # links data to the trainer\n        self._data_connector.attach_data(model, val_dataloaders=dataloaders, datamodule=datamodule)\n\n        assert self.state.fn is not None\n        if _is_registry(ckpt_path) and module_available(\"litmodels\"):\n            download_model_from_registry(ckpt_path, self)\n        ckpt_path = self._checkpoint_connector._select_ckpt_path(\n            self.state.fn, ckpt_path, model_provided=model_provided, model_connected=self.lightning_module is not None\n        )","sourceCodeStart":714,"sourceCodeEnd":750,"githubUrl":"https://github.com/Lightning-AI/pytorch-lightning/blob/9fed5c27d2a62ff0efd6c3573599921d6ff67c14/src/lightning/pytorch/trainer/trainer.py#L714-L750","documentation":"trainer.validate() was called with both dataloaders and datamodule keyword arguments. Only one data source may be specified; passing both raises MisconfigurationException. A datamodule passed positionally as dataloaders is auto-detected and reassigned, so that path is fine.","triggerScenarios":"trainer.validate(model, dataloaders=val_loader, datamodule=dm); also trainer.validate(model, dm, dataloaders=val_loader).","commonSituations":"Refactoring evaluation code from dataloaders to datamodules while leaving the old argument in place.","solutions":["Drop dataloaders= and implement val_dataloader() in the datamodule","Or drop datamodule= and pass dataloaders only"],"exampleFix":"# before\ntrainer.validate(model, dataloaders=val_loader, datamodule=dm)\n# after\ntrainer.validate(model, datamodule=dm)","handlingStrategy":"validation","validationCode":"if dataloaders is not None and datamodule is not None:\n    raise ValueError(\"pass either dataloaders or datamodule to validate(), not both\")\ntrainer.validate(model, dataloaders=dataloaders, datamodule=datamodule)","typeGuard":"def validate_args_ok(dls, dm) -> bool:\n    return not (dls is not None and dm is not None)","tryCatchPattern":null,"preventionTips":["Pick one data source convention and apply it to fit/validate/test/predict uniformly"],"tags":["trainer","validate","datamodule","dataloader","misconfiguration","pytorch-lightning"],"backgroundTag":"conflicting-data-source-arguments","analyzedSha":"9fed5c27d2a62ff0efd6c3573599921d6ff67c14","analyzedAt":"2026-08-28T11:52:41.083Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}