Lightning-AI/pytorch-lightning · error · MisconfigurationException

You cannot pass both `trainer.test(dataloaders=..., datamodu

Error message

You cannot pass both `trainer.test(dataloaders=..., datamodule=...)`

What it means

trainer.test() received both dataloaders and datamodule. Lightning allows exactly one data source per call and raises MisconfigurationException when both are given. A datamodule passed positionally (as the dataloaders slot) is detected and reassigned automatically.

Source

Thrown at src/lightning/pytorch/trainer/trainer.py:851

        model: Optional["pl.LightningModule"] = None,
        dataloaders: Optional[Union[EVAL_DATALOADERS, LightningDataModule]] = None,
        ckpt_path: Optional[_PATH] = None,
        verbose: bool = True,
        datamodule: Optional[LightningDataModule] = None,
        weights_only: Optional[bool] = None,
    ) -> Optional[Union[_PREDICT_OUTPUT, _EVALUATE_OUTPUT]]:
        # --------------------
        # SETUP HOOK
        # --------------------
        log.debug(f"{self.__class__.__name__}: trainer test stage")

        # if a datamodule comes in as the second arg, then fix it for the user
        if isinstance(dataloaders, LightningDataModule):
            datamodule = dataloaders
            dataloaders = None
        # If you supply a datamodule you can't supply test_dataloaders
        if dataloaders is not None and datamodule:
            raise MisconfigurationException("You cannot pass both `trainer.test(dataloaders=..., datamodule=...)`")

        if model is None:
            model = self.lightning_module
            model_provided = False
        else:
            model_provided = True

        self.test_loop.verbose = verbose

        # links data to the trainer
        self._data_connector.attach_data(model, test_dataloaders=dataloaders, datamodule=datamodule)

        assert self.state.fn is not None
        if _is_registry(ckpt_path) and module_available("litmodels"):
            download_model_from_registry(ckpt_path, self)
        ckpt_path = self._checkpoint_connector._select_ckpt_path(
            self.state.fn, ckpt_path, model_provided=model_provided, model_connected=self.lightning_module is not None
        )

View on GitHub (pinned to 9fed5c27d2)

Solutions

  1. Remove dataloaders= and implement test_dataloader() in the datamodule
  2. Or remove datamodule= and pass the dataloader only

Example fix

# before
trainer.test(model, dataloaders=test_loader, datamodule=dm)
# after
trainer.test(model, datamodule=dm)
Defensive patterns

Strategy: validation

Validate before calling

if dataloaders is not None and datamodule is not None:
    raise ValueError("pass either dataloaders or datamodule to test(), not both")
trainer.test(model, dataloaders=dataloaders, datamodule=datamodule)

Type guard

def test_args_ok(dls, dm) -> bool:
    return not (dls is not None and dm is not None)

Prevention

When it happens

Trigger: trainer.test(model, dataloaders=test_loader, datamodule=dm); also trainer.test(model, dm, dataloaders=test_loader).

Common situations: Copy-pasting evaluation boilerplate that mixes explicit test dataloaders with a shared datamodule.

Related errors


AI-assisted analysis of Lightning-AI/pytorch-lightning@9fed5c27d2 (2026-08-28). Data as JSON: /api/errors/4861cd5dfc9597d7. Report an issue: GitHub.