argparse 中不同级别的帮助详细信息

如何解决argparse 中不同级别的帮助详细信息

我有一个包含几十个 CLI 参数的应用程序。我使用 python argparse 来解析参数。大多数很少使用,只有5或6个是经常使用的。对于简单的情况,我不想弄乱 --help输出,但是仍然应该有可能以某种方式查看所有参数的描述。

在 argparse 中是否可以有多个详细级别的帮助?这就是我期望的样子。

$ myapp -h
optional arguments:
 --foo         Do foo stuff
 --bar         Do bar stuff

$ myapp -hh # or myapp --expert-mode -h
optional arguments:
  --foo         Do foo stuff
  --bar         Do bar stuff

expert arguments:
  --use-warp-drive
  --no-fasten-seatbelts
... 50 more arguments

我的第一个想法是创建两个 ArgumentParser-s,基本的和详细的。首先,调用基本函数parse_args。如果存在 --expert 标志,则创建并调用详细解析器。这种方法有两个缺点。首先,-h 由第一个解析器无条件处理,所以我应该实现我自己的类似帮助标志。其次,没有 --expert 标志甚至不会解析专家选项,我希望它们被无条件解析(但不会在帮助中弹出)。

注意:解决方案应符合 python2。


更新:根据 Lior Cohen 的回答和 this 问题中的想法,我创建了一个工作示例。就我而言,制作“简单”选项的白名单更容易,因此甚至没有必要使用标记的操作类型。

说明代码如下。

class ExpertHelpformatter(argparse.Helpformatter):
    skip_expert_section = True
    whitelist = set(("foo",))

    def add_usage(self,usage,actions,groups,prefix=None):
        if self.skip_expert_section:
            actions = [action for action in actions if action.dest in self.whitelist]
        ret = super(ExpertHelpformatter,self).add_usage(usage,prefix)
        if self.skip_expert_section:
            self.add_text("Use -hh for detailed help.")
        return ret

    def add_argument(self,action):
        if self.skip_expert_section and action.dest not in self.whitelist:
            return
        super(ExpertHelpformatter,self).add_argument(action)

def main():
    parser = argparse.ArgumentParser(add_help=False,formatter_class=ExpertHelpformatter)

    parser.add_argument("-h","--help",action="count",default=0)
    parser.add_argument("--foo")
    parser.add_argument("--use-warp-drive",action="store_true")

    args = parser.parse_args()

    if args.help == 1:
        print parser.format_help()
        return
    elif args.help > 1:
        ExpertHelpformatter.skip_expert_section = False
        print parser.format_help()
        return

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?