Positional Arguments#

Positional-only arguments in functions are converted to positional CLI arguments.

For more general positional arguments, see tyro.conf.Positional.

 1from __future__ import annotations
 2
 3import dataclasses
 4import enum
 5import pathlib
 6from typing import Tuple
 7
 8import tyro
 9
10
11def main(
12    source: pathlib.Path,
13    dest: pathlib.Path,
14    /,  # Mark the end of positional arguments.
15    optimizer: OptimizerConfig,
16    force: bool = False,
17    verbose: bool = False,
18    background_rgb: Tuple[float, float, float] = (1.0, 0.0, 0.0),
19) -> None:
20    """Command-line interface defined using a function signature. Note that this
21    docstring is parsed to generate helptext.
22
23    Args:
24        source: Source path.
25        dest: Destination path.
26        optimizer: Configuration for our optimizer object.
27        force: Do not prompt before overwriting.
28        verbose: Explain what is being done.
29        background_rgb: Background color. Red by default.
30    """
31    print(f"{source=}\n{dest=}\n{optimizer=}\n{force=}\n{verbose=}\n{background_rgb=}")
32
33
34class OptimizerType(enum.Enum):
35    ADAM = enum.auto()
36    SGD = enum.auto()
37
38
39@dataclasses.dataclass(frozen=True)
40class OptimizerConfig:
41    algorithm: OptimizerType = OptimizerType.ADAM
42    """Gradient-based optimizer to use."""
43
44    learning_rate: float = 3e-4
45    """Learning rate to use."""
46
47    weight_decay: float = 1e-2
48    """Coefficient for L2 regularization."""
49
50
51if __name__ == "__main__":
52    tyro.cli(main)

python 04_additional/01_positional_args.py --help
usage: 01_positional_args.py [-h] [OPTIONS] PATH PATH

Command-line interface defined using a function signature. Note that this 
docstring is parsed to generate helptext.

╭─ positional arguments ─────────────────────────────────────────────────────╮
│ PATH                    Source path. (required)                            │
│ PATH                    Destination path. (required)                       │
╰────────────────────────────────────────────────────────────────────────────╯
╭─ options ──────────────────────────────────────────────────────────────────╮
│ -h, --help              show this help message and exit                    │
│ --force, --no-force     Do not prompt before overwriting. (default: False) │
│ --verbose, --no-verbose                                                    │
│                         Explain what is being done. (default: False)       │
│ --background-rgb FLOAT FLOAT FLOAT                                         │
│                         Background color. Red by default. (default: 1.0    │
│                         0.0 0.0)                                           │
╰────────────────────────────────────────────────────────────────────────────╯
╭─ optimizer options ────────────────────────────────────────────────────────╮
│ Configuration for our optimizer object.                                    │
│ ────────────────────────────────────────────────────────────────────────── │
│ --optimizer.algorithm {ADAM,SGD}                                           │
│                         Gradient-based optimizer to use. (default: ADAM)   │
│ --optimizer.learning-rate FLOAT                                            │
│                         Learning rate to use. (default: 0.0003)            │
│ --optimizer.weight-decay FLOAT                                             │
│                         Coefficient for L2 regularization. (default: 0.01) │
╰────────────────────────────────────────────────────────────────────────────╯

python 04_additional/01_positional_args.py ./a ./b --optimizer.learning-rate 1e-5
source=PosixPath('a')
dest=PosixPath('b')
optimizer=OptimizerConfig(algorithm=<OptimizerType.ADAM: 1>, learning_rate=1e-05, weight_decay=0.01)
force=False
verbose=False
background_rgb=(1.0, 0.0, 0.0)