python argparse-在没有参数的情况下向子解析器添加操作? [英] python argparse - add action to subparser with no arguments?

查看:203
本文介绍了python argparse-在没有参数的情况下向子解析器添加操作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在向解析器添加子解析器以模拟子命令功能(例如,代码请参见:

I am adding subparsers to my parser to simulate subcommands functionality (for example code see: Simple command line application in python - parse user input?). Now I want to add a quit subparser/command that takes no arguments and has a "quit" action attached. Is it possible ? How can I go about it ?

推荐答案

subcommands的文档给出了两个如何标识子解析器的示例.

The documentation for subcommands gives two examples of how to identify the subparser.

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将子解析器与函数链接:

the other is to use set_defaults to link the subparser with a function:

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个字符串与之匹配),也始终会调用这样的参数.这是如何处理位置的合乎逻辑的结果,但有些晦涩.


On further thought, here's a way, using a custom Action. It is like _HelpAction (which is used by a -h). It's called by a positional argument with nargs=0 (or '?'). Such an argument is always called, even though there are no strings to match it (or rather, 0 strings match it). This a logical, but somewhat obscure, consequence of how positionals are handled.

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中运行时):

producing (when run in Ipython):

QUITTING
An exception has occurred, use %tb to see the full traceback.    
SystemExit: 0

这篇关于python argparse-在没有参数的情况下向子解析器添加操作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆