Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python argparse-在没有参数的情况下向子Parser添加操作?_Python_Python 2.7_Argparse - Fatal编程技术网

python argparse-在没有参数的情况下向子Parser添加操作?

python argparse-在没有参数的情况下向子Parser添加操作?,python,python-2.7,argparse,Python,Python 2.7,Argparse,我正在向解析器添加子parser以模拟子命令功能(例如,代码请参见:)。现在我想添加一个quitsubparser/命令,它不带任何参数,并且附加了一个“quit”操作。可能吗?如何进行操作?子命令的文档提供了两个如何识别子parser的示例 一种是给add_子parseradest: def do_quit(args): # action quit() parser = ArgumentParser() subparser = parser.add_subparsers(d

我正在向解析器添加子parser以模拟子命令功能(例如,代码请参见:)。现在我想添加一个
quit
subparser/命令,它不带任何参数,并且附加了一个“quit”操作。可能吗?如何进行操作?

子命令的文档提供了两个如何识别子parser的示例

一种是给
add_子parser
a
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与函数链接:

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)

进一步考虑,这里有一种方法,使用自定义
操作
。它类似于
\u 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中运行时):


谢谢如果您查看链接代码:您将看到我希望自动进行解析—我不希望在解析器之外添加逻辑。没有别的办法吗?我是否可以向主解析器添加一个“quit”参数(即no
-quit
)?编辑:确定-一个重新定义
parse_args
ArgumentParser
子类。它将首先调用
super().parse_args
(或
parse_known_args
),然后执行“解析器外部的逻辑”。只有您才能确切地知道方法定义背后隐藏着什么。我添加了一个使用可选位置参数的方法。谢谢!我已经有了一个解析方法——我可以做到。Re:nargs黑客:我怎样才能防止
foo
参数出现在
quit
的帮助中?嗯-我得到
用法:sync-quit[-h]dummy-sync-quit:error:在Python2.7.8中参数太少了(dummy是foo,sync是prog)-编辑:
nargs='?'
修复了这个问题你应该编辑你的答案
QUITTING
An exception has occurred, use %tb to see the full traceback.    
SystemExit: 0