| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
naturaltime and precisedelta both routed their float input through
_date_and_delta, which fed it straight to round() (or skipped round
in precise mode) and then dt.timedelta(seconds=...). For a non-finite
float like inf or -inf, round(float("inf")) raises OverflowError
and dt.timedelta(seconds=float("inf")) raises OverflowError too.
NaN happened to work because round(float("nan")) raises ValueError
which the except clause caught, but inf/-inf slipped past.
The naturaldelta path caught inf/-inf via a different probe (it
calls int(value) first, which raises OverflowError for inf) and
that case is fixed in the still-open PR python-humanize#342 -- this commit leaves
that probe alone and adds the equivalent isfinite guard inside
_date_and_delta, which is what both naturaltime and precisedelta
go through. Adding OverflowError to the except tuple covers the
last remaining case where a finite but oversized number
(> ~3e9 days in seconds) would otherwise crash.
Three new parametrized test functions in tests/test_time.py cover
naturaltime, precisedelta, and the internal _date_and_delta
contract for inf/-inf/nan. The inf and -inf cases fail on the
pre-fix code with OverflowError; the nan case already worked and
is included as a regression guard. Full suite: 724 passed,
69 skipped.
for more information, see https://pre-commit.ci
Sorry, something went wrong.
| Back | FazBrowse Home | New Git URL |
Both naturaltime() and precisedelta() feed a float input through _date_and_delta(), which passes it straight to round() (or skips rounding when precise=True). For float('inf') and float('-inf'), round() raises OverflowError: cannot convert float infinity to integer and dt.timedelta(seconds=float('inf')) raises the same. The except clause in the function catches ValueError, TypeError, but not OverflowError, so the user gets a traceback rather than the documented "return str(value) unchanged" behavior.
naturaldelta() already had the same bug, fixed in #342 by widening the except to include OverflowError. naturaltime() and precisedelta() still crash because they take a different path (round() instead of int()). This PR mirrors #342's fix for the two other public functions, by guarding the float-input branch with an explicit math.isfinite check before round()/timedelta() and by widening the except to (ValueError, TypeError, OverflowError) so a huge but finite value (e.g. 1e100) falls through the same way.
precise=True (used by precisedelta()) skips the round() call but still constructs dt.timedelta(seconds=value), which raises OverflowError for non-finite floats. The isfinite guard handles both paths.
Verified: