Python 单击以重新启动命令并清除所有参数

Python click to restart a command with all parameters cleared

我下面的脚本保存在'bike.py'中并注册为bikeshell命令。我想要 运行 一个简单的 bike filter -c chicago -m 1 -d 1 命令来探索 chicago 作为城市、1 作为月份和 1 作为星期几的数据。我使用 prompt=True 来捕获命令中未指定的任何选项。

我还希望能够在最后重新启动命令并清除所有现有参数,这样命令会提示我输入 citymonthday of week 在重启时。但是,代码无法做到这一点。它只是 运行 脚本中的内容并给我错误,因为脚本不能 运行 没有传入的参数。

我应该如何使用点击来执行此操作?

@click.group()
@click.pass_context
def main():
    ctx.ensure_object(dict)


@main.command()
@click.option('-city', '-c', prompt=True)
@click.option('-month', '-m', prompt=True)
@click.option('-day_of_week', '-d', prompt=True)
@click.pass_context
def filter(ctx, city, month, day_of_week):
    # load filtered data
    ...

    # restart the program
    if click.confirm('Restart to explore another dataset?') if not False:
        import sys
        sys.argv.clear()
        ctx.invoke(filter)

您可以更改过滤器命令,以便手动进行提示。我不认为 Click 会知道以其他方式提示,因为这不是常见的用例并且不符合 no-magic 点击样式指南。

@main.command()
@click.option('-city', '-c')
@click.option('-month', '-m')
@click.option('-day_of_week', '-d')
@click.pass_context
def filter(ctx, city, month, day_of_week):
    # prompt if not passed in
    if city is None:
        city = click.prompt('City: ')
    if month is None:
        month = click.prompt('Month: ')
    if day_of_week is None:
        day_of_week = click.prompt('Day of the week: ')

    # load filtered data
    ...

    # restart the program
    if click.confirm('Restart to explore another dataset?'):
        ctx.invoke(filter)

或者,如果您真的想依赖内置功能,您可以通过覆盖 Option class 和提示功能来获得一些好处。