2014-01-22 7 views
6

Ist es möglich, argparse zu kombinierten Flags wie folgt zu analysieren:Python argparse kombinierte Flaggen erlauben

app.py -bcda something 

In diesem Fall würde ich will something--a und der Rest gesetzt werden würde Wahr gespeichert werden. Grundsätzlich:

app.py -b -c -d -a something 

Ich weiß, die meisten Programme erlauben dies, z.B. grep -rEw, aber wie schwer wäre es, dies mit Argarse zu tun?

Edit: Die Antwort ist, dass es darum geht, out-of-the-box. Ich habe es nicht einmal versucht.

+2

Wie Chris Barker bemerkte, ist die Antwort zu verwenden "-bcda" anstelle von "-abcd". Kombinieren ist etwas, das out of the box funktioniert. – Ray

Antwort

3

Sie können dies erreichen mit store_const:

parser = argparse.ArgumentParser() 
parser.add_argument('-a', action='store_const', const=True, default=False) 
parser.add_argument('-b', action='store_const', const=True, default=False) 
args = parser.parse_args() 

Dann Sie diese von der Kommandozeile aufrufen können entweder mit -a -b oder mit -ab (oder -a oder -b).

Edit: und wenn Sie möchten, dass eines der Flags ein Argument übernimmt, müssen Sie es als letztes Element der Kette übergeben. Also, wenn a ein Argument nimmt, müssten Sie tun -bcda something

+0

'action = 'store_true' ist prägnanter. – hpaulj

1

Hier ist, was ich mit einem wenig Googeln gefunden:

Mehr kurzen Optionen miteinander verbunden werden können, nur einen einzigen mit - Präfix, solange nur die letzte Option (oder keiner von ihnen) erfordert einen Wert:

>>> parser = argparse.ArgumentParser(prog='PROG') 
>>> parser.add_argument('-x', action='store_true') 
>>> parser.add_argument('-y', action='store_true') 
>>> parser.add_argument('-z') 
>>> parser.parse_args('-xyzZ'.split()) 
Namespace(x=True, y=True, z='Z') 

http://docs.python.org/dev/library/argparse.html#option-value-syntax