有没有办法在python中创建参数';在没有给定值的情况下返回true的argparse

有没有办法在python中创建参数';在没有给定值的情况下返回true的argparse,python,python-2.7,argparse,Python,Python 2.7,Argparse,当前,我创建的--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()

当前,我创建的
--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
)传递,将返回true,但如果使用值(
--resize 10
)传递,将包含值

例如:

  • python./my_script.py--resize将包含True,这意味着调整所有对象的大小
  • python./my_script.py--resize将包含索引,这意味着只调整特定对象的大小

  • 您可以向参数定义中添加
    default=False
    const=True
    nargs='?'
    ,并删除
    操作。这样,如果不传递
    --resize
    它将存储False,如果传递
    --resize
    而没有参数,它将存储
    True
    ,否则传递的参数。不过,您仍需要对代码进行一点重构,以了解是否有用于删除或删除所有对象的索引。

    为了有选择地接受一个值,您需要设置为
    “?”
    。如果指定了参数,则该参数将使用一个值。如果指定了参数但没有值,则将为该参数指定参数的值,因此您也需要指定:

    parser = argparse.ArgumentParser()
    parser.add_argument('--resize', nargs='?', const=True)
    
    这一论点现在有三种情况:

  • 未指定:参数将获得其默认值(
    None
    ):

  • 未指定值:参数将获取其常量值:

    >>> 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()
    

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

    使用
    default
    const
    设置resize的默认值

    详情请参见此处:


    我建议选择一个不是
    True
    的值来调整所有对象的大小
    if args.resize
    将在
    resize
    的任何非零整数值上触发,如果您尝试将其更改为
    if args.resize==True
    ,则在
    args.resize
    1
    时仍会触发,因为
    True==1
    。字符串
    'all'
    可能是一个不错的选择。@user2357112您应该始终使用identity检查布尔值。例如,
    如果args.resize为True:resizeral()/elif args.resize:resizeIndex(args.resize)
    @poke:相反,您几乎不应该通过标识检查布尔值。使用identity检查布尔人与通常的做法有很大的反差,
    是真的
    检查可能会有人在没有意识到在这种特殊情况下确实有必要删除它的风险。@user2357112:一般来说,您所说的是完全正确的。但是这里我们需要区分
    True
    和各种真实整数,因此
    如果args.resize为True
    在这种情况下是合适的。@PM2Ring:
    如果args.resize为True
    当然是对给定代码的改进,但这是错误的改进。将
    True
    切换为不同的值会生成代码,未来的维护人员将更快地理解这些代码,并且不太可能出错。说你应该总是通过身份来检查布尔人是完全错误的。
    if args.resize is True:
        for object in my_objects:
            object.do_resize()
    elif args.resize:
        my_objects[args.resize].do_resize()
    
    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