TL; DR
Используйте nargs
опцию или 'append'
настройку action
опции (в зависимости от того, как вы хотите, чтобы пользовательский интерфейс вел себя).
nargs
parser.add_argument('-l','--list', nargs='+', help='<Required> Set flag', required=True)
# Use like:
# python arg.py -l 1234 2345 3456 4567
nargs='+'
принимает 1 или более аргументов, nargs='*'
принимает ноль или более.
Append
parser.add_argument('-l','--list', action='append', help='<Required> Set flag', required=True)
# Use like:
# python arg.py -l 1234 -l 2345 -l 3456 -l 4567
С append
вы можете несколько раз создать список.
Не используйте type=list
!!! - Там, наверное , не ситуация , в которой вы хотели бы использовать type=list
с argparse
. Когда-либо.
Давайте более подробно рассмотрим некоторые из возможных способов сделать это и конечный результат.
import argparse
parser = argparse.ArgumentParser()
# By default it will fail with multiple arguments.
parser.add_argument('--default')
# Telling the type to be a list will also fail for multiple arguments,
# but give incorrect results for a single argument.
parser.add_argument('--list-type', type=list)
# This will allow you to provide multiple arguments, but you will get
# a list of lists which is not desired.
parser.add_argument('--list-type-nargs', type=list, nargs='+')
# This is the correct way to handle accepting multiple arguments.
# '+' == 1 or more.
# '*' == 0 or more.
# '?' == 0 or 1.
# An int is an explicit number of arguments to accept.
parser.add_argument('--nargs', nargs='+')
# To make the input integers
parser.add_argument('--nargs-int-type', nargs='+', type=int)
# An alternate way to accept multiple inputs, but you must
# provide the flag once per input. Of course, you can use
# type=int here if you want.
parser.add_argument('--append-action', action='append')
# To show the results of the given option to screen.
for _, value in parser.parse_args()._get_kwargs():
if value is not None:
print(value)
Вот результат, который вы можете ожидать:
$ python arg.py --default 1234 2345 3456 4567
...
arg.py: error: unrecognized arguments: 2345 3456 4567
$ python arg.py --list-type 1234 2345 3456 4567
...
arg.py: error: unrecognized arguments: 2345 3456 4567
$ # Quotes won't help here...
$ python arg.py --list-type "1234 2345 3456 4567"
['1', '2', '3', '4', ' ', '2', '3', '4', '5', ' ', '3', '4', '5', '6', ' ', '4', '5', '6', '7']
$ python arg.py --list-type-nargs 1234 2345 3456 4567
[['1', '2', '3', '4'], ['2', '3', '4', '5'], ['3', '4', '5', '6'], ['4', '5', '6', '7']]
$ python arg.py --nargs 1234 2345 3456 4567
['1234', '2345', '3456', '4567']
$ python arg.py --nargs-int-type 1234 2345 3456 4567
[1234, 2345, 3456, 4567]
$ # Negative numbers are handled perfectly fine out of the box.
$ python arg.py --nargs-int-type -1234 2345 -3456 4567
[-1234, 2345, -3456, 4567]
$ python arg.py --append-action 1234 --append-action 2345 --append-action 3456 --append-action 4567
['1234', '2345', '3456', '4567']
Вынос :
- Используйте
nargs
илиaction='append'
nargs
может быть более простым с точки зрения пользователя, но он может быть не интуитивным, если есть позиционные аргументы, потому что argparse
не может сказать, что должно быть позиционным аргументом, а что принадлежит nargs
; если у вас есть позиционные аргументы, то action='append'
может оказаться лучшим выбором.
- Выше справедливо только , если
nargs
дано '*'
, '+'
или '?'
. Если вы укажете целое число (например, 4
), то не будет проблем с смешиванием опций nargs
и позиционных аргументов, потому что argparse
вы точно будете знать, сколько значений ожидать для опции.
- Не используйте кавычки в командной строке 1
- Не используйте
type=list
, так как он вернет список списков
- Это происходит потому, что под капотом
argparse
используется значение type
для приведения каждого отдельного заданного вами аргументаtype
, а не совокупность всех аргументов.
- Вы можете использовать
type=int
(или что-то еще), чтобы получить список целых (или что-то еще)
1 : я не имею в виду вообще ... я имею в виду, что использование кавычек для передачи спискаargparse
- это не то, что вам нужно.