diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 5eea7042..429e533e 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -24,6 +24,8 @@ Fixed ^^^^^ - Parameter resolving falling back to assumptions resolver for optional ``Union`` types. +- Nested parameters failing to parse from command line when value includes + space. v4.28.0 (2024-04-17) diff --git a/jsonargparse/_core.py b/jsonargparse/_core.py index 36141eff..703a724f 100644 --- a/jsonargparse/_core.py +++ b/jsonargparse/_core.py @@ -265,13 +265,12 @@ def parse_known_args(self, args=None, namespace=None): return namespace, args def _parse_optional(self, arg_string): - if arg_string == self._print_config: - arg_string += "=" - arg_parsed = super()._parse_optional(arg_string) - subclass_arg = ActionTypeHint.parse_argv_item(arg_string, arg_parsed) + subclass_arg = ActionTypeHint.parse_argv_item(arg_string) if subclass_arg: return subclass_arg - return arg_parsed + if arg_string == self._print_config: + arg_string += "=" + return super()._parse_optional(arg_string) def _parse_common( self, diff --git a/jsonargparse/_typehints.py b/jsonargparse/_typehints.py index 1108946e..f945b6d9 100644 --- a/jsonargparse/_typehints.py +++ b/jsonargparse/_typehints.py @@ -160,6 +160,16 @@ sub_defaults: ContextVar = ContextVar("sub_defaults", default=False) +def get_parse_optional_num_return() -> int: + parser = __import__("argparse").ArgumentParser() + parser.add_argument("--test") + arg_parsed = parser._parse_optional("--test=x") + return len(arg_parsed) + + +parse_optional_num_return = get_parse_optional_num_return() + + class ActionTypeHint(Action): """Action to parse a type hint.""" @@ -339,7 +349,7 @@ def is_init_arg_mapping_typehint(self, key, cfg): return result @staticmethod - def parse_argv_item(arg_string, arg_parsed): + def parse_argv_item(arg_string): parser = subclass_arg_parser.get() action = None sep = None @@ -352,7 +362,7 @@ def parse_argv_item(arg_string, arg_parsed): typehint = typehint_from_action(action) if typehint: - if len(arg_parsed) == 4: + if parse_optional_num_return == 4: return action, arg_base, sep, explicit_arg return action, arg_base, explicit_arg return None diff --git a/jsonargparse_tests/test_typehints.py b/jsonargparse_tests/test_typehints.py index 2e05d84f..f5d284e6 100644 --- a/jsonargparse_tests/test_typehints.py +++ b/jsonargparse_tests/test_typehints.py @@ -486,6 +486,12 @@ def test_dict_command_line_set_items(parser): assert cfg.dict == {"one": 1, "two": 2} +def test_dict_command_line_set_items_with_space(parser): + parser.add_argument("--dict", type=dict) + cfg = parser.parse_args(["--dict.a=x y"]) + assert {"a": "x y"} == cfg.dict + + def test_mapping_nested_without_args(parser): parser.add_argument("--map", type=Mapping[str, Union[int, Mapping]]) assert {"a": 1} == parser.parse_args(['--map={"a": 1}']).map