bpo-37579: Improve equality behavior for pure Python datetime and time (GH-14726)
Returns NotImplemented for timedelta and time in __eq__ for different types in Python implementation, which matches the C implementation. This also adds tests to enforce that these objects will fall back to the right hand side's __eq__ and/or __ne__ implementation. bpo-37579
This commit is contained in:
parent
05f2d84cae
commit
e6b46aafad
|
@ -733,7 +733,7 @@ class timedelta:
|
|||
if isinstance(other, timedelta):
|
||||
return self._cmp(other) == 0
|
||||
else:
|
||||
return False
|
||||
return NotImplemented
|
||||
|
||||
def __le__(self, other):
|
||||
if isinstance(other, timedelta):
|
||||
|
@ -1310,7 +1310,7 @@ class time:
|
|||
if isinstance(other, time):
|
||||
return self._cmp(other, allow_mixed=True) == 0
|
||||
else:
|
||||
return False
|
||||
return NotImplemented
|
||||
|
||||
def __le__(self, other):
|
||||
if isinstance(other, time):
|
||||
|
|
|
@ -53,6 +53,19 @@ OTHERSTUFF = (10, 34.5, "abc", {}, [], ())
|
|||
INF = float("inf")
|
||||
NAN = float("nan")
|
||||
|
||||
|
||||
class ComparesEqualClass(object):
|
||||
"""
|
||||
A class that is always equal to whatever you compare it to.
|
||||
"""
|
||||
|
||||
def __eq__(self, other):
|
||||
return True
|
||||
|
||||
def __ne__(self, other):
|
||||
return False
|
||||
|
||||
|
||||
#############################################################################
|
||||
# module tests
|
||||
|
||||
|
@ -399,6 +412,13 @@ class HarmlessMixedComparison:
|
|||
self.assertIn(me, [1, 20, [], me])
|
||||
self.assertIn([], [me, 1, 20, []])
|
||||
|
||||
# Comparison to objects of unsupported types should return
|
||||
# NotImplemented which falls back to the right hand side's __eq__
|
||||
# method. In this case, ComparesEqualClass.__eq__ always returns True.
|
||||
# ComparesEqualClass.__ne__ always returns False.
|
||||
self.assertTrue(me == ComparesEqualClass())
|
||||
self.assertFalse(me != ComparesEqualClass())
|
||||
|
||||
def test_harmful_mixed_comparison(self):
|
||||
me = self.theclass(1, 1, 1)
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
Return :exc:`NotImplemented` in Python implementation of ``__eq__`` for
|
||||
:class:`~datetime.timedelta` and :class:`~datetime.time` when the other
|
||||
object being compared is not of the same type to match C implementation.
|
||||
Patch by Karthikeyan Singaravelan.
|
Loading…
Reference in New Issue