Argparse:检查是否已传递任何参数

Fra*_*ter 46 python command-line-arguments argparse

当没有给出参数时,我的脚本应该启动演示模式.我试过这个:

args = parser.parse_args()
if len(args) == 0:
    run_demo()
else:
    # evaluate args
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能达到我想要的目标?

Jan*_*cke 74

如果您的目标是检测何时没有给出该命令的参数,那么通过这样做argparse是错误的方法(正如Ben已经指出的那样).

想想简单!:-)我相信argparse不会减少人口sys.argv.那么,if not len(sys.argv) > 1用户没有提供任何参数.


Ben*_*Ben 18

argparse允许您根据规范和要解析的命令行设置(在Namespace对象内)您添加到解析器的参数中提到的所有变量.如果设置了默认值,那么这些变量将具有该默认值(如果在命令行中未显示它们),它们将不会在Namespace对象中不存在.如果您没有指定默认值,则隐式默认值为None.因此,检查Namespace对象的长度,但是你设法做到这一点,作为检查是否解析了任何参数的方法没有意义; 它应该始终具有相同的长度.

相反,如果你知道你有一堆没有默认值的参数,并且你想检查它们中的任何一个是否被设置为任何非None值...那就这样做.您可以使用列表推导和vars函数来循环它们,而不必复制add_argument调用中的名称列表,如Martijn的答案所示.

如果你的一些参数有默认值,它会变得有点棘手,如果它们具有可以在命令行上显式提供的默认值,那就更难了(例如,默认为0的数字参数使得无法告诉用户默认值提供0).在那种情况下,我不确定是否有一个通用的解决方案总能在不知道参数是什么的情况下工作.

  • 这很好地解释了为什么你有'错误的问题':) (2认同)

Hyu*_*tel 14

我知道这是一个旧线程,但我找到了一个更直接的解决方案,可能对其他人也有用:

您可以检查是否已传递任何参数:

if any(vars(args).values()):
    # evaluate args
Run Code Online (Sandbox Code Playgroud)

或者,如果没有传递任何参数(注意not运算符):

if not any(vars(args).values()):
    run_demo()
Run Code Online (Sandbox Code Playgroud)

解释:

  • parse_args()返回一个“命名空间”对象,其中包含每个参数名称及其关联值。例子:Namespace(arg1='myfile.txt', arg2='some/path/to/some/folder')

  • 如果未传递任何参数parse_args(),将返回相同的对象,但所有值均为None。例子:Namespace(arg1=None, arg2=None)

不过,该对象不可迭代,因此您必须将vars()其转换为 a dict,以便我们可以访问值。

最后,由于我们现在dict手头上有 a ,我们可以获取所有值(在 a 中list),.values()并使用内置any()函数检查是否有任何值不是None。为了更清楚地说明:如果您提供给它的列表中没有一个不是,或者(检查文档以供参考)的值,any()则返回。FalseNoneFalse0

希望能帮助到你。

  • 如果您有默认参数,这将不起作用,因为它们会覆盖“None”。 (2认同)

2dv*_*sio 8

如果一个人确实需要参数号(无论出于何种原因).我发现这段代码非常有用(但不知道它有多少优化,我很感激任何评论).

args = parser.parse_args()
print( len( vars(args) ) )
Run Code Online (Sandbox Code Playgroud)

此版本仅计算-xx参数,而不计算任何传递的其他值.

如果一个人想要所有东西(也是传递的值),那么就像len(sys.argv)前面提到的那样使用.


小智 7

不要使用argparse。而是使用sys.argvargparse创建一个命名空间,因此它将始终为您提供其值的“ dict”,具体取决于您在调用脚本时使用的参数。

这是我过去所做的:

args = parser.parse_args()
if len(sys.argv) == 1:
    parser.print_help()
    sys.exit()
return args
Run Code Online (Sandbox Code Playgroud)