diff options
author | Beomsoo Kim <beoms424@gmail.com> | 2024-11-19 19:40:52 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-19 19:40:52 (GMT) |
commit | 8da9920a80c60fb3fc326c623e0f217c84011c1d (patch) | |
tree | d60e93bcdc7fbdf47c46b2f508094d808534776c | |
parent | 88dc84bcf9fef32afa9af0ab41fa467c9733483f (diff) | |
download | cpython-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.py | 14 | ||||
-rw-r--r-- | Lib/test/datetimetester.py | 10 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2024-11-18-19-03-46.gh-issue-126947.NiDYUe.rst | 2 |
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. |