Leevi L
Leevi L

Reputation: 1789

Click tools with optional arguments

I want to write a CLI hello that takes a FILENAME as an argument except when the option -s STRING is given, in which case the STRING is processed directly. The program should print hello {NAME} where name is either given via the STRING or taken to be the contents of the file FILENAME.

example:

$ cat myname.txt
john

$ hello myname.txt
hello john

$ hello -s paul
hello paul

A possible workaround is to use two options:

@click.command()
@click.option("-f", "--filename", type=str)
@click.option("-s", "--string", type=str)
def main(filename: str, string: str):
    if filename:
        ...
    if string:
        ....

but that means that I must call hello with a flag.

Upvotes: 2

Views: 2033

Answers (1)

Stephen Rauch
Stephen Rauch

Reputation: 49794

You can use a Click argument and make it not required like:

import click
@click.command()
@click.argument('filename', required=False)
@click.option("-s", "--string")
def main(filename, string):
    if None not in (filename, string):
        raise click.ClickException('filename argument and option string are mutually exclusive!')
    click.echo(f'Filename: {filename}')
    click.echo(f'String: {string}')

Upvotes: 4

Related Questions