'Compare two key ranges.
Key ranges with a value of None for key_start or key_end, are always
considered to have include_start=False or include_end=False, respectively,
when comparing.  Since None indicates an unbounded side of the range,
the include specifier is meaningless.  The ordering generated is total
but somewhat arbitrary.
Args:
other: An object to compare to this one.
Returns:
-1: if this key range is less than other.
0:  if this key range is equal to other.
1: if this key range is greater than other.'

def __cmp__(self, other):

    if (not isinstance(other, KeyRange)):
        return 1
    self_list = [self.key_start, self.key_end, self.direction, self.include_start, self.include_end]
    if (not self.key_start):
        self_list[3] = False
    if (not self.key_end):
        self_list[4] = False
    other_list = [other.key_start, other.key_end, other.direction, other.include_start, other.include_end]
    if (not other.key_start):
        other_list[3] = False
    if (not other.key_end):
        other_list[4] = False
    return cmp(self_list, other_list)
