From 57dca89e890b717edb5c5411a8e4e3b210faeceb Mon Sep 17 00:00:00 2001 From: eliem08 Date: Tue, 20 Oct 2026 13:42:52 +0000 Subject: [PATCH] Fix deprecated_arg_default message for an already-changed default Orientation(d) declares the labels default change from #8473 without since or replaced, so the FutureWarning read "was changed in version None" and began "Current default value of argument labels=(('L', 'R'), ...)", which suggests the old default is still in effect. Setting replaced is not an option: with an unknown MONAI version (e.g. a source checkout without tags) the signature check raises at import time. For a replaced default, word the message as "Default value of argument X was changed [in version V] from ... to ...", omitting the version when it is not given. Signed-off-by: eliem08 --- monai/utils/deprecate_utils.py | 6 ++++-- tests/utils/test_deprecated.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/monai/utils/deprecate_utils.py b/monai/utils/deprecate_utils.py index 64e678e2bd6..a741524d501 100644 --- a/monai/utils/deprecate_utils.py +++ b/monai/utils/deprecate_utils.py @@ -277,7 +277,7 @@ def deprecated_arg_default( # smaller than `since`, do nothing return lambda obj: obj if since is None and replaced is None: - # raise a DeprecatedError directly + # no versions given: the default has already changed, so always warn that it changed is_replaced = True is_deprecated = True else: @@ -291,7 +291,9 @@ def _decorator(func): msg_prefix = f" Current default value of argument `{name}={old_default}`" if is_replaced: - msg_infix = f"was changed in version {replaced} from `{name}={old_default}` to `{name}={new_default}`." + msg_prefix = f" Default value of argument `{name}`" + in_version = f" in version {replaced}" if replaced is not None else "" + msg_infix = f"was changed{in_version} from `{name}={old_default}` to `{name}={new_default}`." elif is_deprecated: msg_infix = f"has been deprecated since version {since}." if replaced is not None: diff --git a/tests/utils/test_deprecated.py b/tests/utils/test_deprecated.py index 3171a67e2c3..9645d3df8ed 100644 --- a/tests/utils/test_deprecated.py +++ b/tests/utils/test_deprecated.py @@ -361,6 +361,37 @@ def foo(a, b="a"): self.assertWarns(FutureWarning, lambda: foo("a")) + def test_deprecated_arg_default_replaced_message(self): + """ + Test the message for a changed default, with and without a known version. + """ + + @deprecated_arg_default("b", old_default="a", new_default="b", version_val=self.test_version) + def foo(a, b="b"): + return a, b + + with self.assertWarns(FutureWarning) as aw: + foo("a") + msg = str(aw.warning) + self.assertIn("Default value of argument `b` was changed from `b=a` to `b=b`.", msg) + self.assertNotIn("version None", msg) + self.assertNotIn("Current default value", msg) + + @deprecated_arg_default( + "b", + old_default="a", + new_default="b", + since=self.prev_version, + replaced=self.prev_version, + version_val=self.test_version, + ) + def bar(a, b="b"): + return a, b + + with self.assertWarns(FutureWarning) as aw: + bar("a") + self.assertIn(f"was changed in version {self.prev_version} from `b=a` to `b=b`.", str(aw.warning)) + def test_deprecated_arg_default_warning_with_none_as_placeholder(self): """ Test deprecated arg default, where the default is used.