如何在Python Click中将选项的默认值设置为另一个参数?

joo*_*ood 7 python click python-click

是否可以将选项的默认值定义为单击中的另一个参数?

我想要的是这样的:

@click.command()
@click.argument('project')
@click.option('--version', default=project)
def main(project, version):
  ...
Run Code Online (Sandbox Code Playgroud)

如果该选项--version为空,它将自动采用project的值。这样的事情可能吗?

ras*_*sar 5

您可以尝试将版本设置为“无”。如果用户设置它,它将被覆盖,但如果用户没有设置它,则将其设置为在主函数中进行投影。

@click.command()
@click.argument('project')
@click.option('--version', default=None)
def main(project, version):
    if version is None:
        version = project
    print("proj", project, "vers", version)

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

用法示例:

$ python3 clicktest.py 1
proj 1 vers 1
$ python3 clicktest.py 1 --version 2
proj 1 vers 2
Run Code Online (Sandbox Code Playgroud)

要在装饰器中执行此操作,您可以利用该callback选项,该选项接受(context, param, value)

import click

@click.command()
@click.argument('project')
@click.option('--version', default=None,
              callback=lambda c, p, v: v if v else c.params['project'])
def main(project, version):
    print("proj", project, "vers", version)


if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)