准确接受 0、1 或 2 个位置参数
Accept exactly 0, 1 or 2 positional arguments
我正在使用 argparse 包来解析命令行参数。现在我想接受 0、1 或 2 个字符串并将它们放入列表中。
我目前的做法是这样的:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('strs', nargs='*')
print(parser.parse_args([]).strs)
print(parser.parse_args(['AAA']).strs)
print(parser.parse_args(['AAA', 'BBB']).strs)
print(parser.parse_args(['AAA', 'BBB', 'CCC']).strs)
第一、第二和第三 parse_args()
结果是预期的。对于最后一个,我目前的做法是 if len(parse_args.strs) > 2: raise
。有没有更好的方法可以让 argparse 为我检查?
argparse
中没有办法接受 nargs
的范围,只能接受 1
、2
、'+'
、'*'
.
您可以编写自定义 Action
class 来检查 nargs='*'
传递给它的值的数量。但我认为在解析后执行该测试同样容易。
我可以找到一个 bug/issue 探索添加一个范围 nargs
选项,如果你真的想进入那个。
如果您没有其他位置,您可以定义 3 个位置,其中 2 个带有 ?
。您甚至可以将它们组合成一个具有共同名称和 'append' 操作的列表。我会探讨一下。
In [573]: p=argparse.ArgumentParser()
In [574]: p.add_argument('str',action='append')
In [575]: p.add_argument('str',nargs='?',action='append')
In [576]: p.add_argument('str',nargs='?',action='append')
In [577]: p.print_help()
usage: ipython3 [-h] str [str] [str]
positional arguments:
str
str
str
optional arguments:
-h, --help show this help message and exit
In [578]: p.parse_args('1 2 3'.split())
Out[578]: Namespace(str=['1', '2', '3'])
In [579]: p.parse_args('1 3'.split())
Out[579]: Namespace(str=['1', '3', None])
In [580]: p.parse_args('1'.split())
Out[580]: Namespace(str=['1', None, None])
获得 default
个无。我可以用
更正
p.add_argument('str', nargs='?', action='append', default=argparse.SUPPRESS)
In [586]: p.parse_args('1 2'.split())
Out[586]: Namespace(str=['1', '2'])
In [588]: p.parse_args('1 2 3 4'.split())
usage: ipython3 [-h] str [str] [str]
ipython3: error: unrecognized arguments: 4
(哎呀,这是为 1-3 个参数编码的,但你明白了)。
我正在使用 argparse 包来解析命令行参数。现在我想接受 0、1 或 2 个字符串并将它们放入列表中。
我目前的做法是这样的:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('strs', nargs='*')
print(parser.parse_args([]).strs)
print(parser.parse_args(['AAA']).strs)
print(parser.parse_args(['AAA', 'BBB']).strs)
print(parser.parse_args(['AAA', 'BBB', 'CCC']).strs)
第一、第二和第三 parse_args()
结果是预期的。对于最后一个,我目前的做法是 if len(parse_args.strs) > 2: raise
。有没有更好的方法可以让 argparse 为我检查?
argparse
中没有办法接受 nargs
的范围,只能接受 1
、2
、'+'
、'*'
.
您可以编写自定义 Action
class 来检查 nargs='*'
传递给它的值的数量。但我认为在解析后执行该测试同样容易。
我可以找到一个 bug/issue 探索添加一个范围 nargs
选项,如果你真的想进入那个。
如果您没有其他位置,您可以定义 3 个位置,其中 2 个带有 ?
。您甚至可以将它们组合成一个具有共同名称和 'append' 操作的列表。我会探讨一下。
In [573]: p=argparse.ArgumentParser()
In [574]: p.add_argument('str',action='append')
In [575]: p.add_argument('str',nargs='?',action='append')
In [576]: p.add_argument('str',nargs='?',action='append')
In [577]: p.print_help()
usage: ipython3 [-h] str [str] [str]
positional arguments:
str
str
str
optional arguments:
-h, --help show this help message and exit
In [578]: p.parse_args('1 2 3'.split())
Out[578]: Namespace(str=['1', '2', '3'])
In [579]: p.parse_args('1 3'.split())
Out[579]: Namespace(str=['1', '3', None])
In [580]: p.parse_args('1'.split())
Out[580]: Namespace(str=['1', None, None])
获得 default
个无。我可以用
p.add_argument('str', nargs='?', action='append', default=argparse.SUPPRESS)
In [586]: p.parse_args('1 2'.split())
Out[586]: Namespace(str=['1', '2'])
In [588]: p.parse_args('1 2 3 4'.split())
usage: ipython3 [-h] str [str] [str]
ipython3: error: unrecognized arguments: 4
(哎呀,这是为 1-3 个参数编码的,但你明白了)。