'Split this key range into a list of at most two ranges.
This method attempts to split the key range approximately in half.
Numeric ranges are split in the middle into two equal ranges and
string ranges are split lexicographically in the middle.  If the
key range is smaller than batch_size it is left unsplit.
Note that splitting is done without knowledge of the distribution
of actual entities in the key range, so there is no guarantee (nor
any particular reason to believe) that the entities of the range
are evenly split.
Args:
batch_size: The maximum size of a key range that should not be split.
Returns:
A list of one or two key ranges covering the same space as this range.'

def split_range(self, batch_size=0):

    key_start = self.key_start
    key_end = self.key_end
    include_start = self.include_start
    include_end = self.include_end
    key_pairs = []
    if (not key_start):
        key_pairs.append((key_start, include_start, key_end, include_end, KeyRange.ASC))
    elif (not key_end):
        key_pairs.append((key_start, include_start, key_end, include_end, KeyRange.DESC))
    else:
        key_split = KeyRange.split_keys(key_start, key_end, batch_size)
        first_include_end = True
        if (key_split == key_start):
            first_include_end = (first_include_end and include_start)
        key_pairs.append((key_start, include_start, key_split, first_include_end, KeyRange.DESC))
        second_include_end = include_end
        if (key_split == key_end):
            second_include_end = False
        key_pairs.append((key_split, False, key_end, second_include_end, KeyRange.ASC))
    ranges = [KeyRange(key_start=start, include_start=include_start, key_end=end, include_end=include_end, direction=direction, namespace=self.namespace, _app=self._app) for (start, include_start, end, include_end, direction) in key_pairs]
    return ranges
