[Python-Dev] [Python-checkins] cpython: Issue #11707: Fast C version of functools.cmp_to_key()
Victor Stinner
victor.stinner at haypocalc.com
Tue Apr 5 12:12:22 CEST 2011
I don't think that the following change conforms to the PEP 399: there
is only a test for the C version.
Victor
Le mardi 05 avril 2011 à 11:34 +0200, raymond.hettinger a écrit :
> http://hg.python.org/cpython/rev/a03fb2fc3ed8
> changeset: 69150:a03fb2fc3ed8
> user: Raymond Hettinger <python at rcn.com>
> date: Tue Apr 05 02:33:54 2011 -0700
> summary:
> Issue #11707: Fast C version of functools.cmp_to_key()
>
> diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py
> --- a/Lib/test/test_functools.py
> +++ b/Lib/test/test_functools.py
> @@ -435,18 +435,81 @@
> self.assertEqual(self.func(add, d), "".join(d.keys()))
>
> class TestCmpToKey(unittest.TestCase):
> +
> def test_cmp_to_key(self):
> + def cmp1(x, y):
> + return (x > y) - (x < y)
> + key = functools.cmp_to_key(cmp1)
> + self.assertEqual(key(3), key(3))
> + self.assertGreater(key(3), key(1))
> + def cmp2(x, y):
> + return int(x) - int(y)
> + key = functools.cmp_to_key(cmp2)
> + self.assertEqual(key(4.0), key('4'))
> + self.assertLess(key(2), key('35'))
> +
> + def test_cmp_to_key_arguments(self):
> + def cmp1(x, y):
> + return (x > y) - (x < y)
> + key = functools.cmp_to_key(mycmp=cmp1)
> + self.assertEqual(key(obj=3), key(obj=3))
> + self.assertGreater(key(obj=3), key(obj=1))
> + with self.assertRaises((TypeError, AttributeError)):
> + key(3) > 1 # rhs is not a K object
> + with self.assertRaises((TypeError, AttributeError)):
> + 1 < key(3) # lhs is not a K object
> + with self.assertRaises(TypeError):
> + key = functools.cmp_to_key() # too few args
> + with self.assertRaises(TypeError):
> + key = functools.cmp_to_key(cmp1, None) # too many args
> + key = functools.cmp_to_key(cmp1)
> + with self.assertRaises(TypeError):
> + key() # too few args
> + with self.assertRaises(TypeError):
> + key(None, None) # too many args
> +
> + def test_bad_cmp(self):
> + def cmp1(x, y):
> + raise ZeroDivisionError
> + key = functools.cmp_to_key(cmp1)
> + with self.assertRaises(ZeroDivisionError):
> + key(3) > key(1)
> +
> + class BadCmp:
> + def __lt__(self, other):
> + raise ZeroDivisionError
> + def cmp1(x, y):
> + return BadCmp()
> + with self.assertRaises(ZeroDivisionError):
> + key(3) > key(1)
> +
> + def test_obj_field(self):
> + def cmp1(x, y):
> + return (x > y) - (x < y)
> + key = functools.cmp_to_key(mycmp=cmp1)
> + self.assertEqual(key(50).obj, 50)
> +
> + def test_sort_int(self):
> def mycmp(x, y):
> return y - x
> self.assertEqual(sorted(range(5), key=functools.cmp_to_key(mycmp)),
> [4, 3, 2, 1, 0])
>
> + def test_sort_int_str(self):
> + def mycmp(x, y):
> + x, y = int(x), int(y)
> + return (x > y) - (x < y)
> + values = [5, '3', 7, 2, '0', '1', 4, '10', 1]
> + values = sorted(values, key=functools.cmp_to_key(mycmp))
> + self.assertEqual([int(value) for value in values],
> + [0, 1, 1, 2, 3, 4, 5, 7, 10])
> +
> def test_hash(self):
> def mycmp(x, y):
> return y - x
> key = functools.cmp_to_key(mycmp)
> k = key(10)
> - self.assertRaises(TypeError, hash(k))
> + self.assertRaises(TypeError, hash, k)
More information about the Python-Dev
mailing list