有没有办法在python的argparse中创建参数,如果没有给出值,则返回true

时间:2016-01-07 09:42:17

标签: python python-2.7 argparse

我创建的当前--resize标志是boolean,意味着我的所有对象都将调整大小:

parser.add_argument("--resize", action="store_true", help="Do dictionary resize")

# ...

# if resize flag is true I'm re-sizing all objects
if args.resize:
    for object in my_obects:
        object.do_resize()

是否有一种方法实现argparse参数,如果作为布尔标志(--resize)传递将返回true,但如果传递值(--resize 10),则将包含值。

示例:

  1. python ./my_script.py --resize # Will contain True that means, resize all the objects
  2. python ./my_script.py --resize <index> # Will contain index, that means resize only specific object

3 个答案:

答案 0 :(得分:6)

要选择接受某个值,您需要将nargs设置为'?'。如果指定了参数,这将使参数消耗一个值。如果指定了参数但没有值,那么将为参数赋予参数的const值,这也是您需要指定的内容:

parser = argparse.ArgumentParser()
parser.add_argument('--resize', nargs='?', const=True)

这个论点现在有三种情况:

  1. 未指定:参数将获取其default value(默认为None):

    >>> parser.parse_args(''.split())
    Namespace(resize=None)
    
  2. 没有值指定:参数将获得其const值:

    >>> parser.parse_args('--resize'.split())
    Namespace(resize=True)
    
  3. 使用值指定:参数将获得指定值:

    >>> parser.parse_args('--resize 123'.split())
    Namespace(resize='123')
    
  4. 由于您正在寻找索引,因此您还可以指定type=int,以便将参数值自动解析为整数。这不会影响默认值或常量情况,因此在这些情况下您仍会获得NoneTrue

    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--resize', nargs='?', type=int, const=True)
    >>> parser.parse_args('--resize 123'.split())
    Namespace(resize=123)
    

    您的用法将如下所示:

    if args.resize is True:
        for object in my_objects:
            object.do_resize()
    elif args.resize:
        my_objects[args.resize].do_resize()
    

答案 1 :(得分:1)

您可以将default=Falseconst=Truenargs='?'添加到参数定义中,然后移除action。这样,如果你没有传递--resize,它将存储False,如果你传递--resize没有参数将存储True,否则传递参数。你仍然需要重构一下代码,知道你是否有删除或删除所有对象的索引。

答案 2 :(得分:1)

使用nargs接受不同数量的命令行参数

使用defaultconst设置调整大小的默认值

详情请见此处:https://docs.python.org/3/library/argparse.html#nargs

parser.add_argument('-resize', dest='resize', type=int, nargs='?', default=False, const=True)

>>tmp.py -resize 1  
args.resize: 1

>>tmp.py -resize  
args.resize: True

>>tmp.py   
args.resize: False