J'utilise argparse
en Python 2.7 pour analyser les options d'entrée. Une de mes options est un choix multiple. Je veux faire une liste dans son texte d'aide, par exemple
from argparse import ArgumentParser
parser = ArgumentParser(description='test')
parser.add_argument('-g', choices=['a', 'b', 'g', 'd', 'e'], default='a',
help="Some option, where\n"
" a = alpha\n"
" b = beta\n"
" g = gamma\n"
" d = delta\n"
" e = epsilon")
parser.parse_args()
Cependant, argparse
supprime toutes les nouvelles lignes et les espaces consécutifs. Le résultat ressemble à
~ / Téléchargements: 52 $ python2.7 x.py -h utilisation: x.py [-h] [-g {a, b, g, d, e}] tester arguments facultatifs: -h, --help afficher ce message d'aide et quitter -g {a, b, g, d, e} Une option, où a = alpha b = bêta g = gamma d = delta e = epsilon
Comment insérer des sauts de ligne dans le texte d'aide?
argparse
, et non par l'interpréteur, donc passer à"""..."""
n'aidera pas.Réponses:
Essayez d'utiliser
RawTextHelpFormatter
:la source
Only the name of this class is considered a public API. All the methods provided by the class are considered an implementation detail.
ce n'est probablement pas une bonne idée, même si cela n'a pas d'importance, puisque 2.7 est censé être le dernier python 2.x et vous devrez de toute façon refactoriser beaucoup de choses pour 3.x. J'utilise actuellement 2.6 avecargparse
installé viaeasy_install
afin que la documentation soit elle-même obsolète.RawDescriptionHelpFormatter
qui ne fonctionne que sur la description et l'épilogue plutôt que sur le texte d'aide.RawTextHelpFormatter
, les sauts de ligne de début et de fin sont supprimés. Pour contourner ce problème, vous pouvez simplement ajouter deux ou plusieurs sauts de ligne consécutifs; toutes les lignes sauf une survivront.class Formatter( argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter): pass
et ensuiteformatter_class=Formatter
.Si vous souhaitez simplement remplacer la seule option, vous ne devez pas utiliser
RawTextHelpFormatter
. Au lieu de cela, sous-classe leHelpFormatter
et fournissez une introduction spéciale pour les options qui doivent être traitées "brutes" (j'utilise"R|rest of help"
):Et utilisez-le:
Tout autre appel à l'
.add_argument()
endroit où l'aide ne démarre pasR|
sera encapsulé normalement.Cela fait partie de mes améliorations sur argparse . Le SmartFormatter complet prend également en charge l'ajout des valeurs par défaut à toutes les options et la saisie brute de la description des utilitaires. La version complète a sa propre
_split_lines
méthode, de sorte que toute mise en forme effectuée par exemple pour les chaînes de version est préservée:la source
parser.add_argument('-v', '--version', action='version',version=get_version_str())
Est-il possible de l'étendre à ce cas?_split_lines
et conserve les sauts de ligne (pas besoin de spécifier "R |" au début, si vous voulez cette option, corrigez la_VersionAction.__call__
méthode_VersionAction.__call__
que je le souhaiterais probablement auparser.exit(message=version)
lieu d'utiliser la version formatée. Est-il possible de le faire sans publier une copie corrigée d'argparse?__call__
dans_VersionAction
en faisant ,argparse._VersionAction.__call__ = smart_version
après avoir définidef smart_version(self, parser, namespace, values, option_string=None): ...
Une autre façon simple de le faire est d'inclure un habillage de texte .
Par exemple,
De cette façon, nous pouvons éviter le long espace vide devant chaque ligne de sortie.
la source
J'ai rencontré un problème similaire (Python 2.7.6). J'ai essayé de décomposer la section de description en plusieurs lignes en utilisant
RawTextHelpFormatter
:Et j'ai:
Ce
RawTextHelpFormatter
n'est donc pas une solution. Parce qu'il imprime la description telle qu'elle apparaît dans le code source, en préservant tous les caractères d'espaces (je veux garder des onglets supplémentaires dans mon code source pour plus de lisibilité mais je ne veux pas les imprimer tous. trop long, plus de 80 caractères par exemple).Merci à @Anton qui a inspiré la bonne direction ci-dessus . Mais cette solution a besoin d'une légère modification afin de formater la section de description .
Quoi qu'il en soit, un formateur personnalisé est nécessaire. J'ai étendu la
HelpFormatter
classe existante et la_fill_text
méthode de remplacement comme ceci:Comparez avec le code source d'origine provenant du module argparse :
Dans le code d'origine, la description entière est en cours d'emballage. Dans le formateur personnalisé ci-dessus, le texte entier est divisé en plusieurs morceaux et chacun d'eux est formaté indépendamment.
Donc, à l'aide d'un formateur personnalisé:
la sortie est:
la source
HelpFormatter
-classement est problématique car les développeurs argparse garantissent seulement que le nom de classe survivra dans les futures versions d'argparse. En gros, ils se sont fait un chèque en blanc afin de pouvoir changer les noms de méthode si cela leur convient. Je trouve cela frustrant; le moins qu'ils auraient pu faire est d'exposer quelques méthodes dans l'API.Je voulais avoir à la fois des sauts de ligne manuels dans le texte de description et un habillage automatique de celui-ci; mais aucune des suggestions ici n'a fonctionné pour moi - j'ai donc fini par modifier la classe SmartFormatter donnée dans les réponses ici; les problèmes avec les noms de méthode argparse n'étant pas une API publique nonobstant, voici ce que j'ai (comme un fichier appelé
test.py
):Voici comment cela fonctionne en 2.7 et 3.4:
la source
En partant de SmartFomatter décrit ci-dessus, je suis arrivé à cette solution:
Notez que l'étrange argument formatter_class passé à l'analyseur de niveau supérieur n'est pas hérité par sub_parsers, il faut le passer à nouveau pour chaque sub_parser créé.
la source
Préface
Pour cette question,
argparse.RawTextHelpFormatter
est utile pour moi.Maintenant, je veux partager comment utiliser le
argparse
.Je sais que ce n'est peut-être pas lié à la question,
mais ces questions me dérangent depuis un moment.
Je veux donc partager mon expérience, j'espère que cela sera utile pour quelqu'un.
Et c'est parti.
Modules tiers
colorama : pour changer la couleur du texte:
pip install colorama
Exemple
Où la classe de
FormatText
est la suivantela source