summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBeomsoo Kim <beoms424@gmail.com>2024-11-19 19:40:52 (GMT)
committerGitHub <noreply@github.com>2024-11-19 19:40:52 (GMT)
commit8da9920a80c60fb3fc326c623e0f217c84011c1d (patch)
treed60e93bcdc7fbdf47c46b2f508094d808534776c
parent88dc84bcf9fef32afa9af0ab41fa467c9733483f (diff)
downloadcpython-8da9920a80c60fb3fc326c623e0f217c84011c1d.zip
cpython-8da9920a80c60fb3fc326c623e0f217c84011c1d.tar.gz
cpython-8da9920a80c60fb3fc326c623e0f217c84011c1d.tar.bz2
gh-126947: Typechecking for _pydatetime.timedelta.__new__ arguments (#126949)
Co-authored-by: sobolevn <mail@sobolevn.me> Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
-rw-r--r--Lib/_pydatetime.py14
-rw-r--r--Lib/test/datetimetester.py10
-rw-r--r--Misc/NEWS.d/next/Library/2024-11-18-19-03-46.gh-issue-126947.NiDYUe.rst2
3 files changed, 25 insertions, 1 deletions
diff --git a/Lib/_pydatetime.py b/Lib/_pydatetime.py
index 78e03e3..ed01670 100644
--- a/Lib/_pydatetime.py
+++ b/Lib/_pydatetime.py
@@ -651,7 +651,19 @@ class timedelta:
# guide the C implementation; it's way more convoluted than speed-
# ignoring auto-overflow-to-long idiomatic Python could be.
- # XXX Check that all inputs are ints or floats.
+ for name, value in (
+ ("days", days),
+ ("seconds", seconds),
+ ("microseconds", microseconds),
+ ("milliseconds", milliseconds),
+ ("minutes", minutes),
+ ("hours", hours),
+ ("weeks", weeks)
+ ):
+ if not isinstance(value, (int, float)):
+ raise TypeError(
+ f"unsupported type for timedelta {name} component: {type(value).__name__}"
+ )
# Final values, all integer.
# s and us fit in 32-bit signed ints; d isn't bounded.
diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py
index dbe25ef..25a3015 100644
--- a/Lib/test/datetimetester.py
+++ b/Lib/test/datetimetester.py
@@ -510,6 +510,7 @@ class TestTimeDelta(HarmlessMixedComparison, unittest.TestCase):
def test_constructor(self):
eq = self.assertEqual
+ ra = self.assertRaises
td = timedelta
# Check keyword args to constructor
@@ -533,6 +534,15 @@ class TestTimeDelta(HarmlessMixedComparison, unittest.TestCase):
eq(td(seconds=0.001), td(milliseconds=1))
eq(td(milliseconds=0.001), td(microseconds=1))
+ # Check type of args to constructor
+ ra(TypeError, lambda: td(weeks='1'))
+ ra(TypeError, lambda: td(days='1'))
+ ra(TypeError, lambda: td(hours='1'))
+ ra(TypeError, lambda: td(minutes='1'))
+ ra(TypeError, lambda: td(seconds='1'))
+ ra(TypeError, lambda: td(milliseconds='1'))
+ ra(TypeError, lambda: td(microseconds='1'))
+
def test_computations(self):
eq = self.assertEqual
td = timedelta
diff --git a/Misc/NEWS.d/next/Library/2024-11-18-19-03-46.gh-issue-126947.NiDYUe.rst b/Misc/NEWS.d/next/Library/2024-11-18-19-03-46.gh-issue-126947.NiDYUe.rst
new file mode 100644
index 0000000..29ba4f2
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-11-18-19-03-46.gh-issue-126947.NiDYUe.rst
@@ -0,0 +1,2 @@
+Raise :exc:`TypeError` in :meth:`!_pydatetime.timedelta.__new__` if the passed arguments are not :class:`int` or :class:`float`, so that the Python
+implementation is in line with the C implementation.