Yada (Yet Another Dataclass Argument Parser!) is a library to automatically generate argparse.ArgumentParser
given data classes. Compared to some available options such as: Huggingface's HfArgumentParser, argparse_dataclass, and tap, it offers the following benefits:
- Static Type Checking
- Nested data classes and complex types
- Easy to extend and customize the parser
- Generate command line arguments given the data classes.
Install via PyPI (requires Python 3.8+):
pip install t2-yada
Yada's parser can be constructed from data classes. It relies on fieds' annotated types to construct correct argument parsers.
import yada
from dataclasses import dataclass
from typing import *
@dataclass
class CityArgs:
city: Literal["LA", "NY"]
@dataclass
class NestedArgs:
name: str
nested: CityArgs
parser = yada.YadaParser(NestedArgs)
args = parser.parse_args() # or use parser.parse_known_args() -- the two functions are similar to argparse.parse_args or argparse.parse_known_args
Note: YadaParser is annotated as a generic type: YadaParser[C, R]
where C denotes the classes, and R denotes the instance of the classes created from the arguments. Therefore, in the above example, C is inferred as NestedArgs, but R is unknown, hence the type of args
variable is unknown. To overcome this typing limitation, Yada provides several options for up to 10 data classes (yada.Parser1
, yada.Parser2
, ...). Below is two examples:
parser = yada.Parser1(NestedArgs)
args = parser.parse_args() # <-- args now has type NestedArgs
parser = yada.Parser2((NestedArgs, CityArgs))
args = parser.parse_args() # <-- args now has type Tuple[NestedArgs, CityArgs]
Note: we recommend to use one of the specific parsers yada.Parser<N>
instead of the generic yada.YadaParser
if possible as they provide strong typing support.
Add help message
Yada reads the help message from the key
property of dataclasses.Field.metadata
import yada
from dataclasses import dataclass, field
from typing import *
@dataclass
class CityArgs:
city: Literal["LA", "NY"] = field(metadata={"help": "city's which you want to get the timezone"})
parser = yada.Parser1(CityArgs)