From d4cb56d4e88c7e001bbaba2c80953db47632f199 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Wed, 30 Jan 2008 02:55:10 +0000 Subject: [PATCH] Convert some custom sort comparison functions to equivalent key functions. --- Lib/bsddb/dbtables.py | 11 ++++++++++- Lib/bsddb/test/test_compare.py | 12 +++++++++++- Lib/ctypes/util.py | 2 +- Lib/idlelib/MultiCall.py | 2 +- Lib/idlelib/TreeWidget.py | 2 +- Lib/pyclbr.py | 3 +-- Lib/pydoc.py | 5 +---- Lib/tarfile.py | 2 +- Lib/unittest.py | 11 ++++++++++- Tools/pynche/ColorDB.py | 5 +---- Tools/scripts/finddiv.py | 2 +- Tools/unicode/makeunicodedata.py | 13 +++++++++++-- 12 files changed, 50 insertions(+), 20 deletions(-) diff --git a/Lib/bsddb/dbtables.py b/Lib/bsddb/dbtables.py index 56b4e3a01d1..563390ba6fc 100644 --- a/Lib/bsddb/dbtables.py +++ b/Lib/bsddb/dbtables.py @@ -88,6 +88,15 @@ class LikeCond(Cond): def __call__(self, s): return self.re.match(s.decode(self.encoding)) +def CmpToKey(mycmp): + 'Convert a cmp= function into a key= function' + class K(object): + def __init__(self, obj, *args): + self.obj = obj + def __lt__(self, other): + return mycmp(self.obj, other.obj) == -1 + return K + # # keys used to store database metadata # @@ -587,7 +596,7 @@ class bsdTableDB : return 0 conditionlist = list(conditions.items()) - conditionlist.sort(cmp_conditions) + conditionlist.sort(key=CmpToKey(cmp_conditions)) # Apply conditions to column data to find what we want cur = self.db.cursor() diff --git a/Lib/bsddb/test/test_compare.py b/Lib/bsddb/test/test_compare.py index a36faae3600..49aa7caba03 100644 --- a/Lib/bsddb/test/test_compare.py +++ b/Lib/bsddb/test/test_compare.py @@ -32,10 +32,20 @@ _expected_lexical_test_data = [s.encode('ascii') for s in _expected_lowercase_test_data = [s.encode('ascii') for s in ('', 'a', 'aaa', 'b', 'c', 'CC', 'cccce', 'ccccf', 'CCCP')] + +def CmpToKey(mycmp): + 'Convert a cmp= function into a key= function' + class K(object): + def __init__(self, obj, *args): + self.obj = obj + def __lt__(self, other): + return mycmp(self.obj, other.obj) == -1 + return K + class ComparatorTests (unittest.TestCase): def comparator_test_helper (self, comparator, expected_data): data = expected_data[:] - data.sort (comparator) + data.sort (key=CmpToKey(comparator)) self.failUnless (data == expected_data, "comparator `%s' is not right: %s vs. %s" % (comparator, expected_data, data)) diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py index 733a99c4d7a..3e6ae0104bf 100644 --- a/Lib/ctypes/util.py +++ b/Lib/ctypes/util.py @@ -123,7 +123,7 @@ elif os.name == "posix": res = re.findall(expr, data) if not res: return _get_soname(_findLib_gcc(name)) - res.sort(cmp= lambda x,y: cmp(_num_version(x), _num_version(y))) + res.sort(key=_num_version) return res[-1] else: diff --git a/Lib/idlelib/MultiCall.py b/Lib/idlelib/MultiCall.py index 9e9e40c19fb..c59ccfe57ac 100644 --- a/Lib/idlelib/MultiCall.py +++ b/Lib/idlelib/MultiCall.py @@ -125,7 +125,7 @@ def expand_substates(states): statelist = [] for state in states: substates = list(set(state & x for x in states)) - substates.sort(lambda a,b: nbits(b) - nbits(a)) + substates.sort(key=nbits, reverse=True) statelist.append(substates) return statelist diff --git a/Lib/idlelib/TreeWidget.py b/Lib/idlelib/TreeWidget.py index c5084101baf..0009de87638 100644 --- a/Lib/idlelib/TreeWidget.py +++ b/Lib/idlelib/TreeWidget.py @@ -398,7 +398,7 @@ class FileTreeItem(TreeItem): names = os.listdir(self.path) except os.error: return [] - names.sort(lambda a, b: cmp(os.path.normcase(a), os.path.normcase(b))) + names.sort(key = os.path.normcase) sublist = [] for name in names: item = FileTreeItem(os.path.join(self.path, name)) diff --git a/Lib/pyclbr.py b/Lib/pyclbr.py index c402a0994a8..cf4951c6d71 100644 --- a/Lib/pyclbr.py +++ b/Lib/pyclbr.py @@ -324,8 +324,7 @@ def _main(): path = [] dict = readmodule_ex(mod, path) objs = dict.values() - objs.sort(lambda a, b: cmp(getattr(a, 'lineno', 0), - getattr(b, 'lineno', 0))) + objs.sort(key=lambda a: getattr(a, 'lineno', 0)) for obj in objs: if isinstance(obj, Class): print("class", obj.name, obj.super, obj.lineno) diff --git a/Lib/pydoc.py b/Lib/pydoc.py index 0fdbb900a82..de8d193f50f 100755 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -797,10 +797,7 @@ class HTMLDoc(Doc): tag += ':
\n' # Sort attrs by name. - try: - attrs.sort(key=lambda t: t[0]) - except TypeError: - attrs.sort(lambda t1, t2: cmp(t1[0], t2[0])) # 2.3 compat + attrs.sort(key=lambda t: t[0]) # Pump out the attrs, segregated by kind. attrs = spill('Methods %s' % tag, attrs, diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 9ea92d0ebde..b184ed83b79 100644 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -2016,7 +2016,7 @@ class TarFile(object): self.extract(tarinfo, path) # Reverse sort directories. - directories.sort(lambda a, b: cmp(a.name, b.name)) + directories.sort(key=lambda a: a.name) directories.reverse() # Set correct owner, mtime and filemode on directories. diff --git a/Lib/unittest.py b/Lib/unittest.py index adbbe8a0945..742871bd233 100644 --- a/Lib/unittest.py +++ b/Lib/unittest.py @@ -504,6 +504,15 @@ class FunctionTestCase(TestCase): # Locating and loading tests ############################################################################## +def CmpToKey(mycmp): + 'Convert a cmp= function into a key= function' + class K(object): + def __init__(self, obj, *args): + self.obj = obj + def __lt__(self, other): + return mycmp(self.obj, other.obj) == -1 + return K + class TestLoader: """This class is responsible for loading tests according to various criteria and returning them wrapped in a TestSuite @@ -598,7 +607,7 @@ class TestLoader: and hasattr(getattr(testCaseClass, attrname), '__call__') testFnNames = list(filter(isTestMethod, dir(testCaseClass))) if self.sortTestMethodsUsing: - testFnNames.sort(self.sortTestMethodsUsing) + testFnNames.sort(key=CmpToKey(self.sortTestMethodsUsing)) return testFnNames diff --git a/Tools/pynche/ColorDB.py b/Tools/pynche/ColorDB.py index 3b978fb74a7..6d52b40e2ee 100644 --- a/Tools/pynche/ColorDB.py +++ b/Tools/pynche/ColorDB.py @@ -122,10 +122,7 @@ class ColorDB: self.__allnames = [] for name, aliases in self.__byrgb.values(): self.__allnames.append(name) - # sort irregardless of case - def nocase_cmp(n1, n2): - return cmp(n1.lower(), n2.lower()) - self.__allnames.sort(nocase_cmp) + self.__allnames.sort(key=unicode.lower) return self.__allnames def aliases_of(self, red, green, blue): diff --git a/Tools/scripts/finddiv.py b/Tools/scripts/finddiv.py index 9d5862bb915..558791fcc0a 100755 --- a/Tools/scripts/finddiv.py +++ b/Tools/scripts/finddiv.py @@ -78,7 +78,7 @@ def processdir(dir, listnames): fn = os.path.join(dir, name) if os.path.normcase(fn).endswith(".py") or os.path.isdir(fn): files.append(fn) - files.sort(lambda a, b: cmp(os.path.normcase(a), os.path.normcase(b))) + files.sort(key=os.path.normcase) exit = None for fn in files: x = process(fn, listnames) diff --git a/Tools/unicode/makeunicodedata.py b/Tools/unicode/makeunicodedata.py index 5b5b5dc7c1e..f080ca2da33 100644 --- a/Tools/unicode/makeunicodedata.py +++ b/Tools/unicode/makeunicodedata.py @@ -441,6 +441,15 @@ def makeunicodetype(unicode, trace): # -------------------------------------------------------------------- # unicode name database +def CmpToKey(mycmp): + 'Convert a cmp= function into a key= function' + class K(object): + def __init__(self, obj, *args): + self.obj = obj + def __lt__(self, other): + return mycmp(self.obj, other.obj) == -1 + return K + def makeunicodename(unicode, trace): FILE = "Modules/unicodename_db.h" @@ -490,7 +499,7 @@ def makeunicodename(unicode, trace): if r: return r return cmp(aword, bword) - wordlist.sort(cmpwords) + wordlist.sort(key=CmpToKey(cmpwords)) # figure out how many phrasebook escapes we need escapes = 0 @@ -514,7 +523,7 @@ def makeunicodename(unicode, trace): # length (to maximize overlap) wordlist, wordtail = wordlist[:short], wordlist[short:] - wordtail.sort(lambda a, b: len(b[0])-len(a[0])) + wordtail.sort(key=lambda a: a[0], reverse=True) wordlist.extend(wordtail) # generate lexicon from words