Enum - Choices
To define a CLI parameter that can take a value from a predefined set of values you can use a standard Python enum.Enum:
from enum import Enum
import typer
class NeuralNetwork(str, Enum):
simple = "simple"
conv = "conv"
lstm = "lstm"
def main(network: NeuralNetwork = NeuralNetwork.simple):
print(f"Training neural network of type: {network.value}")
if __name__ == "__main__":
typer.run(main)
Tip
Notice that the function parameter network will be an Enum, not a str.
To get the str value in your function's code use network.value.
Check it:
$ python main.py --help
// Notice the predefined values [simple|conv|lstm]
Usage: main.py [OPTIONS]
Options:
--network [simple|conv|lstm] [default: simple]
--help Show this message and exit.
// Try it
$ python main.py --network conv
Training neural network of type: conv
// Invalid value
$ python main.py --network capsule
Usage: main.py [OPTIONS]
Try "main.py --help" for help.
Error: Invalid value for '--network': invalid choice: capsule. (choose from simple, conv, lstm)
Case insensitive Enum choices¶
You can make an Enum (choice) CLI parameter be case-insensitive with the case_sensitive parameter:
from enum import Enum
import typer
from typing_extensions import Annotated
class NeuralNetwork(str, Enum):
simple = "simple"
conv = "conv"
lstm = "lstm"
def main(
network: Annotated[
NeuralNetwork, typer.Option(case_sensitive=False)
] = NeuralNetwork.simple
):
print(f"Training neural network of type: {network.value}")
if __name__ == "__main__":
typer.run(main)
Tip
Prefer to use the Annotated version if possible.
from enum import Enum
import typer
class NeuralNetwork(str, Enum):
simple = "simple"
conv = "conv"
lstm = "lstm"
def main(
network: NeuralNetwork = typer.Option(NeuralNetwork.simple, case_sensitive=False)
):
print(f"Training neural network of type: {network.value}")
if __name__ == "__main__":
typer.run(main)
And then the values of the Enum will be checked no matter if lower case, upper case, or a mix:
// Notice the upper case CONV
$ python main.py --network CONV
Training neural network of type: conv
// A mix also works
$ python main.py --network LsTm
Training neural network of type: lstm