如何为 argparse 设计面向对象的子解析器?
How to design object oriented subparsers for argparse?
问题
我正在构建一个包含很多子命令的包管理器。我希望有一个类似于以下的 class 结构。
class ListCommand:
def __init__(self):
name = "list"
alias = "ls"
short_description = "A useful simple line that explains the command"
def help(self):
# Display help
def command(self):
# do stuff when command is called
如何编写子解析器来处理这样的东西?我在网上找到了一个 example 可以在没有子解析器的情况下做类似的事情。
命令 class 和解析器:
import argparse
class Cmd:
def __init__(self,name):
self.name = name
def __call__(self, args):
# do stuff when command is called
print('Executing %s'%self)
print('args %s'% args)
def make_sup(self,sp):
self.parser = sp.add_parser(self.name)
self.parser.add_argument('--foo')
self.parser.set_defaults(action=self)
def __repr__(self):
return '<Cmd> %s'%self.name
cmds = []
cmds.append(Cmd('list'))
cmds.append(Cmd('foo'))
cmds.append(Cmd('bar'))
print(cmds)
parser = argparse.ArgumentParser()
sp = parser.add_subparsers(dest='cmd')
for cmd in cmds:
cmd.make_sup(sp)
print(parser._defaults)
args = parser.parse_args()
print(args)
args.action(args)
样本运行:
1834:~/mypy$ python stack46595691.py list --foo xxxx
[<Cmd> list, <Cmd> foo, <Cmd> bar]
{}
Namespace(action=<Cmd> list, cmd='list', foo='xxxx')
Executing <Cmd> list
args Namespace(action=<Cmd> list, cmd='list', foo='xxxx')
1837:~/mypy$ python stack46595691.py bar
[<Cmd> list, <Cmd> foo, <Cmd> bar]
{}
Namespace(action=<Cmd> bar, cmd='bar', foo=None)
Executing <Cmd> bar
args Namespace(action=<Cmd> bar, cmd='bar', foo=None)
1838:~/mypy$ python stack46595691.py foo -h
[<Cmd> list, <Cmd> foo, <Cmd> bar]
{}
usage: stack46595691.py foo [-h] [--foo FOO]
optional arguments:
-h, --help show this help message and exit
--foo FOO
您可能还想查看 plac
,一个包含 class 和 ArgumentParser
、https://pypi.python.org/pypi/plac
的软件包
它可以根据函数的参数构造子解析器。
问题
我正在构建一个包含很多子命令的包管理器。我希望有一个类似于以下的 class 结构。
class ListCommand:
def __init__(self):
name = "list"
alias = "ls"
short_description = "A useful simple line that explains the command"
def help(self):
# Display help
def command(self):
# do stuff when command is called
如何编写子解析器来处理这样的东西?我在网上找到了一个 example 可以在没有子解析器的情况下做类似的事情。
命令 class 和解析器:
import argparse
class Cmd:
def __init__(self,name):
self.name = name
def __call__(self, args):
# do stuff when command is called
print('Executing %s'%self)
print('args %s'% args)
def make_sup(self,sp):
self.parser = sp.add_parser(self.name)
self.parser.add_argument('--foo')
self.parser.set_defaults(action=self)
def __repr__(self):
return '<Cmd> %s'%self.name
cmds = []
cmds.append(Cmd('list'))
cmds.append(Cmd('foo'))
cmds.append(Cmd('bar'))
print(cmds)
parser = argparse.ArgumentParser()
sp = parser.add_subparsers(dest='cmd')
for cmd in cmds:
cmd.make_sup(sp)
print(parser._defaults)
args = parser.parse_args()
print(args)
args.action(args)
样本运行:
1834:~/mypy$ python stack46595691.py list --foo xxxx
[<Cmd> list, <Cmd> foo, <Cmd> bar]
{}
Namespace(action=<Cmd> list, cmd='list', foo='xxxx')
Executing <Cmd> list
args Namespace(action=<Cmd> list, cmd='list', foo='xxxx')
1837:~/mypy$ python stack46595691.py bar
[<Cmd> list, <Cmd> foo, <Cmd> bar]
{}
Namespace(action=<Cmd> bar, cmd='bar', foo=None)
Executing <Cmd> bar
args Namespace(action=<Cmd> bar, cmd='bar', foo=None)
1838:~/mypy$ python stack46595691.py foo -h
[<Cmd> list, <Cmd> foo, <Cmd> bar]
{}
usage: stack46595691.py foo [-h] [--foo FOO]
optional arguments:
-h, --help show this help message and exit
--foo FOO
您可能还想查看 plac
,一个包含 class 和 ArgumentParser
、https://pypi.python.org/pypi/plac
它可以根据函数的参数构造子解析器。