Unverified Commit 8994c1e4 authored by Peter Izsak's avatar Peter Izsak Committed by GitHub
Browse files

Add optional grouped parsers description to HfArgumentParser (#12042)

* Adding optional argument group to HfArgumentParser

* Minor

* remove whitespace

* Minor styling
parent 2056f26e
...@@ -46,7 +46,7 @@ class HfArgumentParser(ArgumentParser): ...@@ -46,7 +46,7 @@ class HfArgumentParser(ArgumentParser):
The class is designed to play well with the native argparse. In particular, you can add more (non-dataclass backed) The class is designed to play well with the native argparse. In particular, you can add more (non-dataclass backed)
arguments to the parser after initialization and you'll get the output back after parsing as an additional arguments to the parser after initialization and you'll get the output back after parsing as an additional
namespace. namespace. Optional: To create sub argument groups use the `_argument_group_name` attribute in the dataclass.
""" """
dataclass_types: Iterable[DataClassType] dataclass_types: Iterable[DataClassType]
...@@ -67,6 +67,10 @@ class HfArgumentParser(ArgumentParser): ...@@ -67,6 +67,10 @@ class HfArgumentParser(ArgumentParser):
self._add_dataclass_arguments(dtype) self._add_dataclass_arguments(dtype)
def _add_dataclass_arguments(self, dtype: DataClassType): def _add_dataclass_arguments(self, dtype: DataClassType):
if hasattr(dtype, "_argument_group_name"):
parser = self.add_argument_group(dtype._argument_group_name)
else:
parser = self
for field in dataclasses.fields(dtype): for field in dataclasses.fields(dtype):
if not field.init: if not field.init:
continue continue
...@@ -103,7 +107,7 @@ class HfArgumentParser(ArgumentParser): ...@@ -103,7 +107,7 @@ class HfArgumentParser(ArgumentParser):
kwargs["required"] = True kwargs["required"] = True
elif field.type is bool or field.type == Optional[bool]: elif field.type is bool or field.type == Optional[bool]:
if field.default is True: if field.default is True:
self.add_argument(f"--no_{field.name}", action="store_false", dest=field.name, **kwargs) parser.add_argument(f"--no_{field.name}", action="store_false", dest=field.name, **kwargs)
# Hack because type=bool in argparse does not behave as we want. # Hack because type=bool in argparse does not behave as we want.
kwargs["type"] = string_to_bool kwargs["type"] = string_to_bool
...@@ -136,7 +140,7 @@ class HfArgumentParser(ArgumentParser): ...@@ -136,7 +140,7 @@ class HfArgumentParser(ArgumentParser):
kwargs["default"] = field.default_factory() kwargs["default"] = field.default_factory()
else: else:
kwargs["required"] = True kwargs["required"] = True
self.add_argument(field_name, **kwargs) parser.add_argument(field_name, **kwargs)
def parse_args_into_dataclasses( def parse_args_into_dataclasses(
self, args=None, return_remaining_strings=False, look_for_args_file=True, args_filename=None self, args=None, return_remaining_strings=False, look_for_args_file=True, args_filename=None
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment