我正在使用Python 3.6的argparse库。 我使用可选参数来收集程序参数。 对于其中一些参数,我有合理的默认值,因此我将解析器配置为该参数的默认值。
In [2]: import argparse
...: import shlex
...:
...: parser = argparse.ArgumentParser()
...: parser.add_argument('-s', '--samples', action='store', nargs='+', type=int, required=True,
...: help='number of samples')
...: parser.add_argument('-r', '--regions', action='append', nargs='+', type=str, default=['all'],
...: help='one or more region names. default to [\'all\']')
当未指定-r/--regions参数时,我希望看到配置的默认值(实际确实如此)。
In [3]: s = '-s 37'
...: parser.parse_args(shlex.split(s))
Out[3]: Namespace(regions=['all'], samples=[37])
当指定-r / --regions参数时,我期望只看到我提供给参数的值,但默认值也会显示出来。
In [5]: s = '-s 37 -r foo'
...: parser.parse_args(shlex.split(s))
Out[5]: Namespace(regions=['all', ['foo']], samples=[37])
这不是我预期的结果。我希望只有在没有提供可选参数时才会出现默认值。我查看了argparse代码并没有找到默认值被包含在哪里。根据注释,似乎逻辑是在处理实际提供的参数值之前将默认值添加到结果命名空间中之后。我原本希望反过来(即仅在到达args结尾并且没有看到具有默认值的参数时才应用默认值)。
是否有人能够解释一下这个问题?我是否错误地使用或理解了可选参数的默认选项的目的?是否有办法实现我想要的行为(即如果未提供可选值,则在命名空间中使用默认值)?