mirror of
https://github.com/python/cpython.git
synced 2024-11-24 00:38:00 +01:00
gh-126947: Typechecking for _pydatetime.timedelta.__new__ arguments (#126949)
Co-authored-by: sobolevn <mail@sobolevn.me> Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
This commit is contained in:
parent
88dc84bcf9
commit
8da9920a80
@ -651,7 +651,19 @@ class timedelta:
|
|||||||
# guide the C implementation; it's way more convoluted than speed-
|
# guide the C implementation; it's way more convoluted than speed-
|
||||||
# ignoring auto-overflow-to-long idiomatic Python could be.
|
# 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.
|
# Final values, all integer.
|
||||||
# s and us fit in 32-bit signed ints; d isn't bounded.
|
# s and us fit in 32-bit signed ints; d isn't bounded.
|
||||||
|
@ -510,6 +510,7 @@ class TestTimeDelta(HarmlessMixedComparison, unittest.TestCase):
|
|||||||
|
|
||||||
def test_constructor(self):
|
def test_constructor(self):
|
||||||
eq = self.assertEqual
|
eq = self.assertEqual
|
||||||
|
ra = self.assertRaises
|
||||||
td = timedelta
|
td = timedelta
|
||||||
|
|
||||||
# Check keyword args to constructor
|
# Check keyword args to constructor
|
||||||
@ -533,6 +534,15 @@ class TestTimeDelta(HarmlessMixedComparison, unittest.TestCase):
|
|||||||
eq(td(seconds=0.001), td(milliseconds=1))
|
eq(td(seconds=0.001), td(milliseconds=1))
|
||||||
eq(td(milliseconds=0.001), td(microseconds=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):
|
def test_computations(self):
|
||||||
eq = self.assertEqual
|
eq = self.assertEqual
|
||||||
td = timedelta
|
td = timedelta
|
||||||
|
@ -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.
|
Loading…
Reference in New Issue
Block a user