【发布时间】:2022-08-17 11:43:38
【问题描述】:
我想要做什么
我希望能够拥有一个 Python 类,它包含可以在整个 CLI 中使用和更新的全局配置。例如,如果类的属性被另一个单击命令更改,它将可用于下一个使用上下文的命令。
我试过的
我尝试使用pass_context 和pass_obj 的组合来实例化并在我的各种命令之间传递上下文。
最小的例子
下面是一段代码 sn-p(不是实际代码,而是代表概念)。 Dog 类有一个属性 name,我希望能够使用其他单击命令对其进行更新。在这种情况下,get 可以获得name 属性,set 将更新类的name 属性,以便将来的get 命令将获得新名称。
import click
class Dog:
def __init__(self, name=\"Jack\"):
self.name = name
@click.group()
@click.pass_context
def cli(ctx):
ctx.obj = Dog()
@cli.command(\"set\")
@click.argument(\"name\")
@click.pass_context
def set(ctx, name):
ctx.obj.name = name
print(f\'The dogs name changed to {ctx.obj.name}\')
@cli.command(\"get\")
@click.pass_context
def get(ctx):
print(ctx.obj.name)
预期行为Dog() 类在 CLI 首次运行时被实例化,然后后续命令可以更新属性。例如:
cli get 将返回 Jack,因为这是类中指定的默认值。cli set Jill 会将Dog 类的name 属性设置为Jill。
然后cli get 将返回Jill,因为name 属性已使用set 命令更新。
实际行为
上述步骤导致最终的cli get 命令返回Jack,就好像每个命令都在实例化类一样。
标签: python command-line-interface