Keyword Multiple Values

In some applications, it is desirable to supply multiple values to a keyword argument. For example, lets consider an application where we want to specify multiple input files. We want our application to look like the following:

$ my-program output.bin --input input1.bin input2.bin input3.bin

In Typer, it is impossible to accomplish this. With Typer, the keyword must be specified before each value:

$ my-program output.bin --input input1.bin --input input2.bin --input input3.bin

By default, Cyclopts behavior mimics Typer, where a single element worth of CLI tokens are consumed. However, by setting Parameter.consume_multiple to True, multiple elements worth of CLI tokens will be consumed. Consider the following example program with a single output path, and multiple input paths.

from cyclopts import App, Parameter
from pathlib import Path
from typing import Annotated

app = App()

@app.default
def main(output: Path, input: Annotated[list[Path], Parameter(consume_multiple=True)]):
   print(f"{input=} {output=}")

if __name__ == "__main__":
   app()

All of the following invocations are equivalent:

$ my-program out.bin input1.bin input2.bin input3.bin
input=[PosixPath('input1.bin'), PosixPath('input2.bin'), PosixPath('input3.bin')] output=PosixPath('out.bin')

$ my-program out.bin --input input1.bin --input input2.bin --input input3.bin

$ my-program out.bin --input input1.bin input2.bin input3.bin

$ my-program --input input1.bin input2.bin input3.bin --output out.bin

$ my-program --input input1.bin input2.bin input3.bin -- output.bin

To set this configuration for your entire application, supply it to your root App.default_parameter:

from cyclopts import App, Parameter

app = App(default_parameter=Parameter(consume_multiple=True))