From 9b7d585112567a1d470e0928acdd033db6deb92f Mon Sep 17 00:00:00 2001 From: HamidOna13 Date: Mon, 11 May 2026 20:00:04 +0100 Subject: [PATCH 1/2] @ fix: avoid in-place mutation of ExtractedAnswer in ExtractiveReader Replace `answer.meta = {}` with `dataclasses.replace(answer, meta={})` in `_add_answer_page_number` to avoid triggering the dataclass mutation warning when an incoming answer has `meta=None`. Follow-up to epic #10564; fills a site missed by the sweep in #10659 (which listed line 393 but not line 323). @ --- haystack/components/readers/extractive.py | 2 +- ...der-inplace-mutation-53436ea625324943.yaml | 7 +++++++ test/components/readers/test_extractive.py | 20 +++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 releasenotes/notes/fix-extractive-reader-inplace-mutation-53436ea625324943.yaml diff --git a/haystack/components/readers/extractive.py b/haystack/components/readers/extractive.py index 43f46165f1..f11accb1aa 100644 --- a/haystack/components/readers/extractive.py +++ b/haystack/components/readers/extractive.py @@ -323,7 +323,7 @@ def _postprocess( def _add_answer_page_number(self, answer: ExtractedAnswer) -> ExtractedAnswer: if answer.meta is None: - answer.meta = {} + answer = replace(answer, meta={}) if answer.document_offset is None: return answer diff --git a/releasenotes/notes/fix-extractive-reader-inplace-mutation-53436ea625324943.yaml b/releasenotes/notes/fix-extractive-reader-inplace-mutation-53436ea625324943.yaml new file mode 100644 index 0000000000..2b9724c267 --- /dev/null +++ b/releasenotes/notes/fix-extractive-reader-inplace-mutation-53436ea625324943.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Fixed in-place mutation of ``ExtractedAnswer.meta`` in + ``ExtractiveReader._add_answer_page_number`` when the answer's ``meta`` + was ``None``. Now uses ``dataclasses.replace`` to avoid triggering the + dataclass mutation warning. diff --git a/test/components/readers/test_extractive.py b/test/components/readers/test_extractive.py index 03cf696b8d..5e2a6fd354 100644 --- a/test/components/readers/test_extractive.py +++ b/test/components/readers/test_extractive.py @@ -486,6 +486,26 @@ def test_add_answer_page_number_returns_same_answer(mock_reader: ExtractiveReade assert "page_number must be int" in caplog.text +def test_add_answer_page_number_with_none_meta(mock_reader: ExtractiveReader): + # when answer.meta is None, it should be initialized to {} without triggering a mutation warning + document = Document(content="I thought a lot about this. The answer is 42.", meta={"page_number": 5}) + answer = ExtractedAnswer( + data="42", + query="What is the answer?", + document=document, + score=1.0, + document_offset=ExtractedAnswer.Span(42, 44), + meta=None, + ) + import warnings + + with warnings.catch_warnings(): + warnings.simplefilter("error") + result = mock_reader._add_answer_page_number(answer=answer) + assert result.meta is not None + assert "answer_page_number" in result.meta + + def test_add_answer_page_number_with_form_feed(mock_reader: ExtractiveReader): document = Document( content="I thought a lot about this. \f And this document is long. \f The answer is 42.", From d0d4d0d87197f4693117a6867e8ef0afa7d5773c Mon Sep 17 00:00:00 2001 From: HamidOna13 Date: Tue, 12 May 2026 07:32:16 +0100 Subject: [PATCH 2/2] test: move warnings import to module level in test_extractive.py --- test/components/readers/test_extractive.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/components/readers/test_extractive.py b/test/components/readers/test_extractive.py index 5e2a6fd354..7a8a311ab7 100644 --- a/test/components/readers/test_extractive.py +++ b/test/components/readers/test_extractive.py @@ -3,6 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 import logging +import warnings from math import ceil, exp from unittest.mock import Mock, patch @@ -497,7 +498,6 @@ def test_add_answer_page_number_with_none_meta(mock_reader: ExtractiveReader): document_offset=ExtractedAnswer.Span(42, 44), meta=None, ) - import warnings with warnings.catch_warnings(): warnings.simplefilter("error")