2016-03-07 69 views
15

我写了下面的示例代码来演示我的问题。自定义argparse帮助消息

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('-v', '--version', action='version', 
        version='%(prog)s 1.0') 
parser.parse_args() 

这产生了以下帮助信息。

$ python foo.py --help 
usage: foo.py [-h] [-v] 

optional arguments: 
    -h, --help  show this help message and exit 
    -v, --version show program's version number and exit 

我想定制这个帮助输出,使它能够利用所有的短语和句子,并放置句子之后的句子。换句话说,我想要这样生成帮助信息。

$ python foo.py --help 
Usage: foo.py [-h] [-v] 

Optional arguments: 
    -h, --help  Show this help message and exit. 
    -v, --version Show program's version number and exit. 

这是我可以使用argparse API控制的东西。如果是这样,怎么样?你能否提供一个小例子来说明如何做到这一点?

+0

您是否尝试过设置['help'](https://docs.python.org/3/library/argparse.html#帮帮我)? – jonrsharpe

+0

哦,我明白了 - 那么你可以将'add_help'设置为'False'并手工完成。但小写是这些事情的惯例。 – jonrsharpe

回答

14

首先:大写这些短语是为了迎合约定,而​​并非真正帮助您轻松更改这些字符串。这里有三种不同类型的字符串:帮助格式化程序中的样板文本,节标题和每个特定选项的帮助文本。所有这些字符串都是可以本地化的;你可能只是通过gettext() module support提供所有这些字符串的'大写'翻译。也就是说,如果你有足够的决心,你可以接触并替换所有这些字符串,并且read the source code a little

version操作包括默认help文本,但您可以通过设置help参数来提供自己的文本。这同样适用于help操作;如果设置了到add_help argumentFalse可以添加手动采取行动:

parser = argparse.ArgumentParser(add_help=False) 

parser.add_argument('-v', '--version', action='version', 
        version='%(prog)s 1.0', help="Show program's version number and exit.") 
parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS, 
        help='Show this help message and exit.') 

接着,optional arguments消息是组标题;每个解析器都有两个默认组,一个用于位置参数,另一个用于可选。您可以通过属性_positionals_optionals,这两者有一个title属性实现这些:

parser._positionals.title = 'Positional arguments' 
parser._optionals.title = 'Optional arguments' 

被警告,通过启动与您冒险入模块的无证私人API下划线访问的名称,并且您的代码可能会在未来的更新中崩溃

最后,要更改usage字符串,您必须继承帮助格式化程序;通过该子类中作为formatter_class argument

class CapitalisedHelpFormatter(argparse.HelpFormatter): 
    def add_usage(self, usage, actions, groups, prefix=None): 
     if prefix is None: 
      prefix = 'Usage: ' 
     return super(CapitalisedHelpFormatter, self).add_usage(
      usage, actions, groups, prefix) 

parser = argparse.ArgumentParser(formatter_class=CapitalisedHelpFormatter) 

演示,把这些放在一起:

>>> import argparse 
>>> class CapitalisedHelpFormatter(argparse.HelpFormatter): 
...  def add_usage(self, usage, actions, groups, prefix=None): 
...   if prefix is None: 
...    prefix = 'Usage: ' 
...   return super(CapitalisedHelpFormatter, self).add_usage(
...    usage, actions, groups, prefix) 
... 
>>> parser = argparse.ArgumentParser(add_help=False, formatter_class=CapitalisedHelpFormatter) 
>>> parser._positionals.title = 'Positional arguments' 
>>> parser._optionals.title = 'Optional arguments' 
>>> parser.add_argument('-v', '--version', action='version', 
...      version='%(prog)s 1.0', help="Show program's version number and exit.") 
_VersionAction(option_strings=['-v', '--version'], dest='version', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help="Show program's version number and exit.", metavar=None) 
>>> parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS, 
...      help='Show this help message and exit.') 
_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='Show this help message and exit.', metavar=None) 
>>> print(parser.format_help()) 
Usage: [-v] [-h] 

Optional arguments: 
    -v, --version Show program's version number and exit. 
    -h, --help  Show this help message and exit. 
+0

这仍然打印所有小写字母的“usage:”和“optional arguments:”。我怎样才能利用一切? –

+3

@LoneLearner:在这一点上,你真的不得不问自己这是否值得。这些值在代码库的其他地方被硬编码。我会看看是否可以做任何事情,但这可能有限制。 –

2

的Martijn有给一对夫妇的修复来考虑 - 的提供help参数和自定义格式化类。

另一个部分修复方法是在创建参数后修改帮助字符串。 add_argument创建并返回包含参数和默认值的Action对象。您可以保存一个链接,并修改Action。您还可以获取这些操作的列表,并根据此操作。

让我来举例说明,一个简单的解析器使用默认的帮助和另外一个说法,动作列表是:

In [1064]: parser._actions 
Out[1064]: 
[_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None), 
_StoreAction(option_strings=['-f', '--foo'], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)] 

我可以查看和修改help属性的任何一个:

In [1065]: parser._actions[0].help 
Out[1065]: 'show this help message and exit' 
In [1066]: parser._actions[0].help='Show this help message and exit.' 

生产这种帮助:

In [1067]: parser.parse_args(['-h']) 
usage: ipython3 [-h] [-f FOO]  
optional arguments: 
    -h, --help   Show this help message and exit. 
    -f FOO, --foo FOO 

使用parser._actions列表使用“私人”属性,有些人认为这是不明智的。但是在Python中公/私差别并不严密,可以小心打破。 Martijn通过访问parser._positionals.title来做到这一点。

另一种方式来改变该组的标题是自定义的参数组

ogroup=parser.add_argument_group('Correct Optionals Title') 
ogroup.add_argument('-v',...) 
ogroup.add_argument('-h',...)