Ale*_*lex 9 python python-2.7 argparse
我有以下测试代码
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", default = 0, type=int)
subparsers = parser.add_subparsers(dest = "parser_name")
parser_lan = subparsers.add_parser('car')
parser_lan.add_argument("--boo")
parser_lan.add_argument("--foo")
parser_serial = subparsers.add_parser('bus')
parser_serial.add_argument("--fun")
print parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
它定义了两个子解析器,具有不同的参数集.当我把测试代码称为
tester.py --verbose 3 car --boo 1 --foo 2
Run Code Online (Sandbox Code Playgroud)
我得到了预期的结果
Namespace(boo='1', foo='2', parser_name='car', verbose=3)
Run Code Online (Sandbox Code Playgroud)
我想要的是来自每个subparser的值在一个单独的命名空间或dict中,类似于
Namespace(subparseargs={boo:'1', foo:'2'}, parser_name='car', verbose=3)
Run Code Online (Sandbox Code Playgroud)
这样来自每个subparser的参数与主解析器中的参数逻辑分离(如verbose本例所示).
我怎样才能实现这一点,在同一名称空间中使用每个subparser的参数(subparseargs在示例中).
我已经开始开发一种不同的方法(但类似于 Anthon 的建议)并提出了更短的代码。但是,我不确定我的方法是否是该问题的通用解决方案。
与 Anthon 的提议类似,我定义了一个新方法,它创建一个保存在 中的“顶级”参数列表args,而所有其他参数都作为附加字典返回:
class MyArgumentParser(argparse.ArgumentParser):
def parse_subargs(self, *args, **kw):
# parse as usual
args = argparse.ArgumentParser.parse_args(self, *args, **kw)
# extract the destination names for top-level arguments
topdest = [action.dest for action in parser._actions]
# loop over all arguments given in args
subargs = {}
for key, value in args.__dict__.items():
# if sub-parser argument found ...
if key not in topdest:
# ... remove from args and add to dictionary
delattr(args,key)
subargs[key] = value
return args, subargs
Run Code Online (Sandbox Code Playgroud)
欢迎对这种方法提出评论,尤其是我忽略的任何漏洞。
| 归档时间: |
|
| 查看次数: |
2985 次 |
| 最近记录: |