2017-07-10 2 views
0

J'ai plusieurs sous-lecteurs, et je voudrais utiliser parser.error pour afficher les erreurs.Get subparser par nom

main_parser = argparse.ArgumentParser() 
subparsers = main_parser.add_subparsers(dest = 'subparser_name') 

password_subparser = subparsers.add_parser('password') 
password_subparser.add_argument('--username', 
     default = None, required = False, 
     dest = "username", help='Target username') 

web_subparser = subparsers.add_parser('web') 
web_subparser.add_argument('--port', 
     default = 8765, required = False, type = int, 
     dest = "port", help='Listening port') 

args = main_parser.parse_args() 

En général, je peux utiliser main_parser.error, mais pour rendre l'erreur plus précisément, je devrais utiliser le subparser courant, par exemple password_subparser

Maintenant, je sais que le nom de la subparser actuelle, alias args.subparser_name

Mais je ne peux pas trouver password_subparser de main_parser, des idées?

Il n'y a pas méthode comme, main_parser.get_subparser(subparser_name)

+0

Avez-vous besoin? Vous obtenez la référence comme ceci 'password_subparser = main_parser.add_subparsers (dest = 'subparser_name')' et l'utilisez comme d'habitude. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ J'ai 10 sous-lecteurs, je peux identifier quel sous -parateur est utilisé, mais seulement le nom – daisy

+0

où est-ce que vous définissez '' password_subparser''? –

Répondre

2

Bien que non documenté nulle part, il semble que vous pouvez accéder aux subparsers dans le dictionnaire subparsers.choices:

>>> subparsers.choices['password'] 
ArgumentParser(prog='untitled.py password', usage=None, description=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True) 
+0

Si vous n'aimez pas utiliser une fonctionnalité non documentée, vous pouvez facilement créer le dictionnaire équivalent lors de la création du 'parser'. 'mydict ['mot de passe'] = password_subparser', etc. Mieux vaut encore écrire une fonction utilitaire pour le faire pour vous. – hpaulj