Python 如何将可选位置参数与nargs='*';argparse中的参数?

Python 如何将可选位置参数与nargs='*';argparse中的参数?,python,parsing,argparse,optparse,optional-arguments,Python,Parsing,Argparse,Optparse,Optional Arguments,如下面的代码所示,我想要一个可选的位置参数files,我想要为它指定一个默认值,当传入路径时,使用指定的路径 但是由于--bar可以有多个参数,传入的路径没有进入args.files,如何修复?谢谢 import argparse parser = argparse.ArgumentParser() parser.add_argument('--foo') parser.add_argument('--bar', nargs='*') parser.add_argument('files', n

如下面的代码所示,我想要一个可选的位置参数
files
,我想要为它指定一个默认值,当传入路径时,使用指定的路径

但是由于
--bar
可以有多个参数,传入的路径没有进入
args.files
,如何修复?谢谢

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo')
parser.add_argument('--bar', nargs='*')
parser.add_argument('files', nargs='?')

cmd = '--foo a --bar b c d '
print parser.parse_args(cmd.split())
# Namespace(bar=['b', 'c', 'd'], files=None, foo='a')


cmd = '--foo a --bar b c d /path/to/file1'
print parser.parse_args(cmd.split())
# Namespace(bar=['b', 'c', 'd', '/path/to/file1'], files=None, foo='a')

您的参数规范本质上是不明确的(因为
--bar
可以接受无限个参数,所以没有很好的方法来判断它何时结束,特别是因为
文件
是可选的),所以需要用户消歧。具体地说,
argparse
可以通过将
--
放在仅位置部分之前来告知“这是开关部分的结束,所有后续参数都是位置的”。如果您这样做:

cmd = '--foo a --bar b c d -- /path/to/file1'
print parser.parse_args(cmd.split())
你应该得到:

Namespace(bar=['b', 'c', 'd'], files='/path/to/file1', foo='a')
(在Py3上测试,但也应适用于Py2)

或者,用户可以通过避免在
--bar
之后放置位置参数,将位置参数传递到任何明确的位置,例如:

cmd = '/path/to/file1 --foo a --bar b c d'

最后,您可以避免使用
nargs='*'
作为开关,因为它引入了模糊性。相反,将
--bar
定义为使用每个开关的单个值多次接受,将所有使用累积到
列表中

parser.add_argument('--bar', action='append')
然后多次传递
--bar
以一次一个地提供多个值,而不是一次传递多个值:

cmd = '--foo a --bar b --bar c --bar d /path/to/file1'

argparse
怎么知道
/path/to/file1
文件一起,而不是与
条一起?
cmd = '--foo a --bar b --bar c --bar d /path/to/file1'