我创建的当前--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
),则将包含值。
示例:
python ./my_script.py --resize # Will contain True that means, resize all the objects
python ./my_script.py --resize <index> # Will contain index, that means resize only specific object
答案 0 :(得分:6)
要选择接受某个值,您需要将nargs
设置为'?'
。如果指定了参数,这将使参数消耗一个值。如果指定了参数但没有值,那么将为参数赋予参数的const
值,这也是您需要指定的内容:
parser = argparse.ArgumentParser()
parser.add_argument('--resize', nargs='?', const=True)
这个论点现在有三种情况:
未指定:参数将获取其default value(默认为None
):
>>> parser.parse_args(''.split())
Namespace(resize=None)
没有值指定:参数将获得其const值:
>>> parser.parse_args('--resize'.split())
Namespace(resize=True)
使用值指定:参数将获得指定值:
>>> parser.parse_args('--resize 123'.split())
Namespace(resize='123')
由于您正在寻找索引,因此您还可以指定type=int
,以便将参数值自动解析为整数。这不会影响默认值或常量情况,因此在这些情况下您仍会获得None
或True
:
>>> 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=False
,const=True
和nargs='?'
添加到参数定义中,然后移除action
。这样,如果你没有传递--resize
,它将存储False,如果你传递--resize
没有参数将存储True
,否则传递参数。你仍然需要重构一下代码,知道你是否有删除或删除所有对象的索引。
答案 2 :(得分:1)
使用nargs
接受不同数量的命令行参数
使用default
和const
设置调整大小的默认值
详情请见此处: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