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

zon*_*ndo 5 python argparse

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

$ ./my_script.py -i input.txt -o output.txt
Run Code Online (Sandbox Code Playgroud)

可以组合为:

$ ./my_script.py --io input_output.txt
Run Code Online (Sandbox Code Playgroud)

您可能会说我可以将这-io两个选项结合起来,但-io filename是 的快捷方式-i -o filename,而不是-i filename -o filename

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

--io我尝试在一侧添加一个互斥组 ,在另一侧添加一组-i和,但是当程序运行时,和 的帮助文本不再显示:-o-i-o--help

$ ./my_script.py -i input.txt -o output.txt
Run Code Online (Sandbox Code Playgroud)

而且,相互排斥的部分似乎不起作用。--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()
Run Code Online (Sandbox Code Playgroud)

带组的代码:

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
Run Code Online (Sandbox Code Playgroud)

Joh*_*nck 5

保持简单 - 您显示的专用组代码并不排除使用这两种形式。尝试这个:

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
Run Code Online (Sandbox Code Playgroud)


hpa*_*ulj 2

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

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

 args.in_file=args.out_file = args.io
Run Code Online (Sandbox Code Playgroud)

解析后修改值没有任何问题args

argument_group不是为嵌套而设计的,也不是向mutually_exclusive_group. 也许在遥远的将来会有一种方法来定义一整套逻辑组合,但不是现在。其实做这些测试并不难;定义 API 和使用格式很困难。

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

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

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

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

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