From b613c79422b87690c5c969cbb3efeb34ed8fcf91 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Singh Date: Tue, 19 May 2026 22:24:06 +0530 Subject: [PATCH 1/2] fix: approx() tolerance not applied to sequences/mappings inside dicts When approx() is called on a dict whose values are themselves lists or dicts, _approx_scalar() was returning ApproxScalar for those values, which does exact equality. The top-level approx() dispatcher correctly routes sequences to ApproxSequenceLike and mappings to ApproxMapping, but _approx_scalar() -- called per-element by ApproxMapping.__eq__ -- missed those cases. Adding the same isinstance checks in _approx_scalar means nested structures get recursive approximate comparison instead of falling back to ==. Fixes #8703 Signed-off-by: Ashutosh Kumar Singh --- src/_pytest/python_api.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/_pytest/python_api.py b/src/_pytest/python_api.py index f22a0f5016d..f35cda4a43a 100644 --- a/src/_pytest/python_api.py +++ b/src/_pytest/python_api.py @@ -98,6 +98,10 @@ def _approx_scalar(self, x) -> ApproxBase: return ApproxDecimal(x, rel=self.rel, abs=self.abs, nan_ok=self.nan_ok) if isinstance(x, (datetime, timedelta)): return ApproxTimedelta(x, rel=self.rel, abs=self.abs, nan_ok=self.nan_ok) + if isinstance(x, Mapping): + return ApproxMapping(x, rel=self.rel, abs=self.abs, nan_ok=self.nan_ok) + if _is_sequence_like(x): + return ApproxSequenceLike(x, rel=self.rel, abs=self.abs, nan_ok=self.nan_ok) return ApproxScalar(x, rel=self.rel, abs=self.abs, nan_ok=self.nan_ok) def _yield_comparisons(self, actual): From 3ada952c4f2104d39f169ea7672e2f610feb4ba0 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Singh <144926351+Ashutosh-177@users.noreply.github.com> Date: Tue, 19 May 2026 22:25:59 +0530 Subject: [PATCH 2/2] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/_pytest/python_api.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/_pytest/python_api.py b/src/_pytest/python_api.py index f35cda4a43a..f22a0f5016d 100644 --- a/src/_pytest/python_api.py +++ b/src/_pytest/python_api.py @@ -98,10 +98,6 @@ def _approx_scalar(self, x) -> ApproxBase: return ApproxDecimal(x, rel=self.rel, abs=self.abs, nan_ok=self.nan_ok) if isinstance(x, (datetime, timedelta)): return ApproxTimedelta(x, rel=self.rel, abs=self.abs, nan_ok=self.nan_ok) - if isinstance(x, Mapping): - return ApproxMapping(x, rel=self.rel, abs=self.abs, nan_ok=self.nan_ok) - if _is_sequence_like(x): - return ApproxSequenceLike(x, rel=self.rel, abs=self.abs, nan_ok=self.nan_ok) return ApproxScalar(x, rel=self.rel, abs=self.abs, nan_ok=self.nan_ok) def _yield_comparisons(self, actual):