summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXtreak <tir.karthi@gmail.com>2019-07-13 13:22:21 (GMT)
committerPaul Ganssle <pganssle@users.noreply.github.com>2019-07-13 13:22:21 (GMT)
commite6b46aafad3427463d6264a68824df4797e682f1 (patch)
treecc2003bc4716eee6e44f4a77cc3f2d5dd0f82d6f
parent05f2d84cae4ba1ff15b7a1d0347305393f4bdcc5 (diff)
downloadcpython-e6b46aafad3427463d6264a68824df4797e682f1.zip
cpython-e6b46aafad3427463d6264a68824df4797e682f1.tar.gz
cpython-e6b46aafad3427463d6264a68824df4797e682f1.tar.bz2
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
-rw-r--r--Lib/datetime.py4
-rw-r--r--Lib/test/datetimetester.py20
-rw-r--r--Misc/NEWS.d/next/Library/2019-07-13-10-59-43.bpo-37579.B1Tq9i.rst4
3 files changed, 26 insertions, 2 deletions
diff --git a/Lib/datetime.py b/Lib/datetime.py
index 0e64815..e35ee05 100644
--- a/Lib/datetime.py
+++ b/Lib/datetime.py
@@ -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):
diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py
index 53de065..37ddd4b 100644
--- a/Lib/test/datetimetester.py
+++ b/Lib/test/datetimetester.py
@@ -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)
diff --git a/Misc/NEWS.d/next/Library/2019-07-13-10-59-43.bpo-37579.B1Tq9i.rst b/Misc/NEWS.d/next/Library/2019-07-13-10-59-43.bpo-37579.B1Tq9i.rst
new file mode 100644
index 0000000..ad52cf2
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-07-13-10-59-43.bpo-37579.B1Tq9i.rst
@@ -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.