有没有一种惯用的方式,使用Python Click library创建一个命令,其中一个选项取决于前一个选项设置的值?
一个具体的例子(我的用例)是一个命令将一个类型选项click.File
作为输入,但也有一个指定输入流编码的编码选项:
import click
@click.command()
@click.option("--encoding", type=str, default="utf-8")
@click.option("--input",
type=click.File("r", encoding="CAN I SET THIS DYNAMICALLY BASED ON --encoding?"))
def cli(encoding, input):
pass
我想它必须涉及使用可调用的某种延迟评估,但我不确定在当前的 Click API 下是否有可能。
我发现我可以按照以下方式做一些事情:
import click
@click.command()
@click.pass_context
@click.option("--encoding", type=str, default="utf-8")
@click.option("--input", type=str, default="-")
def cli(ctx, encoding, input):
input = click.File("r", encoding=encoding)(input, ctx=ctx)
但不知何故,将选项装饰器与适用于它的语义正确的类型约束分离,并将其str
作为虚拟对象放入其中,会让人感觉不太可读/可维护。因此,如果有办法将这两者保持在一起,请赐教。
建议的解决方法:
我想我可以使用该click.File
类型两次,使其在装饰器中变得懒惰,这样文件就不会真正打开,第一次是:
@click.option("--input", type=click.File("r", lazy=True), default="-")
这在语义上感觉更令人满意,但也是多余的。