Python argparse: Comment faire pour insérer un saut de ligne dans le texte de l'aide?
Je suis en utilisant argparse
en Python 2.7 pour l'analyse des options de saisie. L'une de mes options est un questionnaire à choix multiples. 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 les retours à la ligne 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}] test les arguments optionnels: -h, --help affiche ce message d'aide et quitte -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 de l'aide?
- Je n'ai pas de python 2.7 avec moi, donc je peux tester mes idées. Comment sur l'utilisation de texte d'aide dans le triple guillemets (""" """). Les nouvelles lignes de survivre en utilisant ce?
- Pas de. Le décapage est effectué au moment de l'exécution par
argparse
, et non l'interprète, afin de changer de"""..."""
ne va pas aider. - Ceci a fonctionné pour moi
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser
RawTextHelpFormatter
:Only the name of this class is considered a public API. All the methods provided by the class are considered an implementation detail.
Donc probablement pas une bonne idée, même si elle n'est pas pour déplaire, depuis la 2.7 est censé être le dernier 2.x de python et vous serez tenus de revoir beaucoup de choses pour les 3.x de toute façon. Je suis effectivement en cours d'exécution 2.6 avecargparse
installé viaeasy_install
de sorte que la documentation peut être lui-même en dehors de la date.RawDescriptionHelpFormatter
qui ne fonctionne que sur la description et l'épilogue plutôt que le texte de l'aide.RawTextHelpFormatter
, attaque et de fuite des retours à la ligne sont supprimés. Pour contourner ce problème, vous pouvez simplement ajouter deux consécutifs ou plus, les retours à la ligne; tous, mais une nouvelle ligne permettra de survivre.class Formatter( argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter): pass
et puisformatter_class=Formatter
.Si vous voulez juste pour remplacer celui de l'option, vous ne devez pas utiliser
RawTextHelpFormatter
. Au lieu de sous-classeHelpFormatter
et de fournir une intro spéciale pour les options qui doivent être manipulés "raw" (j'utilise"R|rest of help"
):Et de l'utiliser:
Toutes les autres appels à
.add_argument()
où l'aide ne démarre pas avecR|
sera enveloppé comme d'habitude.Cela fait partie de mon améliorations sur argparse. La pleine SmartFormatter prend également en charge l'ajout de
les valeurs par défaut pour toutes les options, et des matières premières d'entrée des services publics de la description. La version complète
a son propre
_split_lines
méthode, de sorte que tout formatage effectué, par exemple les chaînes de version est conservée:parser.add_argument('-v', '--version', action='version',version=get_version_str())
Est-il possible de l'étendre à ce cas?_split_lines
et préserve les sauts de ligne (pas besoin de préciser "R|" au début, si vous voulez que l'option, le patch, le_VersionAction.__call__
méthode_VersionAction.__call__
que je serais probablement voulez justeparser.exit(message=version)
au lieu d'utiliser la version mise en forme. Est-il possible de le faire sans relâcher une version patchée de copie de argparse si?__call__
dans_VersionAction
en faisantargparse._VersionAction.__call__ = smart_version
après la définition dedef smart_version(self, parser, namespace, values, option_string=None): ...
_split_lines
qui dit# this is the RawTextHelpFormatter._split_lines
est un peu trompeur. Le commentaire peut être moins déroutant si vous vous déplacez au-dessous de laif
énoncé, puisque c'est l'originalRawTextHelpFormatter
retour. Peu importe, cette réponse m'a donné exactement ce dont j'avais besoin, merci encore!class SmartFormatter(argparse.HelpFormatter): def _split_lines(self, text, width): if '\n' in text: return text.splitlines() return argparse.HelpFormatter._split_lines(self, text, width)
Désolé de ne pas sûr de la façon de préserver des espaces dans une réponse ici 🙂Un autre moyen facile de le faire est d'inclure d'habillage de texte.
Par exemple,
De cette façon, on peut éviter le vide de l'espace en face de chaque ligne de sortie.
J'ai été confronté à problème similaire (Python 2.7.6). J'ai essayé de briser description section en plusieurs lignes à l'aide de
RawTextHelpFormatter
:Et a obtenu:
Donc
RawTextHelpFormatter
n'est pas une solution. Parce que l'impression de la description telle qu'elle apparaît dans le code source, la préservation de tous les caractères espace (je veux garder onglets supplémentaires dans mon code source pour des raisons de lisibilité, mais je ne veux pas les imprimer tous. Aussi raw formateur ne pas envelopper la ligne quand c'est trop long, plus de 80 caractères par exemple).Grâce à @Anton qui a inspiré la bonne direction ci-dessus. Mais cette solution nécessite une légère modification dans l'ordre de format description section.
De toute façon, de mise en forme personnalisée est nécessaire. J'ai étendu existant
HelpFormatter
classe et emportait_fill_text
méthode comme ceci:Comparer avec le code source d'origine en provenance de argparse module:
Dans le code original de la description de l'ensemble est enveloppé. Dans la mise en forme personnalisée, au-dessus de l'ensemble du texte est divisé en plusieurs morceaux, et chacun d'eux est mis en forme de façon indépendante.
Donc, avec l'aide de la mise en forme personnalisée:
la sortie est:
HelpFormatter
est problématique, puisque le argparse développeurs seule garantie que le nom de la classe de survivre dans les futures versions de argparse. Ils ont fondamentalement écrit eux-mêmes un chèque en blanc, de sorte qu'ils peuvent changer les noms de méthode si il serait facile pour eux de le faire. Je trouve cela frustrant; le moins qu'ils pouvaient faire est exposé quelques méthodes de l'API.Je voulais avoir les deux les sauts de ligne manuels dans le texte de la description et de l'auto emballage de celui-ci; mais aucun des suggestions ici a fonctionné pour moi - j'ai donc fini par la modification de la SmartFormatter classe donnée dans les réponses ici; les problèmes avec le argparse méthode noms n'étant pas une API publique nonobstant, voici ce que j'ai (comme un fichier appelé
test.py
):C'est la façon dont il fonctionne dans la 2.7 et 3.4:
À partir de SmartFomatter décrit ci-dessus, j'ai fini pour cette solution:
Noter que curieusement, le formatter_class argument passé à haut niveau de l'analyseur n'est pas inheritated par sub_parsers, il faut passer à nouveau pour chacun créé sub_parser.
Préface
Pour cette question,
argparse.RawTextHelpFormatter
est utile pour moi.Maintenant, je veux partager comment puis-je utiliser le
argparse
.Je sais qu'il ne peut pas être reliée à la question,
mais ces questions ont été dérangé pendant un certain temps.
Donc, je veux partager mon expérience, espère que ce sera utile pour quelqu'un.
Ici nous allons.
3ème Partie Modules
colorama: pour changer la couleur du texte:
pip install colorama
Exemple
Où la classe de
FormatText
est la suivante