相关疑难解决方法(0)

具有嵌套命名空间的argparse子命令

argparse是否提供内置工具,使其将组或解析器解析为自己的命名空间?我觉得我必须在某个地方错过一个选项.

编辑:这个例子可能不是我应该做的,以构建解析器来实现我的目标,但这是我迄今为止所做的.我的具体目标是能够为子解析器提供被解析为命名空间字段的选项组.我与父母的想法只是为了同样的目的使用共同的选项.

例:

import argparse

# Main parser
main_parser = argparse.ArgumentParser()
main_parser.add_argument("-common")

# filter parser
filter_parser = argparse.ArgumentParser(add_help=False)
filter_parser.add_argument("-filter1")
filter_parser.add_argument("-filter2")

# sub commands
subparsers = main_parser.add_subparsers(help='sub-command help')

parser_a = subparsers.add_parser('command_a', help="command_a help", parents=[filter_parser])
parser_a.add_argument("-foo")
parser_a.add_argument("-bar")

parser_b = subparsers.add_parser('command_b', help="command_b help", parents=[filter_parser])
parser_b.add_argument("-biz")
parser_b.add_argument("-baz")

# parse
namespace = main_parser.parse_args()
print namespace
Run Code Online (Sandbox Code Playgroud)

这是我得到的,显然:

$ python test.py command_a -foo bar -filter1 val
Namespace(bar=None, common=None, filter1='val', filter2=None, foo='bar')
Run Code Online (Sandbox Code Playgroud)

但这就是我真正追求的:

Namespace(bar=None, common=None, foo='bar', 
          filter=Namespace(filter1='val', filter2=None))
Run Code Online (Sandbox Code Playgroud)

然后,更多的选项组已经解析为名称空间:

Namespace(common=None, 
          foo='bar', bar=None,  
          filter=Namespace(filter1='val', filter2=None),
          anotherGroup=Namespace(bazers='val'),
          anotherGroup2=Namespace(fooers='val'), …
Run Code Online (Sandbox Code Playgroud)

python namespaces argparse

12
推荐指数
3
解决办法
5519
查看次数

标签 统计

argparse ×1

namespaces ×1

python ×1