用于组合其他选项的 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
是测试标志是否已被使用的好方法。另一种可能性是定义默认值,以便您不关心用户使用哪种组合。
假设我有一个输入文件选项和一个输出文件选项。我怎样才能创建一个结合两者的选项?例如:
$ ./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
是测试标志是否已被使用的好方法。另一种可能性是定义默认值,以便您不关心用户使用哪种组合。