Pythons argparse默认值不起作用

时间:2017-03-21 13:22:01

标签: python argparse

我正在使用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)

奇怪的是,这也不起作用。它至少需要一个参数......

任何人都明白这一点?

4 个答案:

答案 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组合这两种方法。