Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
9 changes: 4 additions & 5 deletions jsonargparse/_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
14 changes: 12 additions & 2 deletions jsonargparse/_typehints.py
Original file line number Diff line number Diff line change
Expand Up @@ -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."""

Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down
6 changes: 6 additions & 0 deletions jsonargparse_tests/test_typehints.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down