Как сделать необязательное значение аргумента с помощью argparse?
Я создаю python script, где я хочу иметь аргумент, который манипулирует количеством результатов поиска, которые вы получаете в качестве вывода. В настоящее время я назвал аргумент --head
. Это функциональность, которую я хотел бы иметь:
-
Когда --head
не передается в командной строке, я бы хотел, чтобы оно по умолчанию было одним значением. В этом случае довольно большой, например 80
-
Когда --head
передается без какого-либо значения, я бы хотел, чтобы оно по умолчанию использовало другое значение. В этом случае что-то ограниченное, например 10
-
Когда --head
передается со значением, я бы хотел, чтобы он сохранил переданное значение.
Вот какой код описывает проблему:
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-h',
'--head',
dest='size',
const=80,
default=10,
action="I don't know",
help='Only print the head of the output')
>>> # OFC, that last line will fail because the action is uknown,
... # but here is how I'd like it to work
... parser.parse_args(''.split())
Namespace(size=80)
>>> parser.parse_args('--head'.split())
Namespace(size=10)
>>> parser.parse_args('--head 15'.split())
Namespace(size=15)
Я знаю, что, возможно, я могу написать для этого настраиваемое действие, но сначала хочу увидеть, есть ли поведение по умолчанию, которое делает это.
Ответы
Ответ 1
После небольшого дополнительного чтения в документации я нашел то, что мне нужно: nargs='?'
.
Это используется с действием store
и делает именно то, что я хочу.
Вот пример:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--head',
dest='size',
const=10,
default=80,
action='store',
nargs='?',
type=int,
help='Only print the head of the output')
print(parser.parse_args(''.split()))
# output: Namespace(size=80)
print(parser.parse_args('--head'.split()))
# output: Namespace(size=10)
print(parser.parse_args('--head 15'.split()))
# output: Namespace(size=15)
источник: http://docs.python.org/3.3/library/argparse.html#nargs