class_docstr: Wrapper for doing multitask training using multiple data handlers.
  Takes a dictionary of data handlers, does round robin over their
  iterators using RoundRobinBatchIterator.
  
  Args:
      config (Config): Configuration object of type DisjointMultitaskDataHandler.Config.
      data_handlers (Dict[str, DataHandler]): Data handlers to do roundrobin over.
      target_task_name (Optional[str]): Used to select best epoch, and set batch_per_epoch.
      *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_handlers (type): Data handlers to do roundrobin over.
      target_task_name (type): Used to select best epoch, and set batch_per_epoch.
      upsample (bool): If upsample, keep cycling over each iterator in round-robin.
        Iterators with less batches will get more passes.  If False, we do single
        pass over each iterator, the ones which run out will sit idle.  This is
        used for evaluation.  Default True.
class_docstr_tok: ["Wrapper","for","doing","multitask","training","using","multiple","data","handlers",".","Takes","a","dictionary","of","data","handlers",",","does","round","robin","over","their","iterators","using","RoundRobinBatchIterator",".","Args",":","config","(","Config",")",":","Configuration","object","of","type","DisjointMultitaskDataHandler.Config",".","data_handlers","(","Dict","[","str",",","DataHandler","]",")",":","Data","handlers","to","do","roundrobin","over",".","target_task_name","(","Optional","[","str","]",")",":","Used","to","select","best","epoch",",","and","set","batch_per_epoch",".","*","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_handlers","(","type",")",":","Data","handlers","to","do","roundrobin","over",".","target_task_name","(","type",")",":","Used","to","select","best","epoch",",","and","set","batch_per_epoch",".","upsample","(","bool",")",":","If","upsample",",","keep","cycling","over","each","iterator","in","round-robin",".","Iterators","with","less","batches","will","get","more","passes",".","If","False",",","we","do","single","pass","over","each","iterator",",","the","ones","which","run","out","will","sit","idle",".","This","is","used","for","evaluation",".","Default","True","."]
code: def init_metadata(self):
      # get data sets
      self.metadata = {}
      for name, data_handler in self.data_handlers.items():
          data_handler.init_metadata()
          self.metadata[name] = data_handler.metadata
  
imports: import itertools
  from collections import OrderedDict
  from typing import Dict, Optional, Tuple
  import numpy
  from pytext.common.constants import BatchContext
  from .data_handler import BatchIterator, DataHandler
label_desc: Use image node_id 5 for calling the DisjointMultitaskDataHandler obj's underlying member method code with example usage: obj.init_metadata() without return types