[Python-checkins] r87853 - in python/branches/py3k: Lib/functools.py Lib/test/test_functools.py Misc/ACKS Misc/NEWS

raymond.hettinger python-checkins at python.org
Sat Jan 8 08:01:56 CET 2011


Author: raymond.hettinger
Date: Sat Jan 8 08:01:56 2011
New Revision: 87853
Log:
Issue #10042: Fixed the total_ordering decorator to handle cross-type
comparisons that could lead to infinite recursion.
Modified:
 python/branches/py3k/Lib/functools.py
 python/branches/py3k/Lib/test/test_functools.py
 python/branches/py3k/Misc/ACKS
 python/branches/py3k/Misc/NEWS
Modified: python/branches/py3k/Lib/functools.py
==============================================================================
--- python/branches/py3k/Lib/functools.py	(original)
+++ python/branches/py3k/Lib/functools.py	Sat Jan 8 08:01:56 2011
@@ -68,17 +68,17 @@
 def total_ordering(cls):
 """Class decorator that fills in missing ordering methods"""
 convert = {
- '__lt__': [('__gt__', lambda self, other: other < self),
- ('__le__', lambda self, other: not other < self),
+ '__lt__': [('__gt__', lambda self, other: not (self < other or self == other)),
+ ('__le__', lambda self, other: self < other or self == other),
 ('__ge__', lambda self, other: not self < other)],
- '__le__': [('__ge__', lambda self, other: other <= self),
- ('__lt__', lambda self, other: not other <= self),
+ '__le__': [('__ge__', lambda self, other: not self <= other or self == other),
+ ('__lt__', lambda self, other: self <= other and not self == other),
 ('__gt__', lambda self, other: not self <= other)],
- '__gt__': [('__lt__', lambda self, other: other > self),
- ('__ge__', lambda self, other: not other > self),
+ '__gt__': [('__lt__', lambda self, other: not (self > other or self == other)),
+ ('__ge__', lambda self, other: self > other or self == other),
 ('__le__', lambda self, other: not self > other)],
- '__ge__': [('__le__', lambda self, other: other >= self),
- ('__gt__', lambda self, other: not other >= self),
+ '__ge__': [('__le__', lambda self, other: (not self >= other) or self == other),
+ ('__gt__', lambda self, other: self >= other and not self == other),
 ('__lt__', lambda self, other: not self >= other)]
 }
 # Find user-defined comparisons (not those inherited from object).
Modified: python/branches/py3k/Lib/test/test_functools.py
==============================================================================
--- python/branches/py3k/Lib/test/test_functools.py	(original)
+++ python/branches/py3k/Lib/test/test_functools.py	Sat Jan 8 08:01:56 2011
@@ -457,6 +457,8 @@
 self.value = value
 def __lt__(self, other):
 return self.value < other.value
+ def __eq__(self, other):
+ return self.value == other.value
 self.assertTrue(A(1) < A(2))
 self.assertTrue(A(2) > A(1))
 self.assertTrue(A(1) <= A(2))
@@ -471,6 +473,8 @@
 self.value = value
 def __le__(self, other):
 return self.value <= other.value
+ def __eq__(self, other):
+ return self.value == other.value
 self.assertTrue(A(1) < A(2))
 self.assertTrue(A(2) > A(1))
 self.assertTrue(A(1) <= A(2))
@@ -485,6 +489,8 @@
 self.value = value
 def __gt__(self, other):
 return self.value > other.value
+ def __eq__(self, other):
+ return self.value == other.value
 self.assertTrue(A(1) < A(2))
 self.assertTrue(A(2) > A(1))
 self.assertTrue(A(1) <= A(2))
@@ -499,6 +505,8 @@
 self.value = value
 def __ge__(self, other):
 return self.value >= other.value
+ def __eq__(self, other):
+ return self.value == other.value
 self.assertTrue(A(1) < A(2))
 self.assertTrue(A(2) > A(1))
 self.assertTrue(A(1) <= A(2))
@@ -524,6 +532,22 @@
 class A:
 pass
 
+ def test_bug_10042(self):
+ @functools.total_ordering
+ class TestTO:
+ def __init__(self, value):
+ self.value = value
+ def __eq__(self, other):
+ if isinstance(other, TestTO):
+ return self.value == other.value
+ return False
+ def __lt__(self, other):
+ if isinstance(other, TestTO):
+ return self.value < other.value
+ raise TypeError
+ with self.assertRaises(TypeError):
+ TestTO(8) <= ()
+
 class TestLRU(unittest.TestCase):
 
 def test_lru(self):
Modified: python/branches/py3k/Misc/ACKS
==============================================================================
--- python/branches/py3k/Misc/ACKS	(original)
+++ python/branches/py3k/Misc/ACKS	Sat Jan 8 08:01:56 2011
@@ -700,6 +700,7 @@
 Steven Reiz
 Roeland Rengelink
 Tim Rice
+Francesco Ricciardi
 Jan Pieter Riegel
 Armin Rigo
 Nicholas Riley
Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Sat Jan 8 08:01:56 2011
@@ -40,6 +40,9 @@
 Library
 -------
 
+- Issue #10042: Fixed the total_ordering decorator to handle cross-type
+ comparisons that could lead to infinite recursion.
+
 - Issue #10686: the email package now :rfc:`2047`\ -encodes headers with
 non-ASCII bytes (parsed by a Bytes Parser) when doing conversion to
 7bit-clean presentation, instead of replacing them with ?s.


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /