'Return an id_or_name that is between id_or_name1 an id_or_name2.
Attempts to split the range [id_or_name1, id_or_name2] in half,
unless maintain_batches is true and the size of the range
[id_or_name1, id_or_name2] is less than or equal to batch_size.
Args:
id_or_name1: A number or string or the id_or_name component of a key
id_or_name2: A number or string or the id_or_name component of a key
batch_size: The range size that will not be split if maintain_batches
is true.
maintain_batches: A boolean for whether to keep small ranges intact.
Returns:
An id_or_name such that id_or_name1 <= id_or_name <= id_or_name2.'

@staticmethod
def _split_id_or_name(id_or_name1, id_or_name2, batch_size, maintain_batches):

    if (isinstance(id_or_name1, (int, long)) and isinstance(id_or_name2, (int, long))):
        if ((not maintain_batches) or ((id_or_name2 - id_or_name1) > batch_size)):
            return ((id_or_name1 + id_or_name2) / 2)
        else:
            return id_or_name1
    elif (isinstance(id_or_name1, basestring) and isinstance(id_or_name2, basestring)):
        return KeyRange.bisect_string_range(id_or_name1, id_or_name2)
    else:
        assert (isinstance(id_or_name1, (int, long)) and isinstance(id_or_name2, basestring))
        return unichr(0)
