Python argparse пропустить, если не int - PullRequest
0 голосов
/ 27 декабря 2018

Я хотел бы иметь 3 необязательных позиционных аргумента (int, int, затем str).

Что я хочу:

$ ./args.py 0 100 vid
start=0
end=100
video='vid'

$ ./args.py 0 100
start=0
end=100
video=None

$ ./args.py 0
start=0
end=None
video=None

$ ./args.py vid
start=None
end=None
video='vid'

$ ./args.py
start=None
end=None
video=None

Что я пробовал:

#!/usr/bin/python3
import argparse

parser = argparse.ArgumentParser()

parser.add_argument('start', type=int, nargs='?')
parser.add_argument('end',   type=int, nargs='?')
parser.add_argument('video', type=str, nargs='?')

print(parser.parse_args())

Проблема с этим кодом:

$ ./args.py vid
usage: args.py [-h] [start] [end] [video]
args.py: error: argument start: invalid int value: 'vid'

argparse знает, что значение 'vid' не является целым числом, поэтому я бы хотел«пропустить» два первых аргумента start и end, поскольку они не совпадают.

Когда я делаю аргумент video обязательным, он работает немного лучше:

parser.add_argument('start', type=int, nargs='?')
parser.add_argument('end',   type=int, nargs='?')
parser.add_argument('video', type=str)

Демо:

# Fine!
$ ./args.py 0 100 vid
start=0
end=100
video='vid'

# Fine!
$ ./args.py vid
start=None
end=None
video='vid'

# Not fine
./args.py 
usage: args.py [-h] [start] [end] video
args.py: error: the following arguments are required: video

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

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

например

parser.add_argument('start_end_video', nargs='*')
args=parser.parse_args()
if len(args.start_end_video) == 1:
   video = args.start_end_video
elif len(args.start_end_video) == 3:
   start, end, video = args.start_end_video

и т. Д.

0 голосов
/ 27 декабря 2018

Я думаю, вам следует добавить, как называются ваши аргументы:

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('-s', '--start', type=int)
parser.add_argument('-e', '--end', type=int)
parser.add_argument('-v', '--video', type=str)

args = parser.parse_args()
for arg in vars(args):
    print(arg, '=', getattr(args, arg))

Таким образом, вы можете указать аргументы, и не может возникнуть путаницы:

$ ./args.py -s 0 -e 100 -v vid
start = 0
end = 100
video = vid
$ ./args.py -s 0 -e 100
start = 0
end = 100
video = None
$ ./args.py -s 0
start = 0
end = None
video = None
$ ./args.py -v vid
start = None
end = None
video = vid
$ ./args.py
start = None
end = None
video = None
$ ./args.py vid
usage: args.py [-h] [-s START] [-e END] [-v VIDEO]
args.py: error: unrecognized arguments: vid

Примечание: Я включил короткие псевдонимы в приведенные выше аргументы.Например, вы можете позвонить -s вместо --start.

...