Skip to content

Commit 18779d0

Browse files
Fix hyphen parser with default (#736)
--------- Co-authored-by: Mauricio Villegas <5780272+mauvilsa@users.noreply.github.com>
1 parent 6ad1dd6 commit 18779d0

3 files changed

Lines changed: 26 additions & 1 deletion

File tree

CHANGELOG.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ Fixed
2121
- ``adapt_class_type`` used a locally defined `partial_instance` wrapper
2222
function that is not pickleable (`#728
2323
<https://github.com/omni-us/jsonargparse/pull/728>`__).
24+
- ArgumentParser with dashes incorrectly resolves paths to default values (`#736
25+
<https://github.com/omni-us/jsonargparse/pull/736>`__).
2426

2527

2628
v4.40.0 (2025-05-16)

jsonargparse/_core.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ def set_defaults(self, *args: Dict[str, Any], **kwargs: Any) -> None:
201201
"""
202202
for arg in args:
203203
for dest, default in arg.items():
204+
dest = dest.replace("-", "_")
204205
action = _find_action(self, dest)
205206
if action is None:
206207
raise NSKeyError(f'No action for key "{dest}" to set its default.')
@@ -458,7 +459,7 @@ def parse_args( # type: ignore[override]
458459
cfg, unk = self.parse_known_args(args=args, namespace=cfg)
459460
cfg, unk = self._positional_optionals(cfg, unk)
460461
if unk:
461-
self.error(f'Unrecognized arguments: {" ".join(unk)}')
462+
self.error(f"Unrecognized arguments: {' '.join(unk)}")
462463

463464
parsed_cfg = self._parse_common(
464465
cfg=cfg,

jsonargparse_tests/test_dataclass_like.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,16 @@ class NestedDefaultsB:
116116
a: List[NestedDefaultsA]
117117

118118

119+
@dataclasses.dataclass
120+
class NestedDefaultsC:
121+
field_with_dash: int = 5
122+
123+
124+
@dataclasses.dataclass
125+
class NestedDefaultsD:
126+
c_with_dash: NestedDefaultsC = dataclasses.field(default_factory=NestedDefaultsC)
127+
128+
119129
def test_add_dataclass_nested_defaults(parser):
120130
parser.add_class_arguments(NestedDefaultsB, "data")
121131
cfg = parser.parse_args(["--data.a=[{}]"])
@@ -989,6 +999,18 @@ def test_nested_dict(self, parser):
989999
assert isinstance(init.model, PydanticNestedDict)
9901000
assert isinstance(init.model.nested["key"], NestedModel)
9911001

1002+
def test_dashes_in_nested_dataclass(self):
1003+
class UnderscoresToDashesParser(ArgumentParser):
1004+
def add_argument(self, *args, **kwargs):
1005+
args = [arg.replace("_", "-") for arg in args]
1006+
return super().add_argument(*args, **kwargs)
1007+
1008+
parser = UnderscoresToDashesParser(parse_as_dict=False, default_env=True)
1009+
parser.add_class_arguments(NestedDefaultsD)
1010+
ns = parser.parse_args([])
1011+
cfg = parser.instantiate_classes(ns)
1012+
assert cfg.c_with_dash.field_with_dash == 5
1013+
9921014

9931015
# attrs tests
9941016

0 commit comments

Comments
 (0)