Domanda

Come menzionato in i documenti il optparse.OptionParser utilizza un IndentedHelpFormatter per generare l'aiuto dell'opzione formattata, per il quale ho trovato alcuni documentazione API .

Voglio visualizzare un testo di aiuto formattato in modo simile per gli argomenti posizionali richiesti nel testo di utilizzo. Esiste un adattatore o un modello di utilizzo semplice che può essere utilizzato per una formattazione dell'argomento posizionale simile?

Chiarimento

Preferibilmente usando solo lo stdlib. Optparse fa alla grande tranne questa sfumatura di formattazione, che penso che dovremmo essere in grado di risolvere senza importare interi altri pacchetti. : -)

È stato utile?

Soluzione

La scommessa migliore sarebbe scrivere una patch sul modulo optparse. Nel frattempo, puoi farlo con una classe OptionParser leggermente modificata. Questo non è perfetto, ma otterrà ciò che vuoi.

#!/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()

E l'output che ottieni eseguendo questo:

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

Altri suggerimenti

Prova a dare un'occhiata a argparse . La documentazione afferma che supporta argomenti di posizione e messaggi di aiuto più belli.

Sarei interessato a una soluzione pulita a questo; Non sono riuscito a trovarne uno. OptionParser si concentra davvero interamente sulle opzioni; non ti dà nulla per lavorare con position args, per quanto sono stato in grado di trovare.

Quello che ho fatto è stato generare un elenco di piccoli blocchi di documentazione per ciascuno dei miei argomenti posizionali, usando \ t s per ottenere la giusta spaziatura. Poi li ho uniti con le nuove righe e l'ho aggiunto alla stringa "use" che viene passata a OptionParser.

Sembra a posto, ma sembra sciocco e, naturalmente, la documentazione finisce per apparire sopra l'elenco delle opzioni. Non ho trovato alcun modo per aggirare questo, o come fare qualsiasi cosa complessa, vale a dire un determinato set di opzioni è descritto sotto la descrizione di un arg posizionale, perché si applicano solo a quell'arg.

Ho esaminato i metodi di OptionParser di patching delle scimmie e ricordo (circa un anno fa) che non sarebbe stato così difficile, ma non volevo seguire quella strada.

La maggior parte del testo di aiuto per gli argomenti posizionali è simile al formato usato frequentemente nelle pagine man per le caselle * NIX. Dai un'occhiata a come è documentato il comando 'cp' . Il testo della guida dovrebbe assomigliare a quello.

Altrimenti fintanto che compili il " help " argomento durante l'utilizzo del parser, la documentazione dovrebbe produrre se stessa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top