【问题标题】:Argparse: Is it possible to make the help context sensitiveArgparse:是否可以使帮助上下文敏感
【发布时间】:2012-11-01 17:24:52
【问题描述】:

我有一个使用 argparse 来处理命令行的程序。 程序的命令行,因此它的帮助变得上下文敏感。 我想让帮助反映上下文敏感性。

例如

prog --mode=1 OPTA OPTB OPTC<br>
prog --mode=2 OPTD OPTE OPTF<br>

prog --mode=1 -h<br>
"In mode 1 you have four options, A,B,C,D"

prog --mode=2 -h<br>
"You mode 2 you have four options, D,E,F,G"

我应该在这里补充一点,这只是一个例子。在我的实际程序中,可能有任意数量的模式,它们不是由我的代码定义的,它们是由我的 API 的用户定义的。因此,不可能对每种模式的帮助进行硬编码。实际的帮助文本稍后定义。

这意味着在处理 --mode 参数后更改参数 'option' 的帮助字符串以反映不同的模式。下面的代码基本上可以正常工作,因为命令按预期工作,但帮助没有。

问题是 parse_known_args() 似乎处理了 -h 然后退出。我需要parse_args() 来处理帮助。显然我可以简单地解析sys.argv 并自己找到--mode,但这肯定会打败argparse 的对象。

import argparse

parser = argparse.ArgumentParser(description='Test argparser')
parser.add_argument('--mode', nargs=1, type=int,
                    default=[1],
                   help='program mode')

options={
    1:["OPTA","OPTB","OPTC","OPTD"],
    2:["OPTD","OPTE","OPTF","OPTG"]}


args = parser.parse_known_args()[0]

print "Initial pass"
print args

parser.add_argument('options', type=str, nargs='+',
                    choices=options[args.mode[0]]+["ALL"],
                    default="ALL",
                   help='One or more of the options, above')

args = parser.parse_args()

print "Second pass"
print args

【问题讨论】:

  • 应该帮忙:​​docs.python.org/dev/library/…
  • 在我看来你的“模式”应该是一个子命令而不是一个选项。
  • 我同意@thg435。为模式 1 和模式 2 创建两个子解析器,你会得到你想要的。
  • 我给出的例子非常精简,真正的代码要复杂得多。在实际代码中,它不是“模式”(它是 --use-defs= 与 --module= 结合使用,两者都是非常可选的)。出于这个原因,我认为“模式”绝对是一个选项,然后它的参数用于从模块导入并选择从该模块导入的(可选)派生类并覆盖默认值。可能有几十个这样的模块和类。派生类是一种集合,帮助是该集合的每个成员的一个方面。
  • 那么我认为您不需要上下文相关的帮助。只需为两者提供帮助。然后,您可以向“帮助”选项添加一个参数,以便用户可以获取每种模式的上下文特定和详细信息。

标签: python argparse context-sensitive-help


【解决方案1】:

您想做的事情由 argparse 的sub-commands 处理。使用子命令意味着将您的 --mode 选项替换为子命令:

prog --mode=1 OPTA OPTB OPTC

会变成

prog mode1 OPTA OPTB OPTC

mode1 子命令可以提供自己的帮助;它通过

访问
prog mode1 -h

这种方法的另一个优点是prog -h 列出了可能的子命令(以及相关的描述)。

【讨论】:

  • 如前所述,我认为不是。给出的例子被简化了。直到运行时间之后我才知道模式的价值,到那时为时已晚。这个问题是关于帮助格式,而不是参数传递。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
相关资源
最近更新 更多