2012-07-16 24 views
9

¿Hay alguna manera en argparse para analizar indicadores como [+-]a,b,c,d?Python argparse toggle flags

foo.py +s -b 

debe almacenar True en el dest de s y False en el dest de b, al igual que por el hecho de Windows o Linux attribchmod.

Actualmente, estoy usando 2 argumentos separados +s y -s con store_true y store_false, respectivamente. Pero crea una ayuda fea con él una lista de cada bandera dos veces (+ -a un &)

Otra solución sería la de analizar manualmente el arg ampliado con expresiones regulares (que de alguna manera parece mucho más fácil y utilizar descripción personalizada, pero antes de hacer eso solo quería mirar a su alrededor si había algo con el que pude realizar lo mismo usando argparse sí.

Respuesta

5

puede hacer esto pasando tanto -s y +s a un solo add_argument llamada, y utilizando una acción personalizada :

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) 
+0

Genial, de alguna manera pensé que 'action' sería la clave, pero se perdió la definición de una clase de acción. – nbaztec