diff --git a/simple_parsing/wrappers/field_wrapper.py b/simple_parsing/wrappers/field_wrapper.py index 62f79bc4..afae7558 100644 --- a/simple_parsing/wrappers/field_wrapper.py +++ b/simple_parsing/wrappers/field_wrapper.py @@ -272,7 +272,8 @@ def get_arg_options(self) -> dict[str, Any]: _arg_options.pop("metavar", None) elif utils.is_optional(self.type) or self.field.default is None: - _arg_options["required"] = False + if not self.field.metadata.get("positional"): + _arg_options["required"] = False if utils.is_optional(self.type): type_arguments = utils.get_args(self.type) diff --git a/test/test_optional.py b/test/test_optional.py index 0961ac39..fc3226d5 100644 --- a/test/test_optional.py +++ b/test/test_optional.py @@ -3,6 +3,7 @@ import pytest +import simple_parsing from simple_parsing import ArgumentParser from .testutils import TestSetup @@ -142,3 +143,14 @@ class Bob(TestSetup): # actual = SomeDataclass.setup(f"--some_attribute {passed_value}") # assert actual.some_attribute == expected_value # assert isinstance(actual.some_attribute, some_type) + + +def test_optional_positional(): + """Test a optional positional argument.""" + + @dataclass + class Foo(TestSetup): + a: Optional[int] = simple_parsing.field(positional=True, default=None) + + assert Foo.setup("") == Foo(a=None) + assert Foo.setup("1") == Foo(a=1)