Argparse:检查是否有任何争论都已经过去了(Argparse: Check if any ar

2019-07-29 11:40发布

我的脚本应该启动一个演示模式,给出了无参数时。 我尝试这样做:

args = parser.parse_args()
if len(args) == 0:
    run_demo()
else:
    # evaluate args

这给*** TypeError: object of type 'Namespace' has no len()args是没有列表。

我将如何实现我想要什么?

Answer 1:

如果你的目标是在没有参数已经给命令来检测,然后通过这样argparse是错误的做法(如本已很好地指出了)。

想简单! :-)我相信argparse并不人口减少sys.argv 。 所以, if not len(sys.argv) > 1 ,则没有参数已被由用户提供。



Answer 2:

argparse允许您设置(内部Namespace对象)在您添加到解析器,根据您的规格和命令行被解析的参数中提到的所有变量。 如果设置了默认值,则这些变量将有一个默认值,如果他们没有在命令行上看到,他们不会从Namespace对象不存在的。 如果你没有指定一个默认的,那么有一个隐含的默认None 。 所以,检查命名空间物体的长度,但你能做到它,没有意义,以此来检查任何参数是否解析; 它应该始终具有相同的长度。

相反,如果你知道你有一大堆的参数没有默认值,并要检查是否有任何人被设置为任何非None价值......做到这一点。 您可以使用列表中理解和vars功能遍历,而不必从重复名称的列表add_argument电话,如图马亭的答案。

它变得有点棘手,如果你的一些参数有默认值,更何况,如果他们有可能被明确规定在命令行上(例如一个数字参数,默认为0,使得它无法从用户告诉默认的缺省值提供0)。 在这种情况下,我不知道,有一个通用的解决方案总是不工作的论据是什么的知识。



Answer 3:

如果一个人真正需要的参数数量(无论何种原因)。 我发现这个代码非常有帮助的(但不知道有多少优化它,我会很感激它的任何评论)。

args = parser.parse_args()
print( len( vars(args) ) )

这个版本只计算了-xx参数,而不是任何附加的价值传递。

如果一个人想要的一切(也传递的值),那么就使用len(sys.argv)如前所述。



Answer 4:

不要使用argparse。 相反,只使用sys.argvargparse创建一个命名空间,所以它总是给你一个“字典”与他们的价值观,这取决于你使用什么样的参数,当你调用的脚本。

这是我在过去所做的那样:

args = parser.parse_args()
if len(sys.argv) == 1:
    parser.print_help()
    sys.exit()
return args


Answer 5:

让我们假设下面的例子来扩展此致的完整性:

#!/usr/bin/env python3

import argparse

...
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('input', nargs='?' action='store')
    parser.add_argument('-l', '--length', type=int, action='store')
    parser.add_argument('-v', '--verbose', action='store_true')
    args = parser.parse_args()
    if (args.input == None and args.length == None):
        parser.print_help()
    else:
        print(args)

if __name__ == '__main__':
    main()

你Namespace对象,通过@Ben提到的,在这个例子中是args 。 从字符串parser.add_argument一个变量被创建。 您可以通过访问它args.inputargs.lengthargs.verbose 。 你可以通过执行验证这个print(args)将实际显示是这样的:

Namespace(input=None, length=None, verbose=False)

由于详细设置为True ,如果存在的话,并输入和长度都只是变量,它们不必被实例化(没有参数提供)。

也很有可能是group = parser.add_mutually_exclusive_group()如果你想确保,两个属性不能同时提供。

为了进一步参考,请参考:

  • https://docs.python.org/3/howto/argparse.html结构良好的HOWTO
  • https://docs.python.org/3/library/argparse.html Argparse模块文档


Answer 6:

我扩大2dvisio的概念来算非零或无参数:

vm_opts = parser.parse_args()
v = vars(vm_opts)
n_args = sum([ 1 for a in v.values( ) if a])


文章来源: Argparse: Check if any arguments have been passed