'Converts a key with potentially mixed types of keys (integer and slice)
into a tuple of ranges and raises an error if any index is out of self\'s
range.
See Also
key2ij'

def key2bounds(self, keys):

    (islice, jslice) = [isinstance(k, slice) for k in keys]
    if islice:
        if (not self.rows):
            rlo = rhi = 0
        else:
            (rlo, rhi) = keys[0].indices(self.rows)[:2]
    else:
        rlo = a2idx(keys[0], self.rows)
        rhi = (rlo + 1)
    if jslice:
        if (not self.cols):
            clo = chi = 0
        else:
            (clo, chi) = keys[1].indices(self.cols)[:2]
    else:
        clo = a2idx(keys[1], self.cols)
        chi = (clo + 1)
    return (rlo, rhi, clo, chi)
