コンテンツにスキップ

複数 CLI オプション

複数回使用できる「CLI オプション」を宣言し、すべての値を取得できます。

例えば、1 つの実行で複数のユーザーを受け入れるとします。

それには、標準 Python の typing.List を使用して strlist として宣言します。

from typing import List, Optional

import typer
from typing_extensions import Annotated


def main(user: Annotated[Optional[List[str]], typer.Option()] = None):
    if not user:
        print(f"No provided users (raw input = {user})")
        raise typer.Abort()
    for u in user:
        print(f"Processing user: {u}")


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

ヒント

可能であれば Annotated バージョンを使用することをお勧めします。

from typing import List, Optional

import typer


def main(user: Optional[List[str]] = typer.Option(None)):
    if not user:
        print(f"No provided users (raw input = {user})")
        raise typer.Abort()
    for u in user:
        print(f"Processing user: {u}")


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

宣言した strlist として定義どおりの値を受け取ります。

チェックします。

// The default value is 'None'
$ python main.py

No provided users (raw input = None)
Aborted!

// Now pass a user
$ python main.py --user Camila

Processing user: Camila

// And now try with several users
$ python main.py --user Camila --user Rick --user Morty

Processing user: Camila
Processing user: Rick
Processing user: Morty

複数の float

同様に、他の型を使用でき、Typer によって宣言された型に変換されます。

from typing import List

import typer
from typing_extensions import Annotated


def main(number: Annotated[List[float], typer.Option()] = []):
    print(f"The sum is {sum(number)}")


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

ヒント

可能であれば Annotated バージョンを使用することをお勧めします。

from typing import List

import typer


def main(number: List[float] = typer.Option([])):
    print(f"The sum is {sum(number)}")


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

チェックします。

$ python main.py

The sum is 0

// Try with some numbers
$ python main.py --number 2

The sum is 2.0

// Try with some numbers
$ python main.py --number 2 --number 3 --number 4.5

The sum is 9.5