Структура допустимых значений argparse
С помощью argparse
в отношении зависимостей Python между группами, использующими argparse, у меня есть аргументная часть некоторой группы парсеров парсера - например:
group_simulate.add_argument('-P',
help='simulate FC port down',
nargs=1,
metavar='fc_port_name',
dest='simulate')
Как можно использовать выбор, чтобы ограничить выбор списком параметров следующей структуры:
1:m:"number between 1 and 10":p:"number between 1 and 4"
Я попытался использовать опцию диапазона, но не смог найти способ создать список приемлемых вариантов
примеры: юридические параметры:
test.py -P 1:m:4:p:2
не юридические параметры:
test.py -P 1:p:2
test.py -P abvds
Большое спасибо за помощь, ребята!
2 ответа
Вы можете определить пользовательский тип, который будет вызывать argparse.ArgumentTypeError
если строка не соответствует нужному формату.
def SpecialString(v):
fields = v.split(":")
# Raise a value error for any part of the string
# that doesn't match your specification. Make as many
# checks as you need. I've only included a couple here
# as examples.
if len(fields) != 5:
raise argparse.ArgumentTypeError("String must have 5 fields")
elif not (1 <= int(fields[2]) <= 10):
raise argparse.ArgumentTypeError("Field 3 must be between 1 and 10, inclusive")
else:
# If all the checks pass, just return the string as is
return v
group_simulate.add_argument('-P',
type=SpecialString,
help='simulate FC port down',
nargs=1,
metavar='fc_port_name',
dest='simulate')
ОБНОВЛЕНИЕ: вот полный пользовательский тип, чтобы проверить значение. Вся проверка выполняется в регулярном выражении, хотя оно дает только одно общее сообщение об ошибке, если какая-либо часть неверна.
def SpecialString(v):
import re # Unless you've already imported re previously
try:
return re.match("^1:m:([1-9]|10):p:(1|2|3|4)$", v).group(0)
except:
raise argparse.ArgumentTypeError("String '%s' does not match required format"%(v,))
Если я правильно понял вопрос, вы просто ищете:
group_simulate.add_argument('-P',
help='simulate FC port down',
type=int,
metavar='fc_port_name',
dest='simulate',
choices=range(1, 10)) # answer
Источник: https://docs.python.org/3/library/argparse.html#choices .