我正在使用python 2.7.13。
我的目标是有三个可能的参数,如果用户没有给出参数,则设置默认值:
parser.add_argument("-r", nargs=3, default=(0, 1000, 50), type=int, help="Useful help text")
这对我不起作用,如果可以以上述方式使用默认值,我无法找到任何地方。
当它以program.py -r
运行时,我收到一个错误:预期的3个参数
但我也尝试完全删除nargs,只有一个默认值:
parser.add_argument("-r", default=100)
奇怪的是,这也不起作用。它至少需要一个参数......
任何人都明白这一点?
答案 0 :(得分:3)
我将在default
(使用Ipython交互式会话)中说明argparse
的正常行为
In [32]: parser = argparse.ArgumentParser()
定义3个动作:
In [33]: parser.add_argument('-r', nargs=3, type=int, default=(1,2,3));
In [35]: parser.add_argument('-f', default='DEFAULT');
In [37]: parser.add_argument('-g', nargs='?', default='DEFAULT', const='const');
help
。请注意,所有操作都有[],表示它们是可选的:
In [39]: parser.print_help()
usage: ipython3 [-h] [-r R R R] [-f F] [-g [G]]
optional arguments:
-h, --help show this help message and exit
-r R R R
-f F
-g [G]
如果在没有任何争论的情况下调用,则所有默认值都会显示在args
命名空间中。
In [40]: parser.parse_args([]) # e.g python myprog.py
Out[40]: Namespace(f='DEFAULT', g='DEFAULT', r=(1, 2, 3))
给-r
3个数字(由nargs指定)
In [41]: parser.parse_args('-r 4 5 6'.split())
Out[41]: Namespace(f='DEFAULT', g='DEFAULT', r=[4, 5, 6])
指定其他标志之一。请注意剩余的默认值
In [42]: parser.parse_args('-f other'.split())
Out[42]: Namespace(f='other', g='DEFAULT', r=(1, 2, 3))
带有-g
的 nargs='?'
还有另一种选择。它可以不带参数给出。在这种情况下,它获得const
值。
In [43]: parser.parse_args('-f other -g'.split())
Out[43]: Namespace(f='other', g='const', r=(1, 2, 3))
In [44]: parser.parse_args('-f other -g more'.split())
Out[44]: Namespace(f='other', g='more', r=(1, 2, 3))
nargs=3
没有这样的3方式选项。您要么提供3个值,要么不使用-r
。如果你需要区分1)no-r标志,2)没有参数的r标志,以及3)带3个参数的r flat,我建议将功能分成2个动作,一个是' store_true&#39 ;和其他取3个值。
argparse
中的默认值可能是一个复杂的问题,有各种设置方法,字符串和非字符串值之间的差异,甚至是一种抑制它们的方法。但我已经展示了基本行为。
答案 1 :(得分:1)
如果您没有使用默认值,则只需要调用参数-r。如果你进行了调用,那么你还必须传递一个值(或者你在nargs中定义的值)。
尝试调用program.py
答案 2 :(得分:0)
为什么不使用import sys
def main(first=1, second=2, third=3):
print first,second,third
if __name__ == '__main__':
main(*sys.argv[1:]) # notice the * before sys.argv[1:]
?
示例:
python myprogram.py # will print 1 2 3
python myprogram.py 7 # will print 7 2 3
python myprogram.py 7 8 # will print 7 8 3
python myprogram.py 7 8 9 # will print 7 8 9
您可以使用不同数量的参数测试从控制台执行文件:
{{1}}
答案 3 :(得分:0)
使用您的示例,您可以调用不带-r
标志的应用程序,这将导致默认值。如果你想自己指定这些值,你必须全部给它们。
如果您想独立输入,可以尝试这样的事情:
# script.py
import argparse
def main1():
parser = argparse.ArgumentParser()
parser.add_argument("-r", nargs=3, default=(0, 1000, 50), type=int,
help="Useful help text")
args = parser.parse_args()
print(args)
def main2():
parser = argparse.ArgumentParser()
parser.add_argument("-r1", type=int, default=0, help="...")
parser.add_argument("-r2", type=int, default=1000, help="...")
parser.add_argument("-r3", type=int, default=50, help="...")
args = parser.parse_args()
print(args)
if __name__ == "__main__":
main1()
#main2()
你可以这样调用你的实现(main1
):
$ python script.py
Namespace(r=(0, 1000, 50))
$ python script.py -r 1 2 3
Namespace(r=[1, 2, 3])
$ python script.py -r 1
usage: args.py [-h] [-r R R R]
args.py: error: argument -r: expected 3 arguments
使用单独的参数,您的调用可能如下所示(main2
):
$ python script.py -r1 1 -r2 2 -r3 3
Namespace(r1=1, r2=2, r3=3)
$ python script.py -r1 1
Namespace(r1=1, r2=1000, r3=50)
$ python script.py -r2 2
Namespace(r1=0, r2=2, r3=50)
$ python script.py -r3 3
Namespace(r1=0, r2=1000, r3=3)
如果您想要更改所有值,这可能会更加冗长,但它会为您提供更多灵活性。我认为您甚至可以使用mutually_exclusive_group组合这两种方法。