diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 232e5aad..16db6727 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -32,6 +32,8 @@ Fixed `__). - Callable that returns class not using required parameter default from lambda (`#523 `__). +- Failing to parse list of dataclasses with nested optional dataclass (`#527 + `__). v4.29.0 (2024-05-24) diff --git a/jsonargparse/_signatures.py b/jsonargparse/_signatures.py index 8a40804f..133f9c0a 100644 --- a/jsonargparse/_signatures.py +++ b/jsonargparse/_signatures.py @@ -103,7 +103,7 @@ def add_class_arguments( prefix = nested_key + "." if nested_key else "" defaults = default.lazy_get_init_args() if defaults: - defaults = {prefix + k: v for k, v in defaults.items() if k not in skip} + defaults = {prefix + k: v for k, v in defaults.__dict__.items() if k not in skip} self.set_defaults(**defaults) # type: ignore[attr-defined] return added_args diff --git a/jsonargparse_tests/test_dataclass_like.py b/jsonargparse_tests/test_dataclass_like.py index cbaa97d2..995f740c 100644 --- a/jsonargparse_tests/test_dataclass_like.py +++ b/jsonargparse_tests/test_dataclass_like.py @@ -186,6 +186,22 @@ def test_add_class_optional_without_default(parser): assert parser.parse_args(["--param=null"]) == Namespace(param=None) +@dataclasses.dataclass +class ListOptionalA: + x: int + + +@dataclasses.dataclass +class ListOptionalB: + a: Optional[ListOptionalA] = None + + +def test_list_nested_optional_dataclass(parser): + parser.add_argument("--b", type=List[ListOptionalB]) + cfg = parser.parse_args(['--b=[{"a":{"x":1}}]']) + assert cfg.b == [Namespace(a=Namespace(x=1))] + + def test_add_argument_dataclass_type(parser): parser.add_argument("--b", type=DataClassB, default=DataClassB(b1=7.0)) cfg = parser.get_defaults()