Вы можете определить пользовательский тип для проверки на допустимые значения:
from argparse import ArgumentTypeError
def passwd_len(s):
try:
s = int(s)
except ValueError:
raise ArgumentTypeError("'%s' is not an integer" % (s,))
if not (8 <= s <= 256):
raise ArgumentTypeError("%d is not between 8 and 256, inclusive" % (s,))
return s
parser.add_argument("--length", "-l", type=passwd_len)
Разница между --
и -
является одним из соглашений. Исторически, параметры были однобуквенными аргументами с префиксом -
, и группы параметров можно было объединять: -ab
было таким же, как -a -b
. Чтобы
поддерживать это соглашение и разрешать более длинные имена опций, новое соглашение
использования --
для префикса многосимвольных имен. --length
- это одна опция, а не группа из шести вариантов -l
, -e
, -n
, -g
, -t
и -h
. Длинные опции не могут быть сгруппированы.
Я бы определил опции -a
и -m
следующим образом:
group = parser.add_mutually_exclusive_group()
group.add_argument("-a", "--auto", help="auto mode", action="store_const", const="auto", dest="mode")
group.add_argument("-m", "--manual", help="manual mode", action="store_const", const="manual", dest="mode")
group.add_argument("--mode", choices=["auto", "manual"])
Теперь вместо двух логических атрибутов, которые никогда не могут иметь одинаковое значение, у вас есть только один атрибут, значение которого вы можете проверить напрямую. Подумайте о --mode
как о каноническом способе выбора режима, а -a
и -m
- как ярлыки для выбора определенного режима.