Użyj nargs='?'
(lub nargs='*'
jeśli będziesz potrzebować więcej niż jednego katalogu)
parser.add_argument('dir', nargs='?', default=os.getcwd())
rozszerzony przykład:
>>> 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
?
i*
oznaczają to samo, co oznaczają w wyrażeniach regularnych (tj.?
Wymaga 0 lub 1 i*
wymaga 0 lub więcej)? Jeśli tak, czy również+
działa?+
działa. Szczegóły znajdują się w docs.python.org/2/library/argparse.html#nargs .options.dir
, nieargs.dir
, tak jak próbowałem!Jako rozszerzenie odpowiedzi @VinaySajip. Są dodatkowe
nargs
warte wspomnienia .parser.add_argument('dir', nargs=1, default=os.getcwd())
N (liczba całkowita). N argumentów z wiersza poleceń zostanie zebranych razem na liście
parser.add_argument('dir', nargs='*', default=os.getcwd())
„*”. Wszystkie obecne argumenty wiersza poleceń są gromadzone na liście. Zauważ , że generalnie nie ma większego sensu mieć więcej niż jeden argument pozycyjny z
nargs='*'
, alenargs='*'
możliwe jest wiele opcjonalnych argumentów z .parser.add_argument('dir', nargs='+', default=os.getcwd())
„+”. Podobnie jak „*” wszystkie obecne argumenty wiersza poleceń są gromadzone na liście. Ponadto zostanie wygenerowany komunikat o błędzie, jeśli nie będzie co najmniej jednego argumentu wiersza polecenia.
parser.add_argument('dir', nargs=argparse.REMAINDER, default=os.getcwd())
argparse.REMAINDER
. Wszystkie pozostałe argumenty wiersza poleceń są zebrane w listę. Jest to zwykle przydatne w przypadku narzędzi wiersza polecenia, które są wysyłane do innych narzędzi wiersza poleceniaJeśli
nargs
nie podano argumentu słowa kluczowego, liczba wykorzystanych argumentów jest określona przez działanie. Ogólnie oznacza to, że zużyty zostanie jeden argument wiersza poleceń i zostanie wygenerowany pojedynczy element (nie lista).Edytuj (skopiowane z komentarza @Acumenus)
nargs='?'
Dokumenty mówią: „?”. Jeden argument zostanie wykorzystany z wiersza poleceń, jeśli to możliwe, i zostanie wygenerowany jako pojedynczy element. Jeśli nie ma argumentu wiersza poleceń, zostanie wygenerowana wartość domyślna.źródło
nargs='?'
nie tworzy listy.Generally this means a single command-line argument will be consumed and a single item (not a list) will be produced.
Mam nadzieję, że to pomoże ...nargs
, alenargs='?'
definiuje go. W docs powiedzieć: '?'. Jeden argument zostanie wykorzystany z linii poleceń, jeśli to możliwe, i zostanie wygenerowany jako pojedynczy element. Jeśli nie ma argumentu wiersza poleceń, zostanie wygenerowana wartość domyślna.nargs=argparse.REMAINDER
inargs='*'
, jak mi się wydaje, są identyczne pod względem działania (testowane w Python 2.7.10 i Python 3.6.1)?parser.add_argument
wymaga również przełącznika . Możesz użyćrequired=False
. Oto przykładowy fragment kodu w Pythonie 2.7:źródło