mirror of
https://github.com/python/cpython.git
synced 2025-10-17 12:18:23 +00:00
run total_ordering() tests, and fix the function (default comparisons shouldn't be considered)
This commit is contained in:
parent
7311729790
commit
9c2930e4be
2 changed files with 6 additions and 2 deletions
|
@ -65,6 +65,7 @@ def wraps(wrapped,
|
||||||
return partial(update_wrapper, wrapped=wrapped,
|
return partial(update_wrapper, wrapped=wrapped,
|
||||||
assigned=assigned, updated=updated)
|
assigned=assigned, updated=updated)
|
||||||
|
|
||||||
|
_object_defaults = {object.__lt__, object.__le__, object.__gt__, object.__ge__}
|
||||||
def total_ordering(cls):
|
def total_ordering(cls):
|
||||||
"""Class decorator that fills in missing ordering methods"""
|
"""Class decorator that fills in missing ordering methods"""
|
||||||
convert = {
|
convert = {
|
||||||
|
@ -81,7 +82,9 @@ def total_ordering(cls):
|
||||||
('__gt__', lambda self, other: not other >= self),
|
('__gt__', lambda self, other: not other >= self),
|
||||||
('__lt__', lambda self, other: not self >= other)]
|
('__lt__', lambda self, other: not self >= other)]
|
||||||
}
|
}
|
||||||
roots = set(dir(cls)) & set(convert)
|
roots = (set(dir(cls)) & set(convert))
|
||||||
|
# Remove default comparison operations defined on object.
|
||||||
|
roots -= {meth for meth in roots if getattr(cls, meth) in _object_defaults}
|
||||||
if not roots:
|
if not roots:
|
||||||
raise ValueError('must define at least one ordering operation: < > <= >=')
|
raise ValueError('must define at least one ordering operation: < > <= >=')
|
||||||
root = max(roots) # prefer __lt__ to __le__ to __gt__ to __ge__
|
root = max(roots) # prefer __lt__ to __le__ to __gt__ to __ge__
|
||||||
|
|
|
@ -481,7 +481,7 @@ class TestTotalOrdering(unittest.TestCase):
|
||||||
# new methods should not overwrite existing
|
# new methods should not overwrite existing
|
||||||
@functools.total_ordering
|
@functools.total_ordering
|
||||||
class A(int):
|
class A(int):
|
||||||
raise Exception()
|
pass
|
||||||
self.assert_(A(1) < A(2))
|
self.assert_(A(1) < A(2))
|
||||||
self.assert_(A(2) > A(1))
|
self.assert_(A(2) > A(1))
|
||||||
self.assert_(A(1) <= A(2))
|
self.assert_(A(1) <= A(2))
|
||||||
|
@ -564,6 +564,7 @@ def test_main(verbose=None):
|
||||||
TestPartialSubclass,
|
TestPartialSubclass,
|
||||||
TestPythonPartial,
|
TestPythonPartial,
|
||||||
TestUpdateWrapper,
|
TestUpdateWrapper,
|
||||||
|
TestTotalOrdering,
|
||||||
TestWraps,
|
TestWraps,
|
||||||
TestReduce,
|
TestReduce,
|
||||||
TestLRU,
|
TestLRU,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue