【问题标题】:Subparser -- show help for both parser and subparser子解析器——显示解析器和子解析器的帮助
【发布时间】:2015-12-11 10:29:07
【问题描述】:

我已经查看了几十个类似的 SO 问题,但没有找到合适的解决方案,所以如果出现重复请见谅。 我有一个类似this one的问题

我想要一个解析器+子解析器对,如果子解析器“激活”,则使用 --help 选项会导致两者都显示帮助。

我能够获得完整(解析器 + 子解析器)帮助的唯一方法是:

common_parser = argparse.ArgumentParser(add_help=False)
common_parser.add_argument('-c', required = True)
parser = argparse.ArgumentParser(parents=[common_parser])
subparsers = parser.add_subparsers(dest="sub")
subparser = subparsers.add_parser("sub_option", parents=[common_parser])
subparser.add_argument('-o', required = False)
settings = parser.parse_args()

但是脚本需要输入两次-c 选项(显然对于解析器和子解析器)。如果我不使用parents,那么我会得到正常行为,但我得到的子解析器帮助不只包含-o 描述(我还希望显示-c

附: Python 2.7

【问题讨论】:

    标签: python python-2.7 argparse


    【解决方案1】:

    首先让我们区分解析行为和帮助显示。

    我假设您有多个子解析器(否则为什么要使用子解析器机制)。 -o 是特定于 sub_option 的参数,并且可能其他子解析器有自己的参数。

    -c 的目的是什么?它是所有子解析器共有的吗?由于需要子解析器,因此谈论仅对主解析器重要的参数是没有意义的。

    处理公共参数的一种方法是为所有子解析器定义它。您使用的父母机制为您节省了一些打字时间。只需从主要的parser 定义中省略它即可。这样就解决了必须提供两次的问题。

    如果为所有子解析器定义了-c,则不需要在主解析器帮助中显示它,是吗?

    当 subparser 命令是第一个参数字符串时,整个 subparser 机制是最干净的,它的所有参数、位置和选项都在后面。可以为主解析器定义参数,但通常会使使用和帮助变得复杂。

    显示主解析器和(所有)子解析器的帮助问题之前已经出现过,无论是在 SO 上,还是在 python 错误/问题上。没有简单的解决方案。一些可能有帮助的工具是:

    • 使用parser.print_help()subparse.print_help() 在程序控制下生成帮助。

    • add_subparsers() 命令采用progtitledescription 等参数来控制帮助,包括子解析器帮助的usage

    • add_subparser() 采用与ArgumentParser 相同类型的参数(因为它定义了解析器),descriptionusage 可能有用。


    查看上一个问题

    How to show help for all subparsers in argparse?

    我意识到如果-c 不是必需的,则可以为主解析器和子解析器定义它,并按预期显示在帮助中。但是通过使其成为“必需”,两个解析器都必须看到它 - 但只有子解析器看到的值才会出现在命名空间中。

    在主解析器中定义的位置也会出现在子解析器的用法中。

    另一个子解析器帮助显示问题

    argparse subparser monolithic help output


    http://bugs.python.org/issue20333 argparse subparser usage message hides main parser usage 讨论了在子解析使用行中应该显示多少主解析器使用的问题。目前只显示位置(在子解析器之前定义)。在补丁中,我建议也添加必需的选项。但是您始终可以通过为子解析器定义自己的 prog 来伪造这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2017-12-02
      • 2013-12-04
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多