pytest-dev/pytest · error · TypeError
pytest.approx() does not support nan_ok for datetime/timedel
Error message
pytest.approx() does not support nan_ok for datetime/timedelta comparisons.
What it means
ApproxTimedelta.__init__ rejects nan_ok=True for datetime/timedelta comparisons. NaN datetimes/timedeltas are not a supported concept, so allowing them would be meaningless.
Source
Thrown at src/_pytest/approx.py:652
Requires an explicit tolerance as a timedelta for abs, or a float for rel.
Relative tolerance is not supported for datetime comparisons.
"""
def __init__(
self,
expected: datetime | timedelta,
rel: float | Decimal | timedelta | None,
abs: float | Decimal | timedelta | None,
nan_ok: bool,
) -> None:
__tracebackhide__ = True
if isinstance(expected, datetime) and rel is not None:
raise TypeError(
"pytest.approx() does not support relative tolerance for "
"datetime comparisons. Use abs=timedelta(...) instead."
)
if nan_ok:
raise TypeError(
"pytest.approx() does not support nan_ok for "
"datetime/timedelta comparisons."
)
if abs is None and rel is None:
raise TypeError(
"pytest.approx() requires an explicit tolerance for "
"datetime/timedelta comparisons: "
"e.g. approx(expected, abs=timedelta(seconds=1)) "
"or approx(expected, rel=0.01)"
)
if abs is not None and not isinstance(abs, timedelta):
raise TypeError(
f"absolute tolerance for datetime/timedelta must be a "
f"timedelta, got {type(abs).__name__}"
)
if abs is not None and abs < timedelta(0):
raise ValueError(f"absolute tolerance can't be negative: {abs}")
if rel is not None:View on GitHub (pinned to 98b357f69e)
Solutions
- Drop the nan_ok=True argument for datetime/timedelta comparisons.
- If you genuinely need NaN handling, you are comparing the wrong type — restructure the test.
Example fix
// before assert got == approx(dt, abs=timedelta(seconds=1), nan_ok=True) // after assert got == approx(dt, abs=timedelta(seconds=1))
Defensive patterns
Strategy: validation
Validate before calling
def approx_dt(value, abs_td):
return pytest.approx(value, abs=abs_td, nan_ok=False) # never pass nan_ok for datetime Type guard
from datetime import datetime, timedelta
def is_datetime_like(v) -> bool:
return isinstance(v, (datetime, timedelta)) Prevention
- Do not blanket-default nan_ok=True across parametrized tests; set it per-type.
- Audit copy-pasted approx() calls when changing the expected value's type.
When it happens
Trigger: Call pytest.approx(dt_or_timedelta, abs=timedelta(seconds=1), nan_ok=True) (or with rel= for a timedelta).
Common situations: Copy-pasting a numeric approx() call (that used nan_ok=True) when migrating to datetime/timedelta values; blanket defaulting nan_ok=True across a parametrized test matrix.
Related errors
- pytest.approx() does not support relative tolerance for date
- pytest.approx() requires an explicit tolerance for datetime/
- absolute tolerance for datetime/timedelta must be a timedelt
- absolute tolerance can't be negative: {abs}
- absolute tolerance can't be NaN.
AI-assisted analysis of pytest-dev/pytest@98b357f69e (2026-08-04).
Data as JSON: /data/errors/6d4d170f628221b6.json.
Report an issue: GitHub.