【发布时间】:2014-10-25 00:18:32
【问题描述】:
我正在向我的解析器添加子解析器以模拟子命令功能(例如代码参见:Simple command line application in python - parse user input?)。现在我想添加一个quit subparser/command,它不带参数并且附加了一个“退出”操作。可能吗 ?我该怎么办?
【问题讨论】:
标签: python python-2.7 argparse
我正在向我的解析器添加子解析器以模拟子命令功能(例如代码参见:Simple command line application in python - parse user input?)。现在我想添加一个quit subparser/command,它不带参数并且附加了一个“退出”操作。可能吗 ?我该怎么办?
【问题讨论】:
标签: python python-2.7 argparse
subcommands 的文档提供了两个如何识别子解析器的示例。
https://docs.python.org/dev/library/argparse.html#sub-commands
一个是给add_subparsers一个dest:
def do_quit(args):
# action
quit()
parser = ArgumentParser()
subparser = parser.add_subparsers(dest='cmd')
....
subparser.add_parser('quit')
...
args = parser.parse_args()
print args.cmd # displays 'quit'
if args.cmd == 'quit':
do_quit(args)
另一种是使用set_defaults将子解析器与函数链接:
parser = ArgumentParser()
subparsers = parser.add_subparsers()
...
parser_quit = subparsers.add_parser('quit')
parser_quit.set_defaults(func=do_quit)
...
args = parser.parse_args()
args.func(args)
进一步考虑,这是一种使用自定义Action 的方法。它就像_HelpAction(由-h 使用)。它由带有nargs=0(或“?”)的位置参数调用。这样的参数总是被调用,即使没有匹配它的字符串(或者更确切地说,0 个字符串匹配它)。这是如何处理位置的逻辑结果,但有点模糊。
class QuitAction(argparse.Action):
def __call__(self, parser, *args, **kwargs):
parser.exit(message="QUITTING\n")
p=argparse.ArgumentParser()
sp=p.add_subparsers(dest='cmd')
p1=sp.add_parser('quit')
p1.add_argument('foo', action=QuitAction, nargs='?', help=argparse.SUPPRESS)
p.parse_args(['quit'])
生产(在 Ipython 中运行时):
QUITTING
An exception has occurred, use %tb to see the full traceback.
SystemExit: 0
【讨论】:
-quit)吗?编辑:github
parse_args 的 ArgumentParser 子类。它会首先调用super().parse_args(或parse_known_args),然后执行“解析器外的逻辑”。只有您才能确切知道该方法定义背后隐藏的内容。
foo 参数出现在 quit 的帮助中?
usage: sync quit [-h] dummy sync quit: error: too few arguments(虚拟是 foo,同步是 prog) - 编辑:nargs='?' 修复了这个问题! - 你应该编辑你的答案可能