[PYTHON] l'aide argparse gère le phénomène de confusion dû au format optionnel et à sa description

introduction

Bonjour rtanpo440.

L'analyseur de ligne de commande standard de Python argparse est sympa! Je suis nouveau dans Python et je n'y suis pas encore habitué, mais je pensais que l'analyseur de ligne de commande était si facile à écrire.

Et argparse générera automatiquement de l'aide pour vous. L'option -h`` --help est automatiquement ajoutée et vous pouvez la voir correctement sans avoir à ajouter_argument vous-même.

Documentation: https://docs.python.org/ja/3/library/argparse.html

problème

Cependant, il n'y a qu'un seul cas. Autrement dit, le format et la description de chaque option sont dépassés, ce qui le rend difficile à lire.

before


#!/usr/bin/python3

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-m', '--foo', help='Foo foo foo.')
parser.add_argument('-l', '--bar', nargs='+', help='Bar bar bar.')
parser.add_argument('-o', '--long-long-long-option', action='store_true', help='Just a so long option, but do nothing')
parser.parse_args()

result1.png

Par défaut, la description de chaque option semble être affichée à partir d'une position fixe quel que soit le nombre de caractères du format. Même si le format est long, il ne sera pas enveloppé et la description sera affichée sur la ligne suivante, de sorte que le format s'étendra au-delà de la colonne de description.

C'est difficile à lire !! Que dois-je faire ... Quand je regardais le document, il semble y avoir quelque chose qui s'appelle HelpFormatter. Comme son nom l'indique, il personnalise le format de l'aide et il semble que quatre sous-classes avec des fonctions telles que l'affichage des valeurs par défaut et la préservation des sauts de ligne soient fournies par défaut.

…… Mais la documentation officielle expliquait les quatre sous-classes fournies par défaut, mais je ne savais pas comment hériter et personnaliser le HelpFormatter par moi-même, alors référez-vous à son implémentation. Je l'ai essayé en tâtonnant.

Jetez un œil à HelpFormatter

L'explication sur le côté droit est affichée à la 24ème position lorsque le bord gauche de l'écran est réglé sur 0, donc quand j'ai recherché 24, j'ai trouvé quelque chose comme ça.

definition.png

self._max_help_position semble être impliqué dans ce problème. Ensuite, héritez de force de quelle classe et écrasez self._max_help_position !!

Solutions

Après de nombreuses expérimentations, le code ci-dessous a fonctionné.

Crée «ForceOneLineHelpFormatter» en héritant de «HelpFormatter».

after


#!/usr/bin/python3

import argparse

class ForceOneLineHelpFormatter(argparse.HelpFormatter):
    def __init__(self, *args, **namedargs):
        super().__init__(*args, **namedargs)
        self._max_help_position = 999

parser = argparse.ArgumentParser(formatter_class=ForceOneLineHelpFormatter)
parser.add_argument('-m', '--foo', help='Foo foo foo.')
parser.add_argument('-l', '--bar', nargs='+', help='Bar bar bar.')
parser.add_argument('-o', '--long-long-long-option', action='store_true', help='Just a so long option, but do nothing')
parser.parse_args()

J'ai mis self._max_help_position à 999 pour une raison quelconque, mais il semble qu'il soit automatiquement ajusté en interne afin qu'il n'y ait pas trop d'espace entre le format à gauche et la description à droite. En d'autres termes, si cette valeur est juste suffisamment plus grande que la largeur d'écran attendue, il n'y a pas de problème.

Et voici le résultat de son exécution avec --help.

result2.png

Oh! Bon sentiment! Mais il y a peut-être une meilleure façon ...

Sommaire

--Si l'aide d'argparse est difficile à lire en raison du format et de la description facultatifs, créez une sous-classe de ʻargparse.HelpFormatter. --Et définissez _max_help_position sur une valeur élevée telle que 999 dans init`.

Recommended Posts

l'aide argparse gère le phénomène de confusion dû au format optionnel et à sa description
Comment utiliser argparse et la différence entre optparse