Python argparse переключающие флаги
Есть ли способ в argparse для разбора флагов, таких как [+-]a,b,c,d
?
foo.py +s -b
следует хранить True в dest
из s
и Ложь в dest
из b
так же, как в Windows attrib
или Linux chmod
,
В настоящее время я использую 2 отдельных аргумента +s
а также -s
с store_true
а также store_false
соответственно. Но это создает уродливую помощь с перечислением каждого флага дважды (+a & -a)
Другим обходным решением было бы вручную анализировать расширенный аргумент с помощью регулярного выражения (что почему-то кажется намного проще и использовать пользовательское описание, но перед этим я просто хотел посмотреть, есть ли что-то, с помощью чего я мог бы выполнить то же самое, используя сам argparse).
1 ответ
Вы можете сделать это, передавая оба -s
а также +s
одному add_argument
вызов, и с помощью пользовательского действия:
class ToggleAction(argparse.Action):
def __call__(self, parser, ns, values, option):
setattr(ns, self.dest, bool("-+".index(option[0])))
ap = ArgumentParser(prefix_chars='-+')
ap.add_argument('-s', '+s', action=ToggleAction, nargs=0)
ap.parse_args(['+s'])
Namespace(s=True)
ap.parse_args(['-s'])
Namespace(s=False)