def parameters_equal(a, b):
    """Compares two parameter instances

    Checks full name, data, and ranges. Does not consider the comment.

    :return: True or False

    :raises: ValueError if both inputs are no parameter instances

    """
    if not b.v_is_parameter and not a.v_is_parameter:
        raise ValueError('Both inputs are not parameters')
    if not b.v_is_parameter or not a.v_is_parameter:
        return False
    if a.v_full_name != b.v_full_name:
        return False
    if a.f_is_empty() and b.f_is_empty():
        return True
    if a.f_is_empty() != b.f_is_empty():
        return False
    if not a._values_of_same_type(a.f_get(), b.f_get()):
        return False
    if not a._equal_values(a.f_get(), b.f_get()):
        return False
    if a.f_has_range() != b.f_has_range():
        return False
    if a.f_has_range():
        if a.f_get_range_length() != b.f_get_range_length():
            return False
        for myitem, bitem in zip(a.f_get_range(copy=False), b.f_get_range(
            copy=False)):
            if not a._values_of_same_type(myitem, bitem):
                return False
            if not a._equal_values(myitem, bitem):
                return False
    return True
