code: def test_custom_torch_batch_sampler(predicting):
      """This test asserts, that custom `BatchSampler`, with all the arguments, that are required in order to properly
      reinstantiate the class, is invoked properly.
  
      It also asserts, that during the reinstantiation, the wrapper of `__init__` method is not present anymore, therefore
      not setting `__pl_saved_{args,arg_names,kwargs}` attributes.
  
      """
  
      class MyBatchSampler(BatchSampler):
          # Custom Batch sampler with extra argument and default value
          def __init__(self, sampler, extra_arg, drop_last=True):
              self.extra_arg = extra_arg
              super().__init__(sampler, 10, drop_last)
  
      sampler = RandomSampler(range(10))
      with _replace_dunder_methods(BatchSampler):
          # instantiate within `_replace_dunder_method` context manager, simulating `*_dataloader` hooks
          batch_sampler = MyBatchSampler(sampler, "random_str")
  
      dataloader = DataLoader(range(10), batch_sampler=batch_sampler)
  
      # assert that passed information got saved
      assert dataloader.batch_sampler.__pl_saved_args == (
          sampler,
          "random_str",
      )
      assert dataloader.batch_sampler.__pl_saved_kwargs == {}
      assert dataloader.batch_sampler.__pl_saved_arg_names == (
          "sampler",
          "extra_arg",
      )
      assert dataloader.batch_sampler.__pl_saved_default_kwargs == {
          "drop_last": True
      }
  
      # updating dataloader, what happens on access of the dataloaders.
      # This should not fail, and would fail before support for custom args.
      dataloader = _update_dataloader(
          dataloader,
          dataloader.sampler,
          mode=(RunningStage.PREDICTING if predicting else None),
      )
  
      # Assert the `__init__` method is not replaced anymore and everything is instantiated to correct types
      batch_sampler = dataloader.batch_sampler
  
      if predicting:
          assert isinstance(batch_sampler, _IndexBatchSamplerWrapper)
          batch_sampler = batch_sampler._batch_sampler
  
      assert isinstance(batch_sampler, MyBatchSampler)
      assert batch_sampler.drop_last == (not predicting)
  
      assert batch_sampler.extra_arg == "random_str"
      assert not hasattr(batch_sampler, "__pl_saved_kwargs")
      assert not hasattr(batch_sampler, "__pl_saved_arg_names")
      assert not hasattr(batch_sampler, "__pl_saved_args")
      assert not hasattr(batch_sampler, "__pl_saved_default_kwargs")
  
imports: from dataclasses import dataclass
  from unittest.mock import Mock
  import numpy
  import pytest
  import torch
  from lightning.fabric.utilities.data import _replace_dunder_methods
  from lightning.pytorch import Trainer
  from lightning.pytorch.demos.boring_classes import RandomDataset, RandomIterableDataset
  from lightning.pytorch.overrides.distributed import _IndexBatchSamplerWrapper
  from lightning.pytorch.trainer.states import RunningStage
  from lightning.pytorch.utilities.data import _get_dataloader_init_args_and_kwargs, _update_dataloader, extract_batch_size, has_len_all_ranks, warning_cache
  from lightning.pytorch.utilities.exceptions import MisconfigurationException
  from lightning_utilities.test.warning import no_warning_call
  from torch import Tensor
  from torch.utils.data import BatchSampler, DataLoader, RandomSampler
label_desc: Use image node_id 4 for calling a global function with example usage: test_custom_torch_batch_sampler(predicting) without return types