class_docstr: Wrapper for doing multitask training using multiple data objects.
  Takes a dictionary of data objects, does round robin over their
  iterators using BatchSampler.
  
  Args:
      config (Config): Configuration object of type DisjointMultitaskData.Config.
      data_dict (Dict[str, Data]): Data objects to do roundrobin over.
      *args (type): Extra arguments to be passed down to sub data handlers.
      **kwargs (type): Extra arguments to be passed down to sub data handlers.
  
  Attributes:
      data_dict (type): Data handlers to do roundrobin over.
code: def __init__(
      self,
      data_dict: Dict[str, Data],
      samplers: Dict[Stage, BaseBatchSampler],
      test_key: str = None,
      task_key: str = BatchContext.TASK_NAME,
  ) -> None:
      self.test_key = test_key or list(data_dict)[0]
      # currently the way training is set up is that, the data object needs
      # to specify a data_source which is used at test time. For multitask
      # this is set to the data_source associated with the test_key
      data_source = data_dict[self.test_key].data_source
      tensorizers = data_dict[self.test_key].tensorizers
      super().__init__(data_source, tensorizers)
      self.data_dict = data_dict
      self.samplers = samplers
      self.task_key = task_key
  
file_path: pytext/pytext/data/disjoint_multitask_data.py
imports: from typing import Dict, Optional
  from pytext.common.constants import BatchContext, Stage
  from pytext.config.component import Component, ComponentType, create_component
  from pytext.data import BaseBatchSampler, Data, EvalBatchSampler, generator_iterator, RoundRobinBatchSampler
  from pytext.data.data import BatchData
label_desc: Use image node_id 2 to create a new DisjointMultitaskData object from inherited base classes: Data with example: obj = DisjointMultitaskData(data_dict, samplers, test_key, task_key)