如何阻止ArgumentParser为选项别名重复显示可选值
解决argparse多选项参数重复显示可选值的问题
这个问题我之前也碰到过,确实有点烦——argparse默认会把每个关联选项的可选值都重复显示一遍,help信息看起来特别冗余。给你两个实用的解决办法:
方法一:用别名+隐藏重复帮助信息
最简单的方式是把主选项和别名分开定义,用dest参数让别名指向同一个变量,同时用SUPPRESS隐藏别名的帮助内容,只保留主选项的完整说明:
from argparse import ArgumentParser, SUPPRESS _LOGLEVELS = ('CRITICAL','ERROR','WARNING','WARN','INFO','DEBUG') parser = ArgumentParser(description='Logger Demo.') # 定义主选项,显示完整的帮助和可选值 parser.add_argument('--loglevel', choices=_LOGLEVELS, default='INFO', help='set the log level (choices: %(choices)s)') # 定义别名,指向同一个变量,隐藏帮助内容 parser.add_argument('--verbosity', '-v', dest='loglevel', help=SUPPRESS) args = parser.parse_args()
这样执行--help时,只会在--loglevel后面显示可选值,--verbosity和-v会作为别名出现在usage里,但不会重复冗余的内容,既清晰又简洁。
方法二:自定义帮助格式化器(进阶)
如果你想保留所有选项的可见性,但不想重复显示可选值,可以自定义一个HelpFormatter,让它只在第一个选项后面添加一次可选值说明:
from argparse import ArgumentParser, HelpFormatter _LOGLEVELS = ('CRITICAL','ERROR','WARNING','WARN','INFO','DEBUG') class SingleChoiceHelpFormatter(HelpFormatter): def _format_action(self, action): # 仅当当前action有多个选项且存在可选值时处理 if action.choices and len(action.option_strings) > 1: # 先备份原始可选值,临时清空避免重复渲染 original_choices = action.choices action.choices = None # 调用父类方法生成基础帮助文本 help_text_parts = super()._format_action(action).split('\n') # 恢复原始可选值 action.choices = original_choices # 在帮助文本末尾追加可选值说明 for idx, part in enumerate(help_text_parts): if 'help:' in part: help_text_parts[idx] = f"{part.rstrip()} (choices: {', '.join(action.choices)})" break return '\n'.join(help_text_parts) # 其他情况按默认逻辑处理 return super()._format_action(action) parser = ArgumentParser(description='Logger Demo.', formatter_class=SingleChoiceHelpFormatter) parser.add_argument('--loglevel', '--verbosity', '-v', choices=_LOGLEVELS, default='INFO', help='set the log level') args = parser.parse_args()
这个方法会让所有选项都显示在help里,但可选值只出现一次,兼顾了可读性和完整性。
内容的提问来源于stack exchange,提问作者Peter Moore
相关产品推荐
相关产品推荐

