2016-03-07 12 views
15

Ho scritto il seguente codice di esempio per dimostrare il mio problema.Personalizza il messaggio di aiuto argparse

import argparse 

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

Questo produce il seguente messaggio di guida.

$ 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 

voglio personalizzare questa uscita di aiuto in modo tale che capitalizza tutte le frasi e frasi, e mette periodo successivo frasi. In altre parole, voglio che il messaggio di aiuto sia generato in questo modo.

$ 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. 

È qualcosa che posso controllare utilizzando l'API argparse. Se é cosi, come? Potrebbe per favore fornire un piccolo esempio che mostra come questo può essere fatto?

+0

Hai provato l'impostazione [ 'help'] (https://docs.python.org/3/library/argparse.html# Aiuto)? – jonrsharpe

+0

Oh, capisco - quindi potresti impostare 'add_help' su' False' e ​​farlo manualmente. Ma la minuscola è la convenzione per queste cose. – jonrsharpe

risposta

14

Prima di tutto: la capitalizzazione di tali frasi è conforme alle convenzioni e lo standard argparse non è veramente utile per aiutarti a modificare facilmente queste stringhe. Qui ci sono tre diverse classi di stringhe: testo standardizzato dal formattatore della guida, titoli delle sezioni e testo di aiuto per ogni opzione specifica. Tutte queste stringhe sono localizzabili; è possibile fornire una traduzione "in maiuscolo" per tutte queste stringhe tramite lo gettext() module support. Detto questo, puoi raggiungere e sostituire tutte queste stringhe se sei sufficientemente determinato e read the source code a little.

L'azione version include un testo predefinito help, ma è possibile fornire il proprio impostando l'argomento help. Lo stesso vale per l'azione help; se si imposta la add_help argument per False è possibile aggiungere che l'azione manualmente:

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.') 

Avanti, il messaggio optional arguments è un titolo gruppo; ogni parser ha due gruppi predefiniti, uno per gli argomenti posizionali, l'altro per facoltativo. È possibile raggiungere questi dagli attributi _positionals e _optionals, entrambi i quali hanno un attributo title:

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

Essere avvertito, accedendo nomi che iniziano con un carattere di sottolineatura si sta avventurando nel non documentata API private del modulo, e il tuo codice potrebbe rompersi nei futuri aggiornamenti.

Infine, per modificare la stringa usage, è necessario creare una sottoclasse del programma di formattazione della guida; passare il sottoclasse come il 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) 

Demo, mettendo questi tutti insieme:

>>> 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

Stampa ancora "usage:" e "optional arguments:" in lettere minuscole. Come posso capitalizzare tutto? –

+3

@LoneLearner: a questo punto devi davvero chiedertelo se ne vale la pena; quei valori sono hardcoded altrove nel codebase. Darò un'occhiata se qualcosa può essere fatto, ma probabilmente ci sono dei limiti. –

2

Martijn ha dare un paio di correzioni che è venuto in mente - il che fornisce il parametro help, e un classe di formattazione personalizzata.

Un'altra correzione parziale consiste nel modificare la stringa della guida dopo aver creato l'argomento. add_argument crea e restituisce un oggetto Action che contiene i parametri e i valori predefiniti. È possibile salvare un collegamento e modificare Action. Puoi anche ottenere un elenco di tali azioni e agire in tal senso.

Permettetemi di illustrare, per un semplice parser con l'aiuto di default e un altro argomento, la lista delle azioni è:

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)] 

posso visualizzare e modificare l'attributo help di una di queste:

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.' 

produzione di questo aiuto:

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 

Utilizzando laL'elencoutilizza un attributo 'privato', che alcune persone considerano imprudente. Ma in Python quella distinzione pubblico/privato non è stretta e può essere spezzata con cura. Martijn lo sta facendo accedendo allo parser._positionals.title.

Un altro modo per cambiare quel titolo gruppo è con i gruppi di argomenti personalizzati

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