def is_typed_tuple(tpl: object, obj_type: type, allow_none: bool = False, allow_empty: bool = True) -> bool:
    """
    Check if a variable is a tuple that contains objects of specific type.

    :param tpl: The variable/list to check
    :param obj_type: The type of objects that the tuple should contain (for the check to return true)
    :param allow_none: When set to true, return true if tpl is None
    :param allow_empty: When set to true, return true if tpl is empty
    :return: Whether tpl is a tuple that contains only objects of type obj_type
    """
    assert isinstance(tpl, object)
    assert isinstance(obj_type, type)
    assert isinstance(allow_none, bool)
    assert isinstance(allow_empty, bool)

    if allow_none and tpl is None:
        return True

    if not isinstance(tpl, tuple):
        return False

    if not allow_empty and len(tpl) == 0:
        return False

    for obj in tpl:
        if not isinstance(obj, obj_type):
            return False

    return True