<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:

def absent(name=None, start_addr=None, end_addr=None, data=None, **api_opts):
    '''
    Ensure the range is removed

    Supplying the end of the range is optional.

    State example:

    .. code-block:: yaml

        infoblox_range.absent:
            - name: 'vlan10'

        infoblox_range.absent:
            - name:
            - start_addr: 127.0.1.20
    '''
    ret = {'name': name, 'result': False, 'comment': '', 'changes': {}}

    if not data:
        data = {}
    if 'name' not in data:
        data.update({'name': name})
    if 'start_addr' not in data:
        data.update({'start_addr': start_addr})
    if 'end_addr' not in data:
        data.update({'end_addr': end_addr})

    obj = __salt__['infoblox.get_ipv4_range'](data['start_addr'], data['end_addr'], **api_opts)
    if obj is None:
        obj = __salt__['infoblox.get_ipv4_range'](start_addr=data['start_addr'], end_addr=None, **api_opts)
        if obj is None:
            obj = __salt__['infoblox.get_ipv4_range'](start_addr=None, end_addr=data['end_addr'], **api_opts)

    if not obj:
        ret['result'] = True
        ret['comment'] = 'already deleted'
        return ret

    if __opts__['test']:
        ret['result'] = None
        ret['comment'] = 'would attempt to delete range'
        return ret

    if __salt__['infoblox.delete_object'](objref=obj['_ref']):
        ret['result'] = True
        ret['changes'] = {'old': 'Found {0} - {1}'.format(start_addr, end_addr),
                        'new': 'Removed'}
    return ret