最好的办法是编写一个用于optparse模块的补丁。与此同时,您可以使用稍微修改过的OptionParser类来实现这一点。虽然不完美,但它将能够帮助您完成所需的操作。
#!/usr/bin/env python
from optparse import OptionParser, Option, IndentedHelpFormatter
class PosOptionParser(OptionParser):
def format_help(self, formatter=None):
class Positional(object):
def __init__(self, args):
self.option_groups = []
self.option_list = args
positional = Positional(self.positional)
formatter = IndentedHelpFormatter()
formatter.store_option_strings(positional)
output = ['\n', formatter.format_heading("Positional Arguments")]
formatter.indent()
pos_help = [formatter.format_option(opt) for opt in self.positional]
pos_help = [line.replace('--','') for line in pos_help]
output += pos_help
return OptionParser.format_help(self, formatter) + ''.join(output)
def add_positional_argument(self, option):
try:
args = self.positional
except AttributeError:
args = []
args.append(option)
self.positional = args
def set_out(self, out):
self.out = out
def main():
usage = "usage: %prog [options] bar baz"
parser = PosOptionParser(usage)
parser.add_option('-f', '--foo', dest='foo',
help='Enable foo')
parser.add_positional_argument(Option('--bar', action='store_true',
help='The bar positional argument'))
parser.add_positional_argument(Option('--baz', action='store_true',
help='The baz positional argument'))
(options, args) = parser.parse_args()
if len(args) != 2:
parser.error("incorrect number of arguments")
pass
if __name__ == '__main__':
main()
以及你运行它后得到的输出:
Usage: test.py [options] bar baz
Options:
-h, --help show this help message and exit
-f FOO, --foo=FOO Enable foo
Positional Arguments:
bar The bar positional argument
baz The baz positional argument
argparse
在 2.7 标准库中。 - fmark我对这个问题很感兴趣,但是我无法想出一个干净的解决方案。OptionParser真正关注的是选项;就我所知,它没有提供任何有关位置参数的内容。
我的做法是为每个位置参数生成一个小文档块,使用\t
来获得正确的间距。然后我用换行符将它们连接起来,并将其附加到传递给OptionParser的“usage”字符串中。
看起来还不错,但感觉有些愚蠢,当然,该文档最终出现在选项列表上面。我没有找到任何方法来解决这个问题,或者如何进行复杂的操作,例如在位置参数的描述下面描述一组给定的选项,因为它们仅适用于该参数。
我曾经尝试过猴子补丁OptionParser的方法,我记得(大约一年前)那并不难,但我不想走这条路。
大多数关于位置参数的帮助文本都类似于*NIX系统中man页面经常使用的格式。看一下'cp'命令如何记录文档。你的帮助文本应该与此类似。
否则,只要在使用解析器时填写“help”参数,文档就会自动生成。