2017-07-10 6 views
0

Ich habe mehrere Subparser, und ich möchte verwenden parser.error, um Fehler anzuzeigen.Get Subparser nach Name

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() 

Normalerweise kann ich main_parser.error verwenden, aber den Fehler genauer zu machen, ist die aktuelle subparser verwenden soll, zB password_subparser

Jetzt habe ich den Namen des aktuellen subparser wissen, auch bekannt als args.subparser_name

Aber ich kann nicht password_subparser von main_parser finden, irgendwelche Ideen?

ist Es gibt keine Methode, wie, main_parser.get_subparser(subparser_name)

+0

Müssen Sie? Sie erhalten die Referenz wie folgt: password_subparser = main_parser.add_subparsers (dest = 'subparser_name') 'und verwenden Sie sie wie gewohnt. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ Ich habe 10 Subparser, ich kann identifizieren, welcher Subparser verwendet wird, aber nur der Name – daisy

+0

wo definierst du '' password_subparser''? –

Antwort

2

Während nirgendwo dokumentiert, scheint es, dass Sie die subparsers durch das subparsers.choices Wörterbuch zugreifen können:

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

Wenn Sie nicht undokumentierte Feature verwenden möchten, könnten Sie einfach das entsprechende Wörterbuch erstellen, wenn Sie den 'Parser' erstellen. 'mydict ['password'] = password_subparser' usw. Besser noch schreiben Sie eine Utility-Funktion, um das für Sie zu tun. – hpaulj