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``

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