From d238824e746641b9c88308bf5ceb416ea31cbfb4 Mon Sep 17 00:00:00 2001 From: Bujjibabukatta Date: Sat, 11 Jul 2026 15:34:13 +0530 Subject: [PATCH] Fix BaseSerialization double-wrapping args for builtin exceptions --- .../serialization/serialized_objects.py | 2 +- .../serialization/test_serialized_objects.py | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/airflow-core/src/airflow/serialization/serialized_objects.py b/airflow-core/src/airflow/serialization/serialized_objects.py index 54bc3389c64ce..ef4853c73e811 100644 --- a/airflow-core/src/airflow/serialization/serialized_objects.py +++ b/airflow-core/src/airflow/serialization/serialized_objects.py @@ -555,7 +555,7 @@ def serialize( cls.serialize( { "exc_cls_name": var.__class__.__name__, - "args": [var.args], + "args": list(var.args), "kwargs": {}, }, strict=strict, diff --git a/airflow-core/tests/unit/serialization/test_serialized_objects.py b/airflow-core/tests/unit/serialization/test_serialized_objects.py index 8495100cc47fc..4ec1cc09ff7f4 100644 --- a/airflow-core/tests/unit/serialization/test_serialized_objects.py +++ b/airflow-core/tests/unit/serialization/test_serialized_objects.py @@ -580,6 +580,27 @@ def test_roundtrip_exceptions(): assert deser.reschedule_date == some_date +@pytest.mark.parametrize( + "exc", + [ + KeyError("boom"), + AttributeError("attr missing"), + KeyError("a", "b"), + KeyError(), + ], +) +def test_roundtrip_builtin_exceptions(exc): + """BaseSerialization should preserve ``args`` when round-tripping built-in exceptions. + + Regression test for https://github.com/apache/airflow/issues/69743 where + a KeyError("boom") would deserialize with args == (("boom",),) instead of ("boom",). + """ + ser = BaseSerialization.serialize(exc) + deser = BaseSerialization.deserialize(ser) + assert isinstance(deser, type(exc)) + assert deser.args == exc.args + + @pytest.mark.parametrize( "concurrency_parameter", [