问题
I just noticed a behavior in argparse that puzzled me (guess I'd never used it for a dumb list of files before):
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('multi', action='append', nargs='+')
print(parser.parse_args())
This gives me the output:
~$ ./testargs.py foo bar baz
Namespace(multi=[['foo', 'bar', 'baz']])
~$
I expected multi to be ['foo', 'bar', 'baz'], not a list within a list. As-is, I'll have to grab args.multi[0] before processing, which isn't a big deal, but feels like an ugly wart, and I'd like to understand why it's there.
Am I doing something silly in add_argument, or is this just an unavoidable quirk?
回答1:
You are calling
parser.add_argument('multi', action='append', nargs='+')
And it is taking all the arguments and appending as a single item in the multi list.
If you want it as individual items, just don't use append
parser.add_argument('multi', nargs='+')
From the docs
'append' - This stores a list, and appends each argument value to the list. This is useful to allow an option to be specified multiple times. Example usage:
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
来源:https://stackoverflow.com/questions/5176846/why-does-argparse-give-me-a-list-in-a-list