Почему argparse дает мне список в списке? - PullRequest
25 голосов
/ 03 марта 2011

Я только что заметил поведение в argparse, которое озадачило меня (наверное, я никогда не использовал его для глупого списка файлов раньше):

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('multi', action='append', nargs='+')
print(parser.parse_args())

Это дает мне вывод:

~$ ./testargs.py foo bar baz
Namespace(multi=[['foo', 'bar', 'baz']])
~$ 

Я ожидал, что multi будет ['foo', 'bar', 'baz'], а не списком в списке.Как есть, мне придется схватить args.multi[0] перед обработкой, что не имеет большого значения, но похоже на уродливую бородавку, и я хотел бы понять, почему это там.

Я такойделать что-то глупое в add_argument, или это просто неизбежная причуда?

1 Ответ

33 голосов
/ 03 марта 2011

Вы звоните

parser.add_argument('multi', action='append', nargs='+')

И он принимает все аргументы и добавляет его как один элемент в мульти-список.

Если вы хотите, чтобы он был отдельным элементом, просто неt use append

parser.add_argument('multi', nargs='+')

Из документов

'append' - хранит список и добавляет каждое значение аргумента в список.Это полезно, чтобы опция была указана несколько раз.Пример использования:

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
...