如何解决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 举报,一经查实,本站将立刻删除。