Positional or Keyword Arguments

A limitation of Typer is that a parameter cannot be both positional and keyword.

For example, lets say we want to implement a mv-like program that takes in a source path, and a destination path:

typer_app = typer.Typer()


@typer_app.command()
def mv(src, dst):
    print(f"Moving {src} -> {dst}")


typer_app(["foo", "bar"], standalone_mode=False)
# Moving foo -> bar

The code works when supplying the inputs as positional arguments, but fails when trying to specify them as keywords.

print("Typer keyword:")
typer_app(["--src", "foo", "--dst", "bar"], standalone_mode=False)
# No such option: --src

Cyclopts handles both situations:

cyclopts_app = cyclopts.App()


@cyclopts_app.default()
def mv(src, dst):
    print(f"Moving {src} -> {dst}")


cyclopts_app(["foo", "bar"])
# Moving foo -> bar
cyclopts_app(["--src", "foo", "--dst", "bar"])
# Moving foo -> bar