这个问题已经有很多被高度认可的答案和一个被接受的答案,但是到目前为止,所有这些都被表达布尔问题的各种方法分散了注意力,并且错过了关键点:
我有一个可以接收零或三个命令行参数的python脚本。(要么以默认行为运行,要么需要指定所有三个值)
首先,此逻辑不应由您的代码负责,而应由argparse
模块处理。不用费心编写复杂的if语句,而喜欢设置参数解析器,如下所示:
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser()
parser.add_argument('--foo', nargs=3, default=['x', 'y', 'z'])
args = parser.parse_args()
print(args.foo)
是的,它应该是一个选项而不是位置参数,因为它毕竟是optional。
编辑: 为了解决LarsH在注释中的问题,下面是一个示例示例,如果您确定要使用3个或0个位置 args的接口,可以如何编写它。我认为以前的接口是更好的样式,因为可选参数应该是 options,但是出于完整性考虑,这是一种替代方法。usage
在创建解析器时,请注意最重要的kwarg,argparse
否则会自动生成误导性的使用消息!
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser(usage='%(prog)s [-h] [a b c]\n')
parser.add_argument('abc', nargs='*', help='specify 3 or 0 items', default=['x', 'y', 'z'])
args = parser.parse_args()
if len(args.abc) != 3:
parser.error('expected 3 arguments')
print(args.abc)
以下是一些用法示例:
# default case
wim@wim-zenbook:/tmp$ ./three_or_none.py
['x', 'y', 'z']
# explicit case
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2 3
['1', '2', '3']
# example failure mode
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2
usage: three_or_none.py [-h] [a b c]
three_or_none.py: error: expected 3 arguments