{"record":{"id":"6d4d170f628221b6","repo":"pytest-dev/pytest","slug":"pytest-approx-does-not-support-nan-ok-for-dateti","errorCode":null,"errorMessage":"pytest.approx() does not support nan_ok for datetime/timedelta comparisons.","messagePattern":"pytest\\.approx\\(\\) does not support nan_ok for datetime/timedelta comparisons\\.","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"src/_pytest/approx.py","lineNumber":652,"sourceCode":"    Requires an explicit tolerance as a timedelta for abs, or a float for rel.\n    Relative tolerance is not supported for datetime comparisons.\n    \"\"\"\n\n    def __init__(\n        self,\n        expected: datetime | timedelta,\n        rel: float | Decimal | timedelta | None,\n        abs: float | Decimal | timedelta | None,\n        nan_ok: bool,\n    ) -> None:\n        __tracebackhide__ = True\n        if isinstance(expected, datetime) and rel is not None:\n            raise TypeError(\n                \"pytest.approx() does not support relative tolerance for \"\n                \"datetime comparisons. Use abs=timedelta(...) instead.\"\n            )\n        if nan_ok:\n            raise TypeError(\n                \"pytest.approx() does not support nan_ok for \"\n                \"datetime/timedelta comparisons.\"\n            )\n        if abs is None and rel is None:\n            raise TypeError(\n                \"pytest.approx() requires an explicit tolerance for \"\n                \"datetime/timedelta comparisons: \"\n                \"e.g. approx(expected, abs=timedelta(seconds=1)) \"\n                \"or approx(expected, rel=0.01)\"\n            )\n        if abs is not None and not isinstance(abs, timedelta):\n            raise TypeError(\n                f\"absolute tolerance for datetime/timedelta must be a \"\n                f\"timedelta, got {type(abs).__name__}\"\n            )\n        if abs is not None and abs < timedelta(0):\n            raise ValueError(f\"absolute tolerance can't be negative: {abs}\")\n        if rel is not None:","sourceCodeStart":634,"sourceCodeEnd":670,"githubUrl":"https://github.com/pytest-dev/pytest/blob/0d6fbdeffa57c796123f62f81f7dd370d9b7ecdc/src/_pytest/approx.py#L634-L670","documentation":"ApproxTimedelta.__init__ rejects nan_ok=True for any datetime or timedelta comparison because NaN has no representation in datetime/timedelta arithmetic (you cannot have a 'NaN datetime'), so allowing NaN-equality would be meaningless. The check runs after the datetime+rel check and before the explicit-tolerance check.","triggerScenarios":"Calling approx(datetime.now(), abs=timedelta(seconds=1), nan_ok=True); approx(timedelta(seconds=5), rel=0.01, nan_ok=True). Triggered at ApproxTimedelta.__init__ (src/_pytest/approx.py:651-655).","commonSituations":"Copy-pasting nan_ok=True from a numeric array test into a datetime test; using a generic helper that always sets nan_ok.","solutions":["Drop nan_ok for datetime/timedelta comparisons: `approx(dt, abs=timedelta(seconds=1))`.","Filter NaN values out of the data before comparison instead of using nan_ok.","Branch helper logic: only pass nan_ok when the expected value is numeric."],"exampleFix":"# before\napprox(datetime.now(), abs=timedelta(seconds=1), nan_ok=True)\n# after\napprox(datetime.now(), abs=timedelta(seconds=1))","handlingStrategy":"validation","validationCode":"from datetime import datetime, timedelta\ndef safe_nan_ok(expected, nan_ok) -> bool:\n    if isinstance(expected, (datetime, timedelta)):\n        return False  # nan_ok never valid for datetime/timedelta\n    return nan_ok\n# usage\nassert actual == approx(expected, abs=tol, nan_ok=safe_nan_ok(expected, nan_ok))","typeGuard":"from datetime import datetime, timedelta\ndef supports_nan_ok(expected) -> bool:\n    return not isinstance(expected, (datetime, timedelta))","tryCatchPattern":null,"preventionTips":["Drop nan_ok for any datetime/timedelta approx.","In generic helpers, only set nan_ok for numeric expected.","Filter NaN rows from data instead of relying on nan_ok for time types."],"tags":["pytest","approx","datetime","nan","misuse"],"backgroundTag":null,"analyzedSha":"0d6fbdeffa57c796123f62f81f7dd370d9b7ecdc","analyzedAt":"2026-08-11T20:52:36.969Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}