Required CLI Options¶
We said before that by default:
- CLI options are optional
- CLI arguments are required
Well, that's how they work by default, and that's the convention in many CLI programs and systems.
But if you really want, you can change that.
To make a CLI option required, you can put typer.Option()
inside of Annotated
and leave the parameter without a default value.
Let's make --lastname
a required CLI option:
import typer
from typing_extensions import Annotated
def main(name: str, lastname: Annotated[str, typer.Option()]):
print(f"Hello {name} {lastname}")
if __name__ == "__main__":
typer.run(main)
🤓 Other versions and variants
Tip
Prefer to use the Annotated
version if possible.
import typer
def main(name: str, lastname: str = typer.Option()):
print(f"Hello {name} {lastname}")
if __name__ == "__main__":
typer.run(main)
The same way as with typer.Argument()
, the old style of using the function parameter default value is also supported, in that case you would just not pass anything to the default
parameter.
import typer
def main(name: str, lastname: str = typer.Option()):
print(f"Hello {name} {lastname}")
if __name__ == "__main__":
typer.run(main)
🤓 Other versions and variants
import typer
from typing_extensions import Annotated
def main(name: str, lastname: Annotated[str, typer.Option()]):
print(f"Hello {name} {lastname}")
if __name__ == "__main__":
typer.run(main)
Or you can explictily pass ...
to typer.Option(default=...)
:
import typer
def main(name: str, lastname: str = typer.Option(default=...)):
print(f"Hello {name} {lastname}")
if __name__ == "__main__":
typer.run(main)
Info
If you hadn't seen that ...
before: it is a special single value, it is part of Python and is called "Ellipsis".
That will tell Typer that it's still a CLI option, but it doesn't have a default value, and it's required.
Tip
Again, prefer to use the Annotated
version if possible. That way your code will mean the same in standard Python and in Typer.
And test it:
// Pass the NAME CLI argument
$ python main.py Camila
// We didn't pass the now required --lastname CLI option
Usage: main.py [OPTIONS] NAME
Try "main.py --help" for help.
Error: Missing option '--lastname'.
// Now update it to pass the required --lastname CLI option
$ python main.py Camila --lastname Gutiérrez
Hello Camila Gutiérrez
// And if you check the help
$ python main.py --help
Usage: main.py [OPTIONS] NAME
Options:
--lastname TEXT [required]
--help Show this message and exit.
// It now tells you that --lastname is required 🎉