2016-03-07 63 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',...)