140 votes

argparse: identifie quel sous-vendeur a été utilisé

Je pense que cela doit être facile mais je ne comprends pas.

Supposons que j'ai l'analyseur d'arparse suivant:

 import argparse

parser = argparse.ArgumentParser( version='pyargparsetest 1.0' )
subparsers = parser.add_subparsers(help='commands')

# all
all_parser = subparsers.add_parser('all', help='process all apps')

# app
app_parser = subparsers.add_parser('app', help='process a single app')
app_parser.add_argument('appname', action='store', help='name of app to process')
 

Comment puis-je identifier quel sous-vendeur a été utilisé? appel:

 print parser.parse_args(["all"])
 

me donne un espace de noms vide:

 Namespace()
 

282voto

quornian Points 1170

Une solution plus simple est d'ajouter dest de la add_subparsers appel. C'est enterré un peu plus bas dans la documentation:

[...] S'il est nécessaire de vérifier le nom de la subparser qui a été appelée, la dest argument mot-clé à la add_subparsers() va travailler

Dans votre exemple, remplacer:

subparsers = parser.add_subparsers(help='commands')

avec:

subparsers = parser.add_subparsers(help='commands', dest='command')

Maintenant, si vous exécutez:

print parser.parse_args(["all"])

vous obtiendrez

Namespace(command='all')

71voto

srgerg Points 8142

Edit: Veuillez voir quornian la réponse à cette question, ce qui est mieux que le mien et doit être accepté de répondre.

Selon le argparse documentation le résultat d' parser.parseargs(...) seulement contiennent des attributs pour le principal et l'analyseur de la sous parser qui a été sélectionné". Malheureusement, cela peut-être pas assez d'information pour déterminer les sous-analyseur a été utilisé. La documentation recommande l'utilisation de l' set_defaults(...) méthode sur le sous-analyseur de résoudre ce problème.

Par exemple, j'ai ajouté des appels d' set_defaults() votre code:

import argparse

parser = argparse.ArgumentParser( version='pyargparsetest 1.0' )
subparsers = parser.add_subparsers(help='commands')

# all
all_parser = subparsers.add_parser('all', help='process all apps')
all_parser.set_defaults(which='all')

# app
app_parser = subparsers.add_parser('app', help='process a single app')
app_parser.add_argument('appname', action='store', help='name of app to process')
app_parser.set_defaults(which='app')

Maintenant, si vous exécutez

print parser.parse_args(["all"])

Le résultat est

Namespace(which='all')

Découvrez l' add_subparsers() documentation pour plus d'informations et un autre exemple.

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