Почему argparse дает мне список в списке?

Я только что заметил поведение в 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, или это просто неизбежная причуда?


person Nicholas Knight    schedule 03.03.2011    source источник


Ответы (1)


Ты звонишь

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

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

Если вы хотите, чтобы это были отдельные элементы, просто не используйте 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'])
person Senthil Kumaran    schedule 03.03.2011
comment
Ха, ты прав. У меня неправильное впечатление от документов. Может быть, мне следует посмотреть, смогу ли я отправить патч с лучшими формулировками для нескольких вещей. :) Спасибо! - person Nicholas Knight; 03.03.2011
comment
Однако обратите внимание, что без action='append' предыдущие значения будут отброшены, если параметр указан несколько раз. например argv=['--foo', 'a', 'b', '--foo', 'c'] даст Namespace(foo=['c']) за add_argument('--foo', nargs='+'). - person mic_e; 19.05.2016