带有python单击库选项的可选CLI参数

带有python单击库选项的可选CLI参数,python,click,command-line-interface,Python,Click,Command Line Interface,在解析某些CLI选项时,我遇到了Python库的难题 我希望有一个选项本身充当标志,但可以选择接受字符串值。例如: $myscript⇒ 选项=False $myscript-o⇒ 选项=真 $myscript-o foobar⇒ 选项=Foobar 此外,我希望选项是“渴望”(例如,在“单击”术语中,回调后中止执行),但现在可以忽略此选项 当我这样定义参数时: @click.command() @click... @click.option("-o", "option", is_flag=T

在解析某些CLI选项时,我遇到了Python库的难题

我希望有一个选项本身充当标志,但可以选择接受字符串值。例如:

  • $myscript
    ⇒ 选项=False

  • $myscript-o
    ⇒ 选项=真

  • $myscript-o foobar
    ⇒ 选项=Foobar

  • 此外,我希望选项是“渴望”(例如,在“单击”术语中,回调后中止执行),但现在可以忽略此选项


    当我这样定义参数时:

    @click.command()
    @click...
    @click.option("-o", "option", is_flag=True, default=False)
    def myscript(..., option):
    
    @click.command()
    @click...
    @click.option("-o", "--option", default="") # Let's assume I will cast empty string to False
    def myscript(..., option):
    
    我实现了示例1和2,但是3自然是不可能的,因为标志只检测存在/不存在


    当我这样定义参数时:

    @click.command()
    @click...
    @click.option("-o", "option", is_flag=True, default=False)
    def myscript(..., option):
    
    @click.command()
    @click...
    @click.option("-o", "--option", default="") # Let's assume I will cast empty string to False
    def myscript(..., option):
    
    我实现了1和3,但2将失败并出现
    错误:-c选项需要一个参数


    这看起来不像是一个出类拔萃的场景,但我似乎无法实现这一点,也找不到这样的例子

    如何定义一个解析如下的
    @click.option

    • False
      未设置时
    • True
      设置但无值时
    • str
      设置值时

    我实现这种行为的一种方法是实际使用如下参数。我将把这篇文章作为一个解决方法发布,同时我尝试看看是否可以通过一个选项来完成,我将相应地更新我的文章

    @click.command(上下文设置={“忽略未知选项”:True})
    @参数(“选项”,nargs=-1)
    def myscript(选项):
    选项=False
    如果选项为():
    选项=False
    如果选项中的“-o”或选项中的“---option”:
    选项=真
    如果len(选项)>1:
    选项=选项[1]
    打印(可选)
    
    以后编辑 通过使用一个选项,我成功地通过向命令定义添加一个参数来实现这一点

    @click.command()
    @click.option('-o','-option',is_flag=True,default=False,is_eager=True)
    @click.argument('value',nargs=-1)
    def myscript(选项,值):
    如果选项和值!=():
    选项=值[0]
    打印(可选)
    
    如果您最多只希望跟随一个参数,则可以删除
    nargs
    ,并且可以将其视为不需要

    @click.command()
    @click.option('-o','-option',is_flag=True,default=False,is_eager=True)
    @click.argument('value',required=False)
    def myscript(选项,值=None):
    如果选项和值不是“无”:
    选项=值
    打印(可选)
    

    也可以通过组合一个上下文生成器并存储一些状态来实现,但这似乎是最不理想的解决方案,因为您将依赖上下文来存储您的状态。

    除非您的CLI只接受-o,否则我不确定您能否实现您的请求。例如,如果您的CLI是myscript-o REQUIRED_PARAM,您如何知道您提供的是-o OPTION_值还是REQUIRED_PARAM值?很遗憾,不是这样,因为状态:对于选项,只支持固定数量的参数。所以你不能同时满足(2)和(3)。另一方面,Python将通过
    nargs='*'
    解析器来支持您的需求。添加参数('-o',nargs='*')
    。谢谢!我不知道你可以在最后和选项之后添加一个参数;与
    相结合是非常渴望的
    ,这没有问题,我可以简单地检查决策树中是否设置了var。很高兴我能提供帮助!