必須CLIオプション

前に述べたように、*デフォルトでは*

  • CLIオプション任意です
  • CLI引数必須です

多くのCLIプログラムやシステムでは、*デフォルト*でこのように動作し、これが慣例です。

しかし、どうしても変更したい場合は可能です。

CLIオプションを必須にするには、Annotatedの中にtyper.Option()を配置し、パラメータにデフォルト値を指定しません。

--lastnameを必須のCLIオプションにしましょう

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)

typer.Argument()と同様に、関数パラメータのデフォルト値を使用する従来の方法もサポートされています。その場合は、defaultパラメータに何も渡しません。

import typer


def main(name: str, lastname: str = typer.Option()):
    print(f"Hello {name} {lastname}")


if __name__ == "__main__":
    typer.run(main)

または、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)

情報

もし...を今まで見たことがないなら、それは特別な単一の値であり、Pythonの一部であり、「Ellipsis」と呼ばれています

これにより、TyperはそれがCLIオプションであることを認識しますが、デフォルト値を持たず、必須になります。

ヒント

可能であれば、Annotatedバージョンを使用することをお勧めします。そうすることで、標準PythonとTyperでコードの意味が同じになります。

そしてテストしましょう

// 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 🎉