Используйте nargs='?'
(или nargs='*'
если вам потребуется более одного каталога)
parser.add_argument('dir', nargs='?', default=os.getcwd())
расширенный пример:
>>> import os, argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-v', action='store_true')
_StoreTrueAction(option_strings=['-v'], dest='v', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('dir', nargs='?', default=os.getcwd())
_StoreAction(option_strings=[], dest='dir', nargs='?', const=None, default='/home/vinay', type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args('somedir -v'.split())
Namespace(dir='somedir', v=True)
>>> parser.parse_args('-v'.split())
Namespace(dir='/home/vinay', v=True)
>>> parser.parse_args(''.split())
Namespace(dir='/home/vinay', v=False)
>>> parser.parse_args(['somedir'])
Namespace(dir='somedir', v=False)
>>> parser.parse_args('somedir -h -v'.split())
usage: [-h] [-v] [dir]
positional arguments:
dir
optional arguments:
-h, --help show this help message and exit
-v
?
и*
означают тот же самые они означают в регулярных выражениях (т.е.?
требуется 0 или 1, и*
требуя 0 или больше)? Если так, то+
работает ли так же?+
, тоже работает. См. Docs.python.org/2/library/argparse.html#nargs для деталей.options.dir
, а неargs.dir
, как я пытался!Как продолжение ответа @VinaySajip. Есть дополнительные
nargs
достоинства, о которых стоит упомянуть .parser.add_argument('dir', nargs=1, default=os.getcwd())
N (целое число). N аргументов из командной строки будут собраны в список
parser.add_argument('dir', nargs='*', default=os.getcwd())
'*'. Все имеющиеся аргументы командной строки собраны в список. Обратите внимание, что обычно не имеет большого смысла иметь более одного позиционного аргумента
nargs='*'
, но возможно несколько дополнительных аргументов сnargs='*'
.parser.add_argument('dir', nargs='+', default=os.getcwd())
'+'. Как и в случае с *, все имеющиеся аргументы командной строки собраны в список. Кроме того, будет сгенерировано сообщение об ошибке, если не было хотя бы одного аргумента командной строки.
parser.add_argument('dir', nargs=argparse.REMAINDER, default=os.getcwd())
argparse.REMAINDER
, Все остальные аргументы командной строки собраны в список. Это обычно полезно для утилит командной строки, которые отправляют другим утилитам командной строкиЕсли
nargs
ключевое слово аргумент не указано, количество используемых аргументов определяется действием. Обычно это означает, что будет использован один аргумент командной строки и будет создан один элемент (не список).Редактировать (скопировано из комментария @Acumenus)
nargs='?'
Документы говорят: «?». Один аргумент будет использован из командной строки, если это возможно, и будет создан как один элемент. Если аргумент командной строки отсутствует, будет создано значение по умолчанию.источник
nargs='?'
не производит список.Generally this means a single command-line argument will be consumed and a single item (not a list) will be produced.
Надеюсь, это поможет ...nargs
, аnargs='?'
определения его. В документах говорят: «?». Один аргумент будет использован из командной строки, если это возможно, и будет создан как один элемент. Если аргумент командной строки отсутствует, будет создано значение по умолчанию.nargs=argparse.REMAINDER
иnargs='*'
, как мне кажется, они идентичны по своему действию (протестировано в Python 2.7.10 и Python 3.6.1)?parser.add_argument
также имеет переключатель требуется . Вы можете использоватьrequired=False
. Вот пример фрагмента с Python 2.7:источник