我有一个具有几十个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,基本的和详细的。首先,调用了basic的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, actions, groups, 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
这里是一个布局,应该给你你需要的,虽然它不是“免费的工作”
add_help = False
禁用默认帮助(请参见here)。这将使您仍然可以使用-h和帮助执行所需的操作李>foo
是“简单”的而use-warp-drive
是“专家”的事实。您可以向Action
添加一个属性,或者在解析器本身中保存一个全局dict李>""
来抑制“专家”帮助李>希望这有帮助
相关问题 更多 >
编程相关推荐