diff --git a/simple_parsing/wrappers/field_parsing.py b/simple_parsing/wrappers/field_parsing.py index 5208a6ec..3734ed32 100644 --- a/simple_parsing/wrappers/field_parsing.py +++ b/simple_parsing/wrappers/field_parsing.py @@ -200,7 +200,12 @@ def parse_optional(t: type[T]) -> Callable[[Optional[Any]], Optional[T]]: parse = get_parsing_fn(t) def _parse_optional(val: Optional[Any]) -> Optional[T]: - return val if val is None else parse(val) + if val is None: + return val + elif isinstance(val, str) and val == "None": + return None + else: + return parse(val) return _parse_optional diff --git a/test/test_optional.py b/test/test_optional.py index fc3226d5..9dcc16c5 100644 --- a/test/test_optional.py +++ b/test/test_optional.py @@ -31,6 +31,22 @@ def test_optional_seed(): assert config == Config(123) +@dataclass +class Config2: + var_with_default: Optional[int] = 42 + + +def test_optional_with_default_value(): + """Test that a value marked as Optional with a default value can be overridden to None. + """ + parser = ArgumentParser() + parser.add_arguments(Config2, dest="config") + + assert parser.parse_args([]).config == Config2(var_with_default=42) + assert parser.parse_args(["--var_with_default"]).config == Config2(var_with_default=None) + assert parser.parse_args("--var_with_default None".split()).config == Config2(var_with_default=None) + + @dataclass class Child: name: str = "Kevin"