argparse:确定使用了哪个subparser

use*_*880 138 python argparse

我认为这一定很容易,但我不明白.

假设我有以下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

一个更简单的解决方案是添加destadd_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)

  • 这似乎是正确的方法,因为它的工作方式类似于任何其他参数的 `dest` 参数(只有它默认为 `None`,而不是从 `--longopt` 值中提取)。使用 `set_defaults` 似乎不适合这个(但对其他事情有用) (3认同)

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()文档以获取更多信息和另一个示例.

  • `set_defaults`非常有用,就像在docs的例子中一样,它使用它来将子命令绑定到一个函数..但是`add_parser(dest ='which')`似乎是"正确"的方法,因为它不需要重复子命令名称 (6认同)
  • @dbr,应该是 `add_subparsers(dest='which')` (2认同)