Distinguishing subparser arguments
Pergunta
Ok so If I have a parser like this
example = argparse.ArgumentParser(description='main parser')
example.add_argument('Kill')
subexample = example.add_subparsers()
person = subexample.add_parser('who')
person.add_argument('name')
person.add_argument('address')
animal = subexample.add_parser('what')
animal.add_argument('name')
args = parser.parse_args()
If I use args.name(), what is it going to give me? How can I specify which name I actually want? args.animal.name()? I am unsure, please help. And by the way I don't support killing animals I just didn't have many creative example I could think of.
Solução
Use set_defaults:
import argparse
example = argparse.ArgumentParser(description='main parser')
example.add_argument('Kill')
subexample = example.add_subparsers()
person = subexample.add_parser('who')
person.add_argument('name')
person.add_argument('address')
person.set_defaults(kind = 'person')
animal = subexample.add_parser('what')
animal.add_argument('name')
animal.set_defaults(kind = 'animal')
args = example.parse_args()
print(args)
Running yields
% test.py 1 who bar baz
Namespace(Kill='1', address='baz', kind='person', name='bar')
% test.py 1 what foo
Namespace(Kill='1', kind='animal', name='foo')
17:31:52 cyrano@farmer:~/test%
Outras dicas
As you can see in documentation, there is dest
argument to add_subparsers()
.
This argument tells in which variable name of the subparser must be stored.
If you use in your code:
subexample = example.add_subparsers(dest='parser_name')
Then, after parsing arguments you can use them as:
if args.parser_name == 'who':
pass
elif args.parser_name == 'what':
pass
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow