管理不接收任何值的参数

时间:2015-02-28 13:15:02

标签: python argparse

大家好我正在为我的应用程序编写帮助菜单。代码如下

    import argparse
    parser = argparse.ArgumentParser(description="Hyla database backup application")
    group = parser.add_mutually_exclusive_group()
    group.add_argument("-g","--group",type=str,help="defines database groups")
    group.add_argument("-a","--all",help="backup all databases",action="store_true")
    group.add_argument("-D","--databases",nargs='+',help="take multiple databases as input")
    parser.add_argument("-r","--reference",help="backups reference data-only",action="store_true")

    args=parser.parse_args()
   if args.reference==True:
     alpha=True
     print alpha
   if args.group == "uat":
     print args.group
   arglist=args.databases
   if len(arglist) > 0:
    for i in args.databases:
    print i

我真正的问题是,如果用户不使用-D选项,则arglist的值为0.我正在尝试通过检查arglist是否具有任何值来处理此问题,并仅在arglist为非空时执行后续步骤。但似乎arglist的值是空的而不是零,所以这就是为什么我得到低于错误

PS G:\pythonargs> python .\args.py -a
Traceback (most recent call last):
File ".\args.py", line 17, in <module>
if len(arglist) > 0:
TypeError: object of type 'NoneType' has no len()
PS G:\pythonargs>

我想根据arglist中的值执行操作。我如何确保即使用户不使用-D选项,arglist也应该有一些值

2 个答案:

答案 0 :(得分:0)

您可以将该选项的默认值设置为列表:

group.add_argument("-D","--databases",nargs='+',
  default=[],
  help="take multiple databases as input")

现在,如果用户没有使用-D选项,那么它将是一个空列表,因此您可以使用len()测试它的长度,或者在for中使用它循环。

答案 1 :(得分:0)

由于arglist可以是None,您可以这样做:

if arglist:
    if len(arglist) > 0:
        for i in args.databases:
            print (i)

并且仅在arglist不是None时测试长度。

我将两个测试合并为一个if语句,

if arglist and len(arglist) > 0:

这是有效的,因为Python从左到右进行评估,我使用的实现并不打算评估&#39;和&#39;右侧的表达式。运算符,如果左侧的表达式失败。我不知道每次实施是否都是如此。