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

Sam*_*uel 3 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()
Run Code Online (Sandbox Code Playgroud)

有没有办法实现argparse参数,如果传递为boolean flag(--resize)将返回true,但如果传递value(--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

pok*_*oke 6

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

parser = argparse.ArgumentParser()
parser.add_argument('--resize', nargs='?', const=True)
Run Code Online (Sandbox Code Playgroud)

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

  1. 未指定:参数将获取其默认值(None默认情况下):

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

    >>> parser.parse_args('--resize'.split())
    Namespace(resize=True)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 用值指定:参数将获得指定的值:

    >>> parser.parse_args('--resize 123'.split())
    Namespace(resize='123')
    
    Run Code Online (Sandbox Code Playgroud)

由于您正在查找索引,因此您还可以指定type=int参数值将自动解析为整数.这不会影响默认情况或const情况,因此您仍然可以获得NoneTrue在这种情况下:

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

您的用法将如下所示:

if args.resize is True:
    for object in my_objects:
        object.do_resize()
elif args.resize:
    my_objects[args.resize].do_resize()
Run Code Online (Sandbox Code Playgroud)