We can also use the same typer.Argument()
to set a default value.
That way the CLI argument will be optional and also have a default value.
An optional CLI argument with a default
We can also use typer.Argument()
to make a CLI argument have a default value other than None
:
=== "Python 3.6+"
```Python hl_lines="5"
{!> ../docs_src/arguments/default/tutorial001_an.py!}
```
=== "Python 3.6+ non-Annotated"
!!! tip
Prefer to use the `Annotated` version if possible.
```Python hl_lines="4"
{!> ../docs_src/arguments/default/tutorial001.py!}
```
!!! tip
Because now the value will be a str
passed by the user or the default value of "Wade Wilson"
which is also a str
, we know the value will never be None
, so we don't have to (and shouldn't) use Optional[str]
.
Have in mind that the `Optional[something]` tells Python that a value "could be `None`". But the use of `Optional` doesn't affect Typer in any way, e.g. it doesn't tell Typer if a value is required or not.
Check it:
// Check the help
$ python main.py --help
// Notice the [default: Wade Wilson] ✨
Usage: main.py [OPTIONS] [NAME]
Arguments:
[NAME] [default: Wade Wilson]
Options:
--install-completion Install completion for the current shell.
--show-completion Show completion for the current shell, to copy it or customize the installation.
--help Show this message and exit.
// With no optional CLI argument
$ python main.py
Hello Wade Wilson
// With one CLI argument
$ python main.py Camila
Hello Camila
Dynamic default value
And we can even make the default value be dynamically generated by passing a function as the default_factory
argument:
=== "Python 3.6+"
```Python hl_lines="7-8 11"
{!> ../docs_src/arguments/default/tutorial002_an.py!}
```
=== "Python 3.6+ non-Annotated"
!!! tip
Prefer to use the `Annotated` version if possible.
```Python hl_lines="6-7 10"
{!> ../docs_src/arguments/default/tutorial002.py!}
```
In this case, we created the function get_name
that will just return a random str
each time.
And we pass it as the first function argument to typer.Argument()
.
!!! tip
The word "factory" in default_factory
is just a fancy way of saying "function that will create the default value".
Check it:
// Check the help
$ python main.py --help
Usage: main.py [OPTIONS] [NAME]
Arguments:
[NAME] [default: (dynamic)]
Options:
--install-completion Install completion for the current shell.
--show-completion Show completion for the current shell, to copy it or customize the installation.
--help Show this message and exit.
// Try it several times, it will use a random default each time
$ python main.py
Hello Deadpool
$ python main.py
Hello Hiro
$ python main.py
Hello Rick
// Now pass a value for the CLI argument
$ python main.py Camila
Hello Camila