有一个问题询问了它们的来源,接受的答案是教程和源代码的一堆链接。 Explanation for argparse python modul behaviour: Where do the capital placeholders come from?
这对我没有任何帮助,我想要摆脱它们,或者知道它们的目的。
例如,这样的一行:
parser.add_argument('-c', '--chunksize', type=int, help='chunk size in bits')
产生这样的垃圾:
optional arguments:
-h, --help show this help message and exit
-c CHUNKSIZE, --chunksize CHUNKSIZE
chunk size in bits
如果我尝试使用空的metavar字符串:
parser.add_argument('-c', '--chunksize', metavar='', type=int, help='chunk size in bits')
我在逗号后面加了一个空格:
optional arguments:
-h, --help show this help message and exit
-c , --chunksize chunk size in bits
答案 0 :(得分:6)
parser.add_argument('-c', '--chunksize', metavar='\b', type=int, help='chunk size in bits')
似乎有用
答案 1 :(得分:4)
您可以使格式化程序类以您想要的方式格式化参数。这不完全是直截了当的,但是这里产生了以下输出(假设@mgilson是正确的,假设您只想为命令名集显示一次metavar ...否则只需指定一个实际的{{1}它将精确显示该文本。):
metavar='value'
该类的代码和再现两个输出:
# without metavar specified:
-c, --chunksize CHUNKSIZE
chunk size in bits
# with metavar specified:
-c, --chunksize some_metavar
chunk size in bits
修改强> 要完全不显示元数,可以将空字符串传递给metavar:
import argparse
# 2.7-3.2
class SingleMetavarHelpFormatter(argparse.HelpFormatter):
def _format_action_invocation(self, action):
if not action.option_strings:
metavar, = self._metavar_formatter(action, action.dest)(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 = action.dest.upper()
args_string = self._format_args(action, default)
## THIS IS THE PART REPLACED
#~ for option_string in action.option_strings:
#~ parts.append('%s %s' % (option_string, args_string)) ### this is change
## /SECTION REPLACED
## NEW CODE:
parts.extend(action.option_strings)
parts[-1] += ' %s' % args_string
## /NEW CODE
return ', '.join(parts)
parser = argparse.ArgumentParser(
prog='PROG',
formatter_class=SingleMetavarHelpFormatter
)
parser.add_argument('-c', '--chunksize', type=int, help='no metavar specified')
parser.add_argument('-w', '--with_metavar', type=int, help='metavar specified', metavar='some_metavar')
parser.print_help()
使用原始类和新类之间的区别是在短命令语法之后缺少额外的空格字符。
parser.add_argument('-e', '--with_empty_metavar', type=int, help='empty metavar specified', metavar='')
答案 2 :(得分:0)
关于您关于大写 metavar
的目的的问题 - 文档说:
单个可选参数 --foo
后面应该跟一个命令行参数将被称为 FOO
。
这是解释,但我不得不读了很多遍才意识到它只是意味着 FOO
是提供参数的提醒,其中参数的值=FOO
。所以使用比 foo 更有用的例子:
# --days DAYS <-- from an imaginary help page
--days 365 # for a year; DAYS=365
--days 7 # for a week; DAYS=7