Comment formater l'aide de l'argument positionnel en utilisant optparse de Python?

Comme mentionné dans les documents le optparse.OptionParser utilise un IndentedHelpFormatter pour afficher l'aide de l'option formatée, pour laquelle j'ai trouvé de la documentation API .

Je veux afficher un texte d'aide au format similaire pour les arguments positionnels requis dans le texte d'utilisation. Existe-t-il un adaptateur ou un modèle d'utilisation simple qui peut être utilisé pour un formatage d'argument de position similaire?

Clarification

De préférence en utilisant uniquement le stdlib. Optparse fait grand sauf pour cette nuance de formatage, que je pense que nous devrions être en mesure de corriger sans importer d'autres paquets entiers. :-)

25
demandé sur Jonik 2009-03-13 16:16:56

4 réponses

Le meilleur pari serait d'écrire un patch pour le module optparse. En attendant, vous pouvez accomplir cela avec une classe OptionParser légèrement modifiée. Ce n'est pas parfait, mais il va obtenir ce que vous voulez faire.

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

Et la sortie que vous obtenez en exécutant ceci:

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
19
répondu Douglas Mayle 2009-03-20 00:57:55

Essayez de jeter un oeil à argparse . La Documentation indique qu'elle prend en charge les arguments de position et les messages d'aide plus agréables.

8
répondu Richard Levasseur 2016-01-28 08:01:24

Je serais intéressé par une solution propre à cela; je n'ai pas pu en trouver une. L'OptionParser se concentre vraiment entièrement sur les options; il ne vous donne rien à travailler avec les arguments de position, pour autant que j'ai pu trouver.

Ce que j'ai fait était de générer une liste de petits blocs de documentation pour chacun de mes arguments positionnels, en utilisant \ts pour obtenir le bon espacement. Ensuite, je les ai rejoints avec des nouvelles lignes, et l'ai ajouté à la chaîne 'usage' qui est passée à la OptionParser.

Ça a l'air bien, mais ça semble idiot, et bien sûr cette documentation finit par apparaître au-dessus de la liste des options. Je n'ai trouvé aucun moyen de contourner cela, ou comment faire des choses complexes, c'est-à-dire qu'un ensemble donné d'options est décrit sous la description pour un arg positionnel, car ils ne s'appliquent qu'à cet arg.

J'ai regardé les méthodes de monkey-patching OptionParser et je me souviens (c'était il y a environ un an) que cela n'aurait pas été si difficile, mais je ne voulais pas pour aller dans cette voie.

1
répondu DNS 2009-03-13 13:46:09

La plupart des textes d'aide pour les arguments positionnels ressemblent au format fréquemment utilisé dans les pages de manuel pour les boîtes * NIX. Jetez un oeil à Comment la commande' cp ' est documentée . Votre texte d'aide devrait ressembler à cela.

Sinon, tant que vous remplissez l'argument "help" en utilisant l'Analyseur, la documentation devrait se produire.

0
répondu Jon W 2009-03-13 13:32:27