如何从`argparse`中获取所有默认值?

时间:2017-02-08 23:39:41

标签: python argparse

我有一个像这样的参数解析器:

def args_parser():
    parser = argparse.ArgumentParser(description='myparser')
    parser.add_argument('--k', type=int, default=100, help = 'numbers')
    return parser

现在,我想做的只是获取默认映射,如下所示:

args = args_parser()

然后我希望args['k']返回100,因为那是默认值。我该如何实现这一目标?

3 个答案:

答案 0 :(得分:1)

这应该适合你。我认为您应该能够在ArgumentParser上的Python文档中找到它:

vars(args.parse_args())['k']

答案 1 :(得分:0)

您需要在解析器对象上调用.parse_args()函数,以便实际返回解析并分配给.add_argument()语句中定义的属性的命令行参数。如下所示:

parser = args_parser()
args = parser.parse_args()
k_value = args.k

.parse_args()返回的'args'变量将通过.add_argument()调用分配与您为其分配的名称相对应的属性,但如果没有默认值且用户未提供给定参数值为'无'。

答案 2 :(得分:0)

def args_parser():
    parser = argparse.ArgumentParser(description='myparser')
    parser.add_argument('--k', type=int, default=100, help = 'numbers')
    return parser

parser = args_parser():
args = parser.parse_args([])    
print(args)     # see all values
print(args.k)   # see just the k attribute

parse_args()解析命令行中提供的sys.argvparse_args([])解析一个空列表,就像你没有参数调用脚本一样。我经常使用这样的调用来测试解析器设置。

通过参数定义,[]可以正常工作并显示默认的k值。对于其他定义,[]可能会产生错误。例如,如果你包括

parser.add_argument('infile', help='positional file name')

现在需要一个字符串。对于像这样的简单位置,不需要默认值也没有意义。但其他参数组合可以使用默认值。

我可以向您展示如何访问default命令中设置的add_argument,但这涉及一些未记录的功能。此外,还有几种定义默认值的方法,因此主题可能会变得复杂。

无论如何,仅使用空列表运行parse_args通常就足够了。

您还可以在帮助热线中显示默认值,只需添加一些内容:

parser.add_argument('--k', type=int, default=100, help = 'numbers, %(default)s')

例如,在交互式ipython会话中:

In [73]: parser=argparse.ArgumentParser()
In [74]: parser.add_argument('--k', type=int, default=100, help = 'numbers, %(default)s')
Out[74]: _StoreAction(option_strings=['--k'], dest='k', nargs=None,
    const=None, default=100, type=<class 'int'>, choices=None,
    help='numbers, %(default)s', metavar=None)

In [75]: parser.print_help()
usage: ipython3 [-h] [--k K]

optional arguments:
  -h, --help  show this help message and exit
  --k K       numbers, 100

In [76]: parser.parse_args([])    # displays args
Out[76]: Namespace(k=100)
In [78]: parser.parse_args(['--k','200'])
Out[78]: Namespace(k=200)