有没有办法在 python 的 argparse 中创建参数,如果没有给出值, returns 为真

Is there a way to create argument in python's argparse that returns true in case no values given

目前 --resize 我创建的标志是布尔值,这意味着我的所有对象都将调整大小:

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) 传递,则 return 为真,但如果通过值 (--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

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

为了有选择地接受一个值,您需要设置 nargs to '?'. This will make the argument consume one value if it is specified. If the argument is specified but without value, then the argument will be assigned the argument’s const 值,所以这也是您需要指定的:

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

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

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

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

    >>> parser.parse_args('--resize'.split())
    Namespace(resize=True)
    
  3. 指定一个值:参数将得到指定的值:

    >>> parser.parse_args('--resize 123'.split())
    Namespace(resize='123')
    

既然要找索引,也可以指定type=int,这样参数值会自动解析为整数。这不会影响 default 或 const 情况,因此在这些情况下您仍然会得到 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()

使用nargs接受不同数量的command-line参数

使用defaultconst设置resize的默认值

详情请看这里: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