Python:argparse switch默认为True否则消耗所有参数

时间:2017-12-20 16:01:43

标签: python argparse

我想要一个执行以下操作的开关:

  1. 默认为False
  2. 如果开关没有附加参数,则设置为True
  3. 将任意数量的其他参数收集到列表中
  4. 我可以使用nargs='?'而不是3来执行1和2:

    group.add_argument('--my_switch', nargs='?', dest='myswitch', default=False, const=True)
    print(args.myswitch)
    
    >python myscript.py 
    >False
    >python myscript.py --my_switch
    >True
    >python myscript.py --my_switch foo
    >foo
    >python myscript.py --my_switch foo bar
    >error: unrecognized arguments: bar
    

    我可以使用nargs='+'而不是2:

    执行1和3
    group.add_argument('--my_switch', nargs='+', dest='myswitch', default=False)
    print(args.myswitch)
    
    >python myscript.py 
    >False
    >python myscript.py --my_switch
    >argument --my_switch: expected at least one argument
    >python myscript.py --my_switch foo
    >['foo']
    >python myscript.py --my_switch foo bar
    >['foo', 'bar']
    

    我可以用nargs='*'完成1和3但差不多2:

    group.add_argument('--my_switch', nargs='+', dest='myswitch', default=False)
    print(args.myswitch)
    
    >python myscript.py 
    >False
    >python myscript.py --my_switch
    >[]
    >python myscript.py --my_switch foo
    >['foo']
    >python myscript.py --my_switch foo bar
    >['foo', 'bar']
    

    argparse是否提供了解决方案?我无法const+使用*

    一种解决方法是使用nargs='*'并设置

    if isinstance(args.myswitch, list) and len(args.myswitch) == 0: 
        args.myswitch = True
    

    但似乎这应该是提供内置方法的常见情况。

0 个答案:

没有答案