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'