我的脚本应该启动一个演示模式,给出了无参数时。 我尝试这样做:
args = parser.parse_args()
if len(args) == 0:
run_demo()
else:
# evaluate args
这给*** TypeError: object of type 'Namespace' has no len()
为args
是没有列表。
我将如何实现我想要什么?
我的脚本应该启动一个演示模式,给出了无参数时。 我尝试这样做:
args = parser.parse_args()
if len(args) == 0:
run_demo()
else:
# evaluate args
这给*** TypeError: object of type 'Namespace' has no len()
为args
是没有列表。
我将如何实现我想要什么?
如果你的目标是在没有参数已经给命令来检测,然后通过这样argparse
是错误的做法(如本已很好地指出了)。
想简单! :-)我相信argparse并不人口减少sys.argv
。 所以, if not len(sys.argv) > 1
,则没有参数已被由用户提供。
argparse允许您设置(内部Namespace对象)在您添加到解析器,根据您的规格和命令行被解析的参数中提到的所有变量。 如果设置了默认值,则这些变量将有一个默认值,如果他们没有在命令行上看到,他们不会从Namespace对象不存在的。 如果你没有指定一个默认的,那么有一个隐含的默认None
。 所以,检查命名空间物体的长度,但你能做到它,没有意义,以此来检查任何参数是否解析; 它应该始终具有相同的长度。
相反,如果你知道你有一大堆的参数没有默认值,并要检查是否有任何人被设置为任何非None
价值......做到这一点。 您可以使用列表中理解和vars
功能遍历,而不必从重复名称的列表add_argument
电话,如图马亭的答案。
它变得有点棘手,如果你的一些参数有默认值,更何况,如果他们有可能被明确规定在命令行上(例如一个数字参数,默认为0,使得它无法从用户告诉默认的缺省值提供0)。 在这种情况下,我不知道,有一个通用的解决方案总是不工作的论据是什么的知识。
如果一个人真正需要的参数数量(无论何种原因)。 我发现这个代码非常有帮助的(但不知道有多少优化它,我会很感激它的任何评论)。
args = parser.parse_args()
print( len( vars(args) ) )
这个版本只计算了-xx参数,而不是任何附加的价值传递。
如果一个人想要的一切(也传递的值),那么就使用len(sys.argv)
如前所述。
不要使用argparse。 相反,只使用sys.argv
。 argparse
创建一个命名空间,所以它总是给你一个“字典”与他们的价值观,这取决于你使用什么样的参数,当你调用的脚本。
这是我在过去所做的那样:
args = parser.parse_args()
if len(sys.argv) == 1:
parser.print_help()
sys.exit()
return args
让我们假设下面的例子来扩展此致的完整性:
#!/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.input
或args.length
或args.verbose
。 你可以通过执行验证这个print(args)
将实际显示是这样的:
Namespace(input=None, length=None, verbose=False)
由于详细设置为True
,如果存在的话,并输入和长度都只是变量,它们不必被实例化(没有参数提供)。
也很有可能是group = parser.add_mutually_exclusive_group()
如果你想确保,两个属性不能同时提供。
为了进一步参考,请参考:
我扩大2dvisio的概念来算非零或无参数:
vm_opts = parser.parse_args()
v = vars(vm_opts)
n_args = sum([ 1 for a in v.values( ) if a])