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
- Remove dataloaders= and implement test_dataloader() in the datamodule
- 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
- Centralize data-source selection in one place so all entrypoints stay consistent
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
- "You cannot pass `train_dataloader` or `val_dataloaders` to
- "You cannot pass both `trainer.validate(dataloaders=..., dat
- You cannot pass both `trainer.predict(dataloaders=..., datam
- f"`Trainer(barebones=True, log_every_n_steps={log_every_n_st
- f"`Trainer(barebones=True, enable_model_summary={enable_mode
AI-assisted analysis of Lightning-AI/pytorch-lightning@9fed5c27d2 (2026-08-28).
Data as JSON: /api/errors/4861cd5dfc9597d7.
Report an issue: GitHub.