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

How to set default value of option to another argument in Python Click?

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

我想要的是这样的:

@click.command()
@click.argument('project')
@click.option('--version', default=project)
def main(project, version):
  ...

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

您可以尝试将版本设置为 None。如果用户设置它,它将被覆盖,但如果他们不设置它,您将其设置到主函数中的项目。

@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()

用法示例:

$ python3 clicktest.py 1
proj 1 vers 1
$ python3 clicktest.py 1 --version 2
proj 1 vers 2

要在装饰器中执行此操作,您可以利用 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()