我想这一定很容易,但我不明白。
假设我有以下arparse解析器:
import argparse
parser = argparse.ArgumentParser( version='pyargparsetest 1.0' )
subparsers = parser.add_subparsers(help='commands')
# all
all_parser = subparsers.add_parser('all', help='process all apps')
# app
app_parser = subparsers.add_parser('app', help='process a single app')
app_parser.add_argument('appname', action='store', help='name of app to process')
如何识别使用了哪个子解析器?
调用:
print parser.parse_args(["all"])
给我一个空的命名空间:
Namespace()
一个更简单的解决方案是将dest添加到add_subparsers调用中。这在文档中隐藏得更深一些:
[…如果有必要检查被调用的子解析器的名称,add_subparser()调用的dest关键字参数将起作用
在你的例子中替换:
subparsers = parser.add_subparsers(help='commands')
:
subparsers = parser.add_subparsers(help='commands', dest='command')
现在如果你运行:
print parser.parse_args(["all"])
你会得到
Namespace(command='all')
一个更简单的解决方案是将dest添加到add_subparsers调用中。这在文档中隐藏得更深一些:
[…如果有必要检查被调用的子解析器的名称,add_subparser()调用的dest关键字参数将起作用
在你的例子中替换:
subparsers = parser.add_subparsers(help='commands')
:
subparsers = parser.add_subparsers(help='commands', dest='command')
现在如果你运行:
print parser.parse_args(["all"])
你会得到
Namespace(command='all')
编辑:请看quora对这个问题的回答,这比我的回答更好,应该是公认的答案。
根据argparse文档,parser.parse_args(…)的结果将“只包含被选择的主解析器和子解析器的属性”。不幸的是,这些信息可能不足以确定使用了哪个子解析器。文档建议在子解析器上使用set_defaults(…)方法来解决这个问题。
例如,我在代码中添加了对set_defaults()的调用:
import argparse
parser = argparse.ArgumentParser( version='pyargparsetest 1.0' )
subparsers = parser.add_subparsers(help='commands')
# all
all_parser = subparsers.add_parser('all', help='process all apps')
all_parser.set_defaults(which='all')
# app
app_parser = subparsers.add_parser('app', help='process a single app')
app_parser.add_argument('appname', action='store', help='name of app to process')
app_parser.set_defaults(which='app')
现在如果你跑了
print parser.parse_args(["all"])
结果是
Namespace(which='all')
查看add_subparsers()文档以获得更多信息和另一个示例。