Argparse位置参数或默认值

时间:2014-10-12 20:02:58

标签: python argparse

我想运行像myscript A B C这样的cli,它应返回命名空间(my_attribute = [' A',' B',' C' ])或myscript,如果没有指定args,则返回默认值,即命名空间(my_attribute = [' A',' B',' C' ,' D'])

这可能吗?

  • NARGS =' +'需要至少1个命令行参数或引发错误
  • NARGS =''需要1或0个参数
  • NARGS =' *'好像它应该工作,但不会产生add_argument()中指定的默认列表

我现在有以下内容。

parser.add_argument(
    dest='my_attribute',
    choices=('A', 'B', 'C', 'D'),
    nargs='*',
    default=['A', 'B', 'C', 'D'],
)

**修改

例如:这有效,但我必须在A B之前指定-attr。我不想使用-attr

parser.add_argument(
    '-attr',
    dest='my_attribute',
    choices=['A','B', 'C', 'D'],
    nargs='+',
    default=['A','B', 'C', 'D'],

2 个答案:

答案 0 :(得分:0)

为什么不nargs=4? E.g。

parser.add_argument(
    dest='my_attribute',
    choices=list(itertools.permutations(['A', 'B', 'C', 'D']))
    nargs=4,
    default=['A', 'B', 'C', 'D'],
)

请注意choces中的排列,因为您可能需要以下选项:

'A', 'B', 'C', 'D'
'A', 'D', 'C', 'B'
...
'D', 'C', 'B', 'A'

如果需要,将permutations替换为combinations

答案 1 :(得分:0)

您收到了什么错误消息?

当我尝试你的代码时,我得到了:

  

错误:参数my_attribute:无效选择:['A','B','C','D'](从'A','B','C','D'中选择)

它正在尝试使用默认值,但它正在根据您的选择测试整个事情。您希望它根本不测试默认值,或者单独测试列表的每个元素。

如果没有choices*位置确实有效。

正如我在第一个回答中所提到的,*位置需要一些特殊处理。 *可选不会。

kludge是使用default='A'。这通过了选择测试。生成的命名空间将为Namespace(my_attribute='A')。这不是预期的列表,但在解析后很容易测试和替换。

parser = argparse.ArgumentParser()
parser.add_argument(
    dest='my_attribute',
    choices=('A', 'B', 'C', 'D'),
    nargs='*',
    default='A',
)
args = parser.parse_args()

if args.my_attribute=='A':
    args.my_attribute=['A', 'B', 'C', 'D']
print args

有关此主题的错误报告(几年前):

http://bugs.python.org/issue9625 'argparse:使用选项

时变量nargs的默认值出现问题

有一个建议的补丁会对列表默认的每个项目执行'选择'测试。使用argparse应该运行您的示例。但是有大量的argparse补丁,所以我不希望很快看到这个补丁。