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

def row_absent(name, db, table, where_sql, where_args=None):
    '''
    Makes sure the specified row is absent in db.  If multiple rows
    match where_sql, then the state will fail.

    name
        Only used as the unique ID

    db
        The database file name

    table
        The table name to check

    where_sql
        The sql to select the row to check

    where_args
        The list parameters to substitute in where_sql
    '''
    changes = {'name': name,
               'changes': {},
               'result': None,
               'comment': ''}
    conn = None
    try:
        conn = sqlite3.connect(db, detect_types=sqlite3.PARSE_DECLTYPES)
        conn.row_factory = _dict_factory
        rows = None
        if where_args is None:
            rows = _query(conn,
                          "SELECT * FROM `" + table + "` WHERE " + where_sql)
        else:
            rows = _query(conn,
                          "SELECT * FROM `" + table + "` WHERE " + where_sql,
                          where_args)

        if len(rows) > 1:
            changes['result'] = False
            changes['comment'] = "More than one row matched the specified query"
        elif len(rows) == 1:
            if __opts__['test']:
                changes['result'] = True
                changes['comment'] = "Row will be removed in " + table
                changes['changes']['old'] = rows[0]

            else:
                if where_args is None:
                    cursor = conn.execute("DELETE FROM `" +
                                          table + "` WHERE " + where_sql)
                else:
                    cursor = conn.execute("DELETE FROM `" +
                                          table + "` WHERE " + where_sql,
                                          where_args)
                conn.commit()
                if cursor.rowcount == 1:
                    changes['result'] = True
                    changes['comment'] = "Row removed"
                    changes['changes']['old'] = rows[0]
                else:
                    changes['result'] = False
                    changes['comment'] = "Unable to remove row"
        else:
            changes['result'] = True
            changes['comment'] = 'Row is absent'

    except Exception as e:
        changes['result'] = False
        changes['comment'] = six.text_type(e)

    finally:
        if conn:
            conn.close()

    return changes