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),将包含值.
例:
python ./my_script.py --resize # Will contain True that means, resize all the objectspython ./my_script.py --resize <index> # Will contain index, that means resize only specific object要选择性地接受值,您需要设置nargs为'?'.如果指定了参数,这将使参数消耗一个值.如果指定了参数但没有值,那么将为参数赋值参数的const值,这也是您需要指定的值:
parser = argparse.ArgumentParser()
parser.add_argument('--resize', nargs='?', const=True)
Run Code Online (Sandbox Code Playgroud)
这个论点现在有三种情况:
未指定:参数将获取其默认值(None默认情况下):
>>> parser.parse_args(''.split())
Namespace(resize=None)
Run Code Online (Sandbox Code Playgroud)指定没有值:参数将获得其const值:
>>> parser.parse_args('--resize'.split())
Namespace(resize=True)
Run Code Online (Sandbox Code Playgroud)用值指定:参数将获得指定的值:
>>> parser.parse_args('--resize 123'.split())
Namespace(resize='123')
Run Code Online (Sandbox Code Playgroud)由于您正在查找索引,因此您还可以指定type=int参数值将自动解析为整数.这不会影响默认情况或const情况,因此您仍然可以获得None或True在这种情况下:
>>> 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)