假设我有一个名为的简单程序readfile.py
,它通过使用 Python 的argparse
.
程序从位置参数指定的文件中读取input
。如果没有指定额外的参数,这个程序不是很令人兴奋。它只是读取input
并退出。可选参数--output [OUTPUT_FILE]
表示应将输入文件写入文件。OUTPUT_FILE
也是可选的。如果未指定,则应将输入写入default.out
.
我像这样设置我的参数解析器:
parser = argparse.ArgumentParser(description='Read from a file')
parser.add_argument(
'input',
help='file to read from')
parser.add_argument(
'--output',
nargs='?',
const='default.out',
default=None,
help="""write file to %(metavar)s. If %(metavar)s isn't
specified, write file to %(const)s.""",
metavar='OUTPUT_FILE')
args = parser.parse_args()
return args.file, args.output_file
注意我使用default=None
这样如果--ouput
没有出现在命令行上,我可以用 None 检测它的缺失。
它给出了这样的使用签名:
usage: readfile.py [-h] [--output [OUTPUT_FILE]] input
如果我运行,这将按预期处理参数
python readfile.py input.in --output somefile.out
或者
python readfile.py --output somefile.out input
如果我跑步,它会设置output
为default.out
python readfile.py input.in --output
但如果我跑
python readfile.py --output input.in
它抱怨争论太少。我认为 argparse 足够“聪明”来解释这种模式,设置input
为input.in
和output
to default.out
。生成的用法甚至暗示了这一点。
我错过了什么吗?