gh-81267: Correct time.sleep() error message (#131055)

This commit is contained in:
Stan Ulbrych 2025-03-12 08:12:57 +00:00 committed by GitHub
parent 15a8412b5e
commit 155c44b901
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 27 additions and 16 deletions

View file

@ -167,6 +167,11 @@ class TimeTestCase(unittest.TestCase):
self.assertRaises(ValueError, time.sleep, -1) self.assertRaises(ValueError, time.sleep, -1)
self.assertRaises(ValueError, time.sleep, -0.1) self.assertRaises(ValueError, time.sleep, -0.1)
# Improved exception #81267
with self.assertRaises(TypeError) as errmsg:
time.sleep([])
self.assertIn("integer or float", str(errmsg.exception))
def test_sleep(self): def test_sleep(self):
for value in [-0.0, 0, 0.0, 1e-100, 1e-9, 1e-6, 1, 1.2]: for value in [-0.0, 0, 0.0, 1e-100, 1e-9, 1e-6, 1, 1.2]:
with self.subTest(value=value): with self.subTest(value=value):

View file

@ -0,0 +1,2 @@
Correct :func:`time.sleep` error message when an object that cannot be interpreted
as an integer or float is provided.

View file

@ -594,26 +594,30 @@ pytime_from_object(PyTime_t *tp, PyObject *obj, _PyTime_round_t round,
} }
return pytime_from_double(tp, d, round, unit_to_ns); return pytime_from_double(tp, d, round, unit_to_ns);
} }
else {
long long sec = PyLong_AsLongLong(obj);
if (sec == -1 && PyErr_Occurred()) {
if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
pytime_overflow();
}
return -1;
}
static_assert(sizeof(long long) <= sizeof(PyTime_t), long long sec = PyLong_AsLongLong(obj);
"PyTime_t is smaller than long long"); if (sec == -1 && PyErr_Occurred()) {
PyTime_t ns = (PyTime_t)sec; if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
if (pytime_mul(&ns, unit_to_ns) < 0) {
pytime_overflow(); pytime_overflow();
return -1;
} }
else if (PyErr_ExceptionMatches(PyExc_TypeError)) {
*tp = ns; PyErr_Format(PyExc_TypeError,
return 0; "'%T' object cannot be interpreted as an integer or float",
obj);
}
return -1;
} }
static_assert(sizeof(long long) <= sizeof(PyTime_t),
"PyTime_t is smaller than long long");
PyTime_t ns = (PyTime_t)sec;
if (pytime_mul(&ns, unit_to_ns) < 0) {
pytime_overflow();
return -1;
}
*tp = ns;
return 0;
} }