Подтвердить что ты не робот

Как сделать необязательное значение аргумента с помощью 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)

Я знаю, что, возможно, я могу написать для этого настраиваемое действие, но сначала хочу увидеть, есть ли поведение по умолчанию, которое делает это.

4b9b3361

Ответ 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