用于组合其他选项的 Argparse 快捷方式选项

Argparse shortcut option for combining other options

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

$ ./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,但 [=23= 的帮助文本] 和 -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

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

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

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

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

 args.in_file=args.out_file = args.io

解析后修改 args 值没有错。

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

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

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

如果您仍想使用 -i-o--io(我更喜欢 -- 作为 2 个字符的标志)我可以提出一些建议:

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

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