如何在argparse中让可选参数仅隐藏于usage、保留帮助并替换为[--args]
没问题,这两个需求都可以通过自定义argparse的帮助格式化器(HelpFormatter)来实现——argparse的扩展性很强,咱们可以通过继承并重写相关方法来精准控制输出格式。下面分两部分给你讲具体实现:
1. 仅在usage中隐藏指定可选参数,保留在帮助列表中
默认的help=argparse.SUPPRESS会同时把参数从usage和帮助列表里移除,显然不符合你的需求。咱们可以给需要隐藏的参数加个自定义标记,然后通过自定义格式化器在生成usage时过滤掉这些参数,但保留它们在帮助列表中的展示。
具体代码示例:
import argparse class CustomHelpFormatter(argparse.HelpFormatter): def _format_usage(self, usage, actions, groups, prefix): # 过滤掉标记了"hide_in_usage"的可选参数 filtered_actions = [] for action in actions: # 只跳过带自定义标记的可选参数 if action.option_strings and getattr(action, 'hide_in_usage', False): continue filtered_actions.append(action) # 调用父类方法生成处理后的usage return super()._format_usage(usage, filtered_actions, groups, prefix) # 初始化解析器并指定自定义格式化器 parser = argparse.ArgumentParser(formatter_class=CustomHelpFormatter) # 普通可选参数(会同时出现在usage和帮助列表) parser.add_argument('--normal', help='这是一个普通可选参数') # 需要在usage中隐藏的可选参数 hidden_arg = parser.add_argument('--hidden', help='这个参数只在帮助列表里显示') # 给参数添加自定义标记 hidden_arg.hide_in_usage = True # 位置参数 parser.add_argument('positional', help='必填的位置参数') args = parser.parse_args()
运行脚本后,usage里只会显示usage: script.py [-h] [--normal] positional,但在optional arguments:列表下依然能看到--hidden的完整说明。
2. 将usage中的所有可选参数替换为统一的[--args]标识
这个需求同样可以通过自定义格式化器实现,直接重写_format_usage方法,构造咱们想要的usage格式即可:
import argparse class ArgsPlaceholderFormatter(argparse.HelpFormatter): def _format_usage(self, usage, actions, groups, prefix): if prefix is None: prefix = 'usage: ' # 提取所有位置参数的字符串 positional_actions = [action for action in actions if not action.option_strings] positional_str = ' '.join(self._format_action_invocation(action) for action in positional_actions) # 构造自定义usage格式 custom_usage = f"{prefix}{self.prog} [--args] {positional_str}" return custom_usage + '\n' # 初始化解析器 parser = argparse.ArgumentParser(formatter_class=ArgsPlaceholderFormatter) # 添加任意可选参数 parser.add_argument('--foo', help='参数1说明') parser.add_argument('--bar', type=int, help='参数2说明') parser.add_argument('--baz', default='default', help='参数3说明') # 添加位置参数 parser.add_argument('input', help='输入文件路径') parser.add_argument('output', help='输出文件路径') args = parser.parse_args()
运行后,usage会显示为usage: script.py [--args] input output,而optional arguments:列表下依然会完整展示所有--foo/--bar/--baz的详细说明,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Travis
相关产品推荐
相关产品推荐

