我有以下测试代码
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在示例中).
(问题的简化形式。)我正在编写一个涉及一些 Python 组件的 API。这些可能是函数,但为了具体起见,我们假设它们是对象。我希望能够从命令行解析各种组件的选项。
from argparse import ArgumentParser
class Foo(object):
def __init__(self, foo_options):
"""do stuff with options"""
"""..."""
class Bar(object):
def __init__(sef, bar_options):
"""..."""
def foo_parser():
"""(could also be a Foo method)"""
p = ArgumentParser()
p.add_argument('--option1')
#...
return p
def bar_parser(): "..."
Run Code Online (Sandbox Code Playgroud)
但现在我希望能够构建更大的组件:
def larger_component(options):
f1 = Foo(options.foo1)
f2 = Foo(options.foo2)
b = Bar(options.bar)
# ... do stuff with these pieces
Run Code Online (Sandbox Code Playgroud)
美好的。但是如何编写合适的解析器呢?我们可能希望像这样:
def larger_parser(): # probably need to take some prefix/ns arguments
# general options to be overridden by p1, …Run Code Online (Sandbox Code Playgroud)