单击带有可选参数的工具

Click tools with optional arguments

我想编写一个 CLI hello,它将 FILENAME 作为参数,除非给出选项 -s STRING,在这种情况下会直接处理 STRING。该程序应打印 hello {NAME},其中 name 是通过 STRING 给出的,或者是文件 FILENAME 的内容。

例子:

$ cat myname.txt
john

$ hello myname.txt
hello john

$ hello -s paul
hello paul

一个可能的解决方法是使用两个选项:

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

但这意味着我必须用标志调用 hello

您可以使用点击 argument 并使其不再需要,例如:

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}')