7 votes

Accéder aux choix transmis à l'argument dans argparser?

Est-il possible d'accéder au tuple de choix passé en argument ? Si oui, comment puis-je procéder

par exemple si j'ai

parser = argparse.ArgumentParser(description='choisir l'emplacement')
parser.add_argument(
    "--location",
    choices=('ici', 'là-bas', 'n'importe où')
)
args = parser.parse_args()

puis-je accéder au tuple ('ici', 'là-bas', 'n'importe où') ?

7voto

mgilson Points 92954

Il s'avère que parser.add_argument retourne en réalité l'Action associée. Vous pouvez choisir parmi ces choix :

>>> import argparse
>>> parser = argparse.ArgumentParser(description='choisissez l'emplacement')
>>> action = parser.add_argument(
...     "--location",
...     choices=('ici', 'là', 'n'importe où')
... )
>>> action.choices
('ici', 'là', 'n'importe où')

Remarquez que (à ma connaissance) cela n'est documenté nulle part et peut être considéré comme un "détail d'implémentation" et donc susceptible de changer sans préavis, etc. etc.

Il n'existe également aucun moyen d'accéder publiquement aux actions stockées sur un ArgumentParser une fois qu'elles ont été ajoutées. Je crois qu'elles sont accessibles via parser._actions si vous êtes prêt à manipuler les détails d'implémentation (et à assumer les risques associés)...


Votre meilleure option est probablement de créer une constante pour les choix de location et ensuite l'utiliser dans votre code :

CHOIX_EMPLACEMENT = ('ici', 'là', 'n'importe où')

parser = argparse.ArgumentParser(description='choisissez l\'emplacement')
parser.add_argument(
    "--location",
    choices=CHOIX_EMPLACEMENT
)
args = parser.parse_args()

# Utilisez CHOIX_EMPLACEMENT ici...

2voto

Adam Smith Points 8269

Il pourrait y avoir une meilleure façon, mais je ne vois rien dans la documentation. Si vous connaissez l'option du parseur, vous devriez être en mesure de faire :

parser = argparse.ArgumentParser()
parser.add_argument("--location", choices=("ici", "là", "partout"))

storeaction = next(a for a in parser._actions if "--location" in a.option_strings)

storeaction.choices
# ('ici', 'là', 'partout')

Comme dans la réponse de mgilson, l'accès à l'attribut _actions n'est pas documenté et le préfixe souligné signifie "Hé, vous ne devriez probablement pas y toucher". Ne soyez pas surpris si cela casse entre les versions de Python.

1voto

hpaulj Points 6132

Sur la question de ce que add_argument renvoie, si vous effectuez des tests dans une session interactive comme ipython, le retour vous fixe:

In [73]: import argparse
In [74]: parser=argparse.ArgumentParser()
In [75]: parser.add_argument('foo',choices=['one','two','three'])
Out[75]: _StoreAction(option_strings=[], dest='foo', nargs=None, const=None, default=None, type=None, choices=['one', 'two', 'three'], help=None, metavar=None)
In [76]: _.choices
Out[76]: ['one', 'two', 'three']

Notez que d'autres méthodes comme add_argument_group, add_subparsers, add_parser, add_mutually_exclusive_group renvoient tous des objets qui peuvent être utilisés. Le fait que add_argument ne soit pas documenté comme renvoyant un objet est, je pense, une omission de la documentation. En général, les utilisateurs n'ont pas besoin de l'utiliser, mais en tant que semi-développeur, je l'utilise tout le temps. La documentation pour argparse n'est pas une spécification formelle de ce que le module peut ou ne peut pas faire; c'est plus un manuel d'instruction, un cran au-dessus d'un tutoriel, mais clairement pas une référence.

L'utilisation de parser._actions est pratique, mais un cran plus profond dans les entrailles. J'ai suivi presque tous les bogues/problèmes et je ne peux pas penser à un seul qui déclencherait un changement à ce sujet. Il y a un gros retard dans les changements potentiels, mais les développeurs ont été réduits à une quasi-immobilité par peur de créer des problèmes de compatibilité ascendante. Il est plus facile de modifier la documentation que de modifier la fonctionnalité de argparse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X