Почему 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']
, а не список в списке. As-is, мне придется захватить args.multi[0]
перед обработкой, что не очень важно, но похоже на уродливую бородавку, и я хотел бы понять, почему она там.
Я делаю что-то глупо в add_argument
, или это просто неизбежная причуда?
Ответы
Ответ 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'])