web-dev-qa-db-fra.com

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

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

Supposons que je dispose de 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()
136
user1062880

Edit: Veuillez consulter réponse de Quornian à cette question, qui est meilleure que la mienne et qui devrait être la réponse acceptée.

Selon le documentation argparse , le résultat de parser.parse_args(...) ne "contiendra que des attributs pour l'analyseur principal et l'analyseur secondaire sélectionné". Malheureusement, ces informations peuvent ne pas être suffisantes pour déterminer quel analyseur secondaire a été utilisé. La documentation recommande d'utiliser la méthode set_defaults(...) sur l'analyseur secondaire pour résoudre ce problème.

Par exemple, j'ai ajouté des appels à 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 tu cours

print parser.parse_args(["all"])

Le résultat est

Namespace(which='all')

Consultez la documentation add_subparsers() pour plus d'informations et un autre exemple.

68
srgerg

Une solution plus simple consiste à ajouter dest au fichier add_subparsers appel. Ceci est enterré un peu plus loin dans le documentation :

[...] S'il est nécessaire de vérifier le nom du sous-fournisseur qui a été appelé, l'argument du mot clé dest de l'appel add_subparsers () fonctionnera.

Dans votre exemple, remplacez:

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

avec:

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

Maintenant si vous courez:

print parser.parse_args(["all"])

tu auras

Namespace(command='all')
260
quornian