docs: def check_tuple(data: typing.Tuple,
                  hint: typing.Union[type, typing.TypingMeta]) -> bool:
      """Check argument type & return type of :class:`typing.Tuple`. since it
      raises check :class:`typing.Tuple` using `isinstance`, so compare in
      diffrent way
  
      :param data: tuple given as a argument
      :param hint: assumed type of given ``data``
  
      """
      if not isinstance(data, tuple):
          raise TypeError(
              'expected {}, not {}'.format(
                  typing._type_repr(hint),
                  'None' if data is None else '{}: {!r}'.format(
                      typing._type_repr(type(data)),
                      data
                  )
              )
          )
      tuple_param = hint.__tuple_params__
      if len(data) != len(tuple_param):
          raise TypeError('expected tuple size is {}, not {}: '
                          '{!r}'.format(len(tuple_param), len(data), data))
      zipped = itertools.zip_longest(data, tuple_param)
      for i, (v, t) in enumerate(zipped):
          _, correct = check_type(v, t)
          if not correct:
              raise TypeError(
                  '{0}th item `{1}` in tuple must be {2!r}, not: {3!r}'.format(
                      i, v, t, v
                  )
              )
      return hint, True