Python argparse帮助,无重复的ALLCAPS
我希望为我的选项显示argparse帮助,显示方式与默认的Python argparse帮助,无重复的ALLCAPS,python,argparse,Python,Argparse,我希望为我的选项显示argparse帮助,显示方式与默认的-h、-help和-v、-version相同,选项后没有ALLCAPS文本,或者至少没有重复的大写字母 import argparse p = argparse.ArgumentParser("a foo bar dustup") p.add_argument('-i', '--ini', help="use alternate ini file") print '\n', p.parse_args() 这就是我目前使用python f
-h
、-help
和-v
、-version
相同,选项后没有ALLCAPS文本,或者至少没有重复的大写字母
import argparse
p = argparse.ArgumentParser("a foo bar dustup")
p.add_argument('-i', '--ini', help="use alternate ini file")
print '\n', p.parse_args()
这就是我目前使用python foobar.py-h所得到的:
usage: a foo bar dustup [-h] [-i INI]
optional arguments:
-h, --help show this help message and exit
-i INI, --ini INI use alternate ini
这就是我想要的:
usage: a foo bar dustup [-h] [-i INI]
optional arguments:
-h, --help show this help message and exit
-i, --ini INI use alternate ini
这也是可以接受的:
-i, --ini use alternate ini
我使用的是python 2.7。我可以告诉您有两种选择
import argparse
p = argparse.ArgumentParser(description="a foo bar dustup")
p.add_argument('-i', '--ini', metavar='', help="use alternate ini file")
print '\n', p.parse_args()
或者你可以写一个自定义,我意识到第一个选项可能不是一个完美的解决方案,因为它去掉了使用行中的大写字母。如果这里的argparse有那么重要的话,那么我可以告诉您,默认的格式化程序类并不能完全满足您的需要
编辑:
好吧,我继续为你建立了你自己的格式化程序类,和其他人一样。。。我不确定是否建议您在生产代码中使用它,因为没有任何关于它=P的官方python文档
import argparse
from argparse import HelpFormatter
class MyFormatter(HelpFormatter):
"""
for matt wilkie on SO
"""
def _format_action_invocation(self, action):
if not action.option_strings:
default = self._get_default_metavar_for_positional(action)
metavar, = self._metavar_formatter(action, default)(1)
return metavar
else:
parts = []
# if the Optional doesn't take a value, format is:
# -s, --long
if action.nargs == 0:
parts.extend(action.option_strings)
# if the Optional takes a value, format is:
# -s ARGS, --long ARGS
else:
default = self._get_default_metavar_for_optional(action)
args_string = self._format_args(action, default)
for option_string in action.option_strings:
parts.append(option_string)
return '%s %s' % (', '.join(parts), args_string)
return ', '.join(parts)
def _get_default_metavar_for_optional(self, action):
return action.dest.upper()
p = argparse.ArgumentParser("a foo bar dustup", formatter_class=MyFormatter)
p.add_argument('-i', '--ini', help="use alternate ini file")
p.print_help()
您可以自定义用法
,并将metavar
分配给空字符串:
import argparse
p = argparse.ArgumentParser("a foo bar dustup", usage='%(prog)s [-h] [-i INI]')
p.add_argument('-i', '--ini', help="use alternate ini file", metavar='')
p.print_help()
输出
用法:一个foo-bar dustup[-h][i INI]
可选参数:
-h、 --帮助显示此帮助消息并退出
-i,--ini使用备用ini文件
+1您的解决方案解决了我的答案中存在的使用问题。我已接受此解决方案作为我当前项目的可行解决方案。根据MacGuy对Q的观察,去除大写字母可能不适合在任何地方使用,因为它违反了惯例,并且不清楚选项是否需要后续字符串(例如,--download only
已完成,而--ini
可能需要后续路径或文件名).如果我有一大堆论点呢。编写一个手动使用语句,说明我拥有的所有可选参数,这将使处理和编写变得更加困难。另外,在将来,如果一些参数被删除,一些被添加到新的参数中,那么我认为自动生成将比手动处理usage语句更好。那么,除了在用法声明中使用元字符而不是在解释它的部分之外,还有什么其他方法可以解决这个问题呢。@RakholiyaJenish:你可以问一个适当的单独的StackOverflow问题:在当前的问题上加上解释它到底有多不同——就像你在评论中所做的那样。谢谢@J.F.Sebastian,我问了一个问题,但没有得到任何评论或答案。请你看看好吗。我不同意这个问题的前提。命令行参数通常从shell传递,按照惯例,shell脚本中的变量通常都是大写的。我认为区分大写的metavars和小写的关键字是恰当的。@TokenMacGuy根据这种惯例,我会同意的,除了不必要地重复大写(-INI,--INI-INI
)。我已经相应地更新了Q标题,因为它的重复性更令人烦恼。@MacGuy作为一个用户,您应该可以灵活地使用任何您认为合适的帮助消息。我个人觉得CAPS版本很难看,更不用说复制了。即使您打破了shell约定,也可以区分metavars,例如,git commit-h
+1,以获得最佳答案和到源代码的链接。您是否需要为可选的
方法覆盖\u get\u default\u metavar\u?在链接到它的源中,使用了相同的方法。您这样做是为了确保即使HelpFormatter以后实现了其他功能,也能使用大写字母吗?为了清晰起见,我在阅读可选的方法名时,没有对我发出尖叫声,而是加入了该方法。我猜,\u format\u args
可能会进行一些字符串格式设置。如何为可选的获取默认值\u metavar\u而不是尖叫str.upper
?当然,只是开玩笑;你说得很对。
usage: a foo bar dustup [-h] [-i INI]
optional arguments:
-h, --help show this help message and exit
-i , --ini use alternate ini file