From 57b4d237c5e3329dc96fd99b49a6e87023bcb0e5 Mon Sep 17 00:00:00 2001 From: Roman Claudiu Date: Sun, 8 Nov 2026 12:42:13 +0200 Subject: [PATCH] Don't pass prefix_chars to add_argument_group unless given Python 3.14 deprecates passing prefix_chars to ArgumentParser.add_argument_group() and warns whenever the keyword is present. The group already inherits the parser's prefix_chars when it is omitted, so only forward it when the caller sets it explicitly. Fixes #368 --- simple_parsing/parsing.py | 7 ++++++- test/test_issue_368.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 test/test_issue_368.py diff --git a/simple_parsing/parsing.py b/simple_parsing/parsing.py index 55f03f0e..e9c847a4 100644 --- a/simple_parsing/parsing.py +++ b/simple_parsing/parsing.py @@ -370,12 +370,17 @@ def add_argument_group( argument_default=None, conflict_handler=None, ) -> argparse._ArgumentGroup: + kwargs = {} + if prefix_chars: + # Passing `prefix_chars` is deprecated since Python 3.14. When it is omitted, the group + # uses the parser's `prefix_chars` anyway. + kwargs["prefix_chars"] = prefix_chars return super().add_argument_group( title=title, description=description, - prefix_chars=prefix_chars or self.prefix_chars, argument_default=argument_default or self.argument_default, conflict_handler=conflict_handler or self.conflict_handler, + **kwargs, ) def print_help(self, file=None, args: Sequence[str] | None = None): diff --git a/test/test_issue_368.py b/test/test_issue_368.py new file mode 100644 index 00000000..9062ca05 --- /dev/null +++ b/test/test_issue_368.py @@ -0,0 +1,36 @@ +"""Test for https://github.com/lebrice/SimpleParsing/issues/368.""" + +from __future__ import annotations + +import warnings +from dataclasses import dataclass + +import simple_parsing + + +@dataclass +class Config: + x: int = 1 + + +def test_add_argument_group_does_not_warn(): + """Python 3.14 deprecates passing `prefix_chars` to `add_argument_group`.""" + with warnings.catch_warnings(): + warnings.simplefilter("error", DeprecationWarning) + parser = simple_parsing.ArgumentParser() + parser.add_arguments(Config, dest="config") + args = parser.parse_args(["--x", "3"]) + assert args.config == Config(x=3) + + +def test_argument_group_inherits_parser_settings(): + parser = simple_parsing.ArgumentParser( + prefix_chars="+", argument_default=123, conflict_handler="resolve" + ) + group = parser.add_argument_group("group") + assert group.prefix_chars == "+" + assert group.argument_default == 123 + assert group.conflict_handler == "resolve" + + group.add_argument("+y", type=int) + assert parser.parse_args(["+y", "4"]).y == 4