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)
Другие вопросы по тегам