Question

Comme mentionné dans les la documentation , le optparse.OptionParser utilise un IndentedHelpFormatter pour générer l'aide de l'option formatée, pour laquelle j'ai trouvé des éléments Documentation de l'API .

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

Clarification

De préférence, utilisez uniquement stdlib. Optparse fait très bien, sauf pour cette nuance de formatage, que je pense que nous devrions pouvoir corriger sans importer tout autre paquet. : -)

Était-ce utile?

La solution

Le mieux serait d’écrire un patch dans le module optparse. En attendant, vous pouvez accomplir cela avec une classe OptionParser légèrement modifiée. Ce n’est pas parfait, mais vous obtiendrez ce que vous voulez.

#!/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 le résultat obtenu 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

Autres conseils

Essayez de consulter argparse . La documentation indique qu’elle prend en charge les arguments de position et les messages d’aide plus agréables.

Je voudrais une solution propre à cela; Je n'ai pas pu en trouver un. Le OptionParser se concentre vraiment sur les options; cela ne vous donne rien de travailler avec des arguments de position, pour autant que j'ai pu trouver.

Ce que je fis fut de générer une liste de petits blocs de documentation pour chacun de mes arguments de position, en utilisant \ t s pour obtenir le bon espacement. Je les ai ensuite rejointes avec des nouvelles lignes et je les ai ajoutées à la chaîne 'usage' qui est transmise à OptionParser.

Ça a l'air bien, mais c'est ridicule, et bien sûr, la documentation finit par apparaître au-dessus de la liste des options. Je n'ai pas trouvé le moyen de contourner ce problème ni de savoir comment faire des choses complexes, c'est-à-dire qu'un ensemble d'options est décrit sous la description d'un argument de position, car elles ne s'appliquent qu'à cet argument.

J'ai examiné les méthodes d'OptionParser en corrigeant les attaques de singe et je me souviens (il y a environ un an) que cela n'aurait pas été aussi difficile, mais je ne voulais pas suivre cette voie.

La plupart du texte d'aide pour les arguments de position ressemble au format fréquemment utilisé dans les pages de manuel pour les boîtes * NIX. Consultez comment la commande 'cp' est documentée . Votre texte d'aide devrait ressembler à cela.

Sinon, tant que vous remplissez le " aide " lors de l’utilisation de l’analyseur, la documentation devrait se produire elle-même.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top