【问题标题】:python argparse - add action to subparser with no arguments?python argparse - 在没有参数的情况下向子解析器添加操作?
【发布时间】:2014-10-25 00:18:32
【问题描述】:

我正在向我的解析器添加子解析器以模拟子命令功能(例如代码参见:Simple command line application in python - parse user input?)。现在我想添加一个quit subparser/command,它不带参数并且附加了一个“退出”操作。可能吗 ?我该怎么办?

【问题讨论】:

    标签: python python-2.7 argparse


    【解决方案1】:

    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
    

    【讨论】:

    • 谢谢!如果您查看链接代码:stackoverflow.com/questions/25332925/…,您会看到我希望自动进行解析 - 我不想在解析器之外添加逻辑。没有其它的方法 ?我可以在主解析器中添加一个“退出”参数(不是-quit)吗?编辑:github
    • 当然 - 一个重新定义 parse_argsArgumentParser 子类。它会首先调用super().parse_args(或parse_known_args),然后执行“解析器外的逻辑”。只有您才能确切知道该方法定义背后隐藏的内容。
    • 我添加了一个使用可选后置参数的方法。
    • 谢谢!我已经有一个解析方法——我可以做到。回复:nargs hack:我怎样才能防止 foo 参数出现在 quit 的帮助中?
    • 嗯 - 我在 Python 2.7.8 中得到 usage: sync quit [-h] dummy sync quit: error: too few arguments(虚拟是 foo,同步是 prog) - 编辑:nargs='?' 修复了这个问题! - 你应该编辑你的答案可能
    猜你喜欢
    • 2011-11-21
    • 2020-05-16
    • 2018-04-08
    • 2011-07-12
    • 2013-02-05
    • 2018-12-31
    • 1970-01-01
    • 2012-06-21
    • 2015-11-08
    相关资源
    最近更新 更多