2012-07-16 22 views
9

Esiste un modo per argparse di analizzare flag come [+-]a,b,c,d?Python argparse toggle flags

foo.py +s -b 

dovrebbe memorizzare True nel dest di s e False nel dest di b, proprio come fatto da Windows attrib o Linux chmod.

Attualmente sto utilizzando 2 argomenti separati +s e -s con store_true e store_false, rispettivamente. Ma crea un aiuto brutto con esso messa in vendita di ogni bandiera due volte (+ a -a &)

Un'altra soluzione potrebbe essere quella di analizzare manualmente l'arg esteso con espressioni regolari (che sembra in qualche modo molto più facile e utilizzare descrizione personalizzata, ma prima di fare che volevo solo dare un'occhiata in giro se c'era qualcosa con cui ho potuto eseguire la stessa cosa usando argparse stesso.

risposta

5

È possibile farlo passando sia -s e +s ad una singola add_argument chiamata, e l'utilizzo di un'azione personalizzata :

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

Grande, in qualche modo ho pensato che "azione" sarebbe stata la chiave ma mancava la definizione di una classe di azione. – nbaztec