更新 2:来自 ArgParse 文档,
nargs='?' 的更常见用法之一 是允许可选的输入和输出文件:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('infile', nargs='?', type=argparse.FileType('r'),
... default=sys.stdin)
>>> parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'),
... default=sys.stdout)
>>> parser.parse_args(['input.txt', 'output.txt'])
Namespace(infile=<open file 'input.txt', mode 'r' at 0x...>,
outfile=<open file 'output.txt', mode 'w' at 0x...>)
>>> parser.parse_args([])
Namespace(infile=<open file '<stdin>', mode 'r' at 0x...>,
outfile=<open file '<stdout>', mode 'w' at 0x...>)
原答案:
这很简单:只需添加一个带有默认值的位置参数和一个nargs='*'
. 如果参数为零,将使用默认值,否则将使用命令行上的参数:
>>> p = argparse.ArgumentParser()
>>> p.add_argument('filename', nargs='*', default=['-'])
>>> p.parse_args([])
Namespace(filename=['-'])
>>> p.parse_args(['abc'])
Namespace(filename=['abc'])
通常,-
用来指标准输入/标准输出。
然后你做这样的事情:
def get_inputs(ns):
"""Iterate over input files."""
for path in ns.filename:
if path == '-':
yield sys.stdin
else:
yield open(path, 'r')
更新:我假设你想要多个文件名,因为cat
需要多个文件名。nargs='?'
如果您想要零个或一个文件名,您可以使用。