假设我有一个输入文件选项和一个输出文件选项。我如何创建一个将两者结合起来的选项?例如:
$ ./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)
保持简单 - 您显示的专用组代码并不排除使用这两种形式。尝试这个:
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)
解释为什么事情不起作用比提出解决方案更容易。
是的,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是测试标志是否已被使用的好方法。另一种可能性是定义默认值,这样您就不必关心用户使用哪种组合。