【问题标题】:Docopt - Multiple values for an optional argumentDocopt - 可选参数的多个值
【发布时间】:2022-02-05 20:31:02
【问题描述】:

我想用docopt 解析具有多个值的可选参数。下面是示例用法。

my_program.py --loc pcg acc
# or anything that achieve similar result

解析后,我希望有一个像这样的python列表

arguments["--loc"] = ["pcg", "acc"]

我四处浏览并通过传递nargs 参数发现这在argparse 中是否可行。

我在docopt 中找不到任何类似的方法,这在docopt 中可行吗?如果没有,还有什么办法?

我能想到的另一种方法是要求用户指定用逗号分隔的值并在解析过程中手动拆分它,如下所示。

my_program.py [--loc=<comma_separated_str>]

python 代码中

locs = arguments["--loc"].split(",") if arguments["--loc"] else []

但是,这看起来很难看,所以我正在寻找一种合适的方法来使用docopt

【问题讨论】:

    标签: python python-3.x docopt


    【解决方案1】:

    一种方法是使用省略号 (...) 运算符,以便一个选项可以使用方括号重复零次或多次,或者使用括号重复一次或多次。例如

    """Usage: my_program.py --help
           my_program.py [--loc=<loc>]...
    """
    
    from docopt import docopt
    print(docopt(__doc__))
    

    会给出以下输出

    $ python my_program.py --loc=pcg --loc=acc
    {'--help': False,
     '--loc': ['pcg', 'acc']}
    

    【讨论】:

      【解决方案2】:

      您正在寻找的定义可能是

      """
      Usage: my_program.py --help
         my_program.py [(--loc <loc>) [<loc>...]]
      """
      
      from docopt import docopt
      print(docopt(__doc__))
      

      多个--loc 值之间有空格

      python3 my_program.py --loc pcg acc hah
      {'--help': False,
       '--loc': True,
       '<loc>': ['pcg', 'acc', 'hah']}
      

      --loc 参数确实是可选的

      $ python3 my_program.py
      {'--help': False,
       '--loc': False,
       '<loc>': []}
      

      不为--loc 提供值会导致错误

      $ python3 my_program.py --loc
      Usage: my_program.py --help
             my_program.py [(--loc <loc>) [<loc>...]]
      

      如果--loc 可以在没有任何值的情况下使用,这个更简单的定义就可以了

      """
      Usage: my_program.py --help
             my_program.py [--loc <loc> ...]
      """
      
      from docopt import docopt
      print(docopt(__doc__))
      

      导致

      $ python3 my_program.py --loc
      {'--help': False,
       '--loc': True,
       '<loc>': []}
      

      其他方面等价于第一个定义

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-01
        • 2023-03-08
        • 1970-01-01
        相关资源
        最近更新 更多