【问题标题】:Argparse shortcut option for combining other options用于组合其他选项的 Argparse 快捷方式选项
【发布时间】:2021-04-16 19:59:43
【问题描述】:

假设我有一个输入文件选项和一个输出文件选项。如何创建结合两者的选项?例如:

$ ./my_script.py -i input.txt -o output.txt

可以合并为:

$ ./my_script.py --io input_output.txt

你可能会说我可以使用-io 来组合这两个选项,但-io filename-i -o filename 的快捷方式,而不是-i filename -o filename

我认为可以将dest=('input', 'output') 添加到我的.add_argument() 调用中,但这引发了dest 必须是字符串的错误。

我尝试添加一个互斥组,一侧为--io,另一侧为一组-i-o,但-i-o 的帮助文本没有显示更多当程序使用--help 运行时:

usage: myscript.py [-h] [--io] [-i INPUT] [-o OUTPUT]

optional arguments:
  -h, --help  show this help message and exit
  --io        Use file as both input and output

此外,互斥部分似乎不起作用。我仍然可以使用--io 和单独的-i-o 选项调用脚本,并且不会引发错误。

这是我的骨架代码:

import argparse

parser = argparse.ArgumentParser()

parser.add_argument("-i", "--input", help="Input file")
parser.add_argument("-o", "--output", help="Output file")

parser.parse_args()

带有组的代码:

import argparse

parser = argparse.ArgumentParser()

exclusive = parser.add_mutually_exclusive_group()
exclusive.add_argument("--io", help="Input and Output")

sub = exclusive.add_argument_group()
sub.add_argument("-i", "--input", help="Input file")
sub.add_argument("-o", "--output", help="Output file")

args = parser.parse_args()

if args.io:
    in_file = out_file = args.io
else:
    in_file = args.input
    out_file = args.output

【问题讨论】:

    标签: python argparse


    【解决方案1】:

    保持简单 - 您显示的独占组代码并没有排除使用这两种形式。试试这个:

    import argparse
    
    parser = argparse.ArgumentParser()
    
    parser.add_argument("-i", "--input", help="Input file")
    parser.add_argument("-o", "--output", help="Output file")
    parser.add_argument("--io", help="Input and Output")
    
    args = parser.parse_args()
    
    if args.io:
        assert args.input is None and args.output is None
        args.input = args.output = args.io
    else:
        assert args.input and args.output
    

    【讨论】:

    • 太糟糕了,没有更简单的东西。我决定使用与此类似的东西,除了我使用的东西比AssertionError 更易于使用。
    【解决方案2】:

    解释为什么事情不起作用比提出解决方案更容易。

    是的,dest 必须是字符串;没有提供dest 值的列表或元组。但是您的in_file = out_file = args.io 可以很好地解决这个问题。您也可以使用:

     args.in_file=args.out_file = args.io
    

    解析后按摩args的值没有问题。

    argument_group 不是为嵌套设计的,也不是向mutually_exclusive_group 添加“任何”(或“和”)逻辑的方法。也许在遥远的将来会有一种定义一整套逻辑组合的方法,但不是现在。其实做测试并不难;很难定义 API 和使用格式。

    还请记住,mutually_exclusive_group 用于格式化参数的用法和测试共同出现,而argument_group 用于对参数帮助行进行分组。两种截然不同的目的。

    如果-istore_true 参数,那么-io filename 将被理解为-i -o filename。但也翻译它-i filename -o filename 不在当前代码中(并且可能不够普遍,不足以保证补丁)。

    如果您仍想使用 -i-o--io(我更喜欢 -- 用于 2 个字符标志),我可以提出几点建议:

    • 编写一个自定义用法来演示您想要什么。如果很难写出清晰的用法,那么你的设计可能太复杂了。

    • 解析后进行自己的exclusive groups 测试。 args.in_file is None 是测试标志是否被使用的好方法。另一种可能性是定义默认值,这样您就不必关心用户使用哪种组合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 2019-04-25
      • 2012-11-15
      • 1970-01-01
      • 2021-12-13
      • 2014-08-18
      相关资源
      最近更新 更多