我认为这一定很容易,但我不明白.
假设我有以下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')
Run Code Online (Sandbox Code Playgroud)
我怎样才能确定使用了哪个subparser?电话:
print parser.parse_args(["all"])
Run Code Online (Sandbox Code Playgroud)
给我一个空命名空间:
Namespace()
Run Code Online (Sandbox Code Playgroud)
quo*_*ian 273
一个更简单的解决方案是添加dest到add_subparsers呼叫中.这在文档中进一步深入了解:
[...]如果有必要检查被调用的子分析器的名称,add_subparsers()调用的dest关键字参数将起作用
在您的示例中替换:
subparsers = parser.add_subparsers(help='commands')
Run Code Online (Sandbox Code Playgroud)
有:
subparsers = parser.add_subparsers(help='commands', dest='command')
Run Code Online (Sandbox Code Playgroud)
现在,如果您运行:
print parser.parse_args(["all"])
Run Code Online (Sandbox Code Playgroud)
你会得到
Namespace(command='all')
Run Code Online (Sandbox Code Playgroud)
srg*_*erg 71
编辑:请参阅quornian对这个问题的回答,这个问题比我的好,应该是接受的答案.
根据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')
Run Code Online (Sandbox Code Playgroud)
现在,如果你跑
print parser.parse_args(["all"])
Run Code Online (Sandbox Code Playgroud)
结果是
Namespace(which='all')
Run Code Online (Sandbox Code Playgroud)
查看add_subparsers()文档以获取更多信息和另一个示例.
| 归档时间: |
|
| 查看次数: |
35900 次 |
| 最近记录: |