+
+def cmp_to_key(mycmp):
+ 'Convert a cmp= function into a key= function'
+ class K:
+ def __init__(self, obj, *args):
+ self.obj = obj
+ def __lt__(self, other):
+ return mycmp(self.obj, other.obj) < 0
+ def __gt__(self, other):
+ return mycmp(self.obj, other.obj) > 0
+ def __eq__(self, other):
+ return mycmp(self.obj, other.obj) == 0
+ def __le__(self, other):
+ return mycmp(self.obj, other.obj) <= 0
+ def __ge__(self, other):
+ return mycmp(self.obj, other.obj) >= 0
+ def __ne__(self, other):
+ return mycmp(self.obj, other.obj) != 0
+ return K
+
+def to_bytes(s):
+ if type(s) is bytes:
+ return s
+ elif type(s) is str or (sys.version_info[0] < 3 and type(s) is unicode):
+ return codecs.encode(s, 'utf-8')
+ else:
+ raise TypeError("Expected bytes or string, but got %s." % type(s))
+
+def to_str(s):
+ if type(s) is bytes:
+ return codecs.decode(s, 'utf-8')
+ elif type(s) is str or (sys.version_info[0] < 3 and type(s) is unicode):
+ return s
+ else:
+ raise TypeError("Expected bytes or string, but got %s." % type(s))
+
+def cmp(a, b):
+ return (a > b) - (a < b)