class_docstr: Wrap multiple batchify functions together. The input functions will be applied
  to the corresponding input fields.
  
  Each data sample should be a list or tuple containing multiple attributes. The `i`th batchify
  function stored in `Tuple` will be applied on the `i`th attribute. For example, each
  data sample is (nd_data, label). You can wrap two batchify functions using
  `Tuple(DataBatchify, LabelBatchify)` to batchify nd_data and label correspondingly.
  
  Parameters
  ----------
  fn : list or tuple or callable
      The batchify functions to wrap.
  *args : tuple of callable
      The additional batchify functions to wrap.
  
  Examples
  --------
  >>> import gluonnlp.data.batchify as bf
  >>> a = ([1, 2, 3, 4], 0)
  >>> b = ([5, 7], 1)
  >>> c = ([1, 2, 3, 4, 5, 6, 7], 0)
  >>> f1, f2 = bf.Tuple(bf.Pad(), bf.Stack())([a, b])
  >>> f1
  <BLANKLINE>
  [[1. 2. 3. 4.]
   [5. 7. 0. 0.]]
  <NDArray 2x4 @cpu_shared(0)>
  >>> f2
  <BLANKLINE>
  [0 1]
  <NDArray 2 @cpu_shared(0)>
code: def __init__(self, fn, *args):
      if isinstance(fn, (list, tuple)):
          assert len(args) == 0, (
              "Input pattern not understood. The input of Tuple can be "
              "Tuple(A, B, C) or Tuple([A, B, C]) or Tuple((A, B, C)). "
              "Received fn=%s, args=%s" % (str(fn), str(args))
          )
          self._fn = fn
      else:
          self._fn = (fn,) + args
      for i, ele_fn in enumerate(self._fn):
          assert hasattr(ele_fn, "__call__"), (
              "Batchify functions must be callable! "
              "type(fn[%d]) = %s" % (i, str(type(ele_fn)))
          )
  
imports: import warnings
  import math
  from typing import Dict, Callable, NamedTuple, List, Tuple, AnyStr, Union
  import numpy
  import mxnet
  from mxnet.util import is_np_array
label_desc: Use image node_id 1 to create a new Tuple object  with example: obj = Tuple(fn)