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