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) tldnr:给定一个函数,有没有办法根据其签名自动创建ArgumentParser?
我有一堆要公开给命令行的函数。因此,基本上,一个模块:
def copy(foo, bar, baz):
...
def move(from, to):
...
def unlink(parrot, nomore=True):
...
if __name__ == '__main__':
argparse stuff
Run Code Online (Sandbox Code Playgroud)
可以从命令行这样调用它:
python commands.py move spam ham
python commands.py unlink --parrot Polly
Run Code Online (Sandbox Code Playgroud)
尽管实现起来非常简单,但是涉及很多布线:
parser = argparse.ArgumentParser(...)
subparsers = parser.add_subparsers()
...
c = subparsers.add_parser('unlink', description='Unlink a parrot')
c.add_argument('--parrot', help='parrots name', required=True)
c.add_argument('--nomore', help='this parrot is no more', action='store_true')
...
c = subparsers.add_parser('move', description='Move stuff')
...
Run Code Online (Sandbox Code Playgroud)
等等,针对每个功能。最糟糕的是,如果函数参数发生变化(并且确实如此),则需要手动同步argparse内容。
如果这些函数可以为自己提供argparse的东西,那就更好了,这样主代码应该是这样的:
parser = argparse.ArgumentParser(...)
subparsers = parser.add_subparsers()
copy.register(subparsers)
move.register(subparsers)
unlink.register(subparsers)
...
Run Code Online (Sandbox Code Playgroud)
我想到了以下几点:
@args(
description='Unlink a …Run Code Online (Sandbox Code Playgroud)