#!/usr/bin/env python
import sys
com = { i:j for i,j in [ (i[1][1:], sys.argv[i[0]+1] if len(sys.argv)>i[0]+1 and sys.argv[i[0]+1][0]!='-' else True ) for i in enumerate(sys.argv) if i[1][0]=='-'] }
print com
Wenn Sie dem obigen Programm ein Argument geben und es ausführen, ist es wie folgt. (Dateiname ist test.py)
$ ./test.py -a hoge -b gaga
{'a': 'hoge', 'b':'gaga'}
$ ./test.py -a hoge -b gaga -c
{'a': 'hoge', 'c': True, 'b': 'gaga'}
Danach können Sie so etwas wie einen Schaltkasten ausführen und dieses Diktierobjekt so herumtragen, wie es ist.
Fügen Sie zunächst Zeilenumbrüche und Kommentare hinzu, um das Verständnis zu erleichtern.
com = { i:j for i,j in #Wörterbuch erstellen
[ (i[1][1:], sys.argv[i[0]+1] if len(sys.argv)>i[0]+1 and sys.argv[i[0]+1][0]!='-' else True ) #Einen Taple erstellen
for i in enumerate(sys.argv) if i[1][0]=='-' #Indizierung
]
}
Die Erklärung kommt von hinten. Erstellen Sie zunächst einen Index. Wenn Sie nur den letzten Teil herausziehen
optIndex = [ i for i in enumerate(sys.argv) if i[1][0] == '-' ]
Weisen Sie sys.argv eine Nummer zu, in der Befehlsargumente mithilfe von enumerate gespeichert werden, und extrahieren Sie nur die Befehlsargumente, deren erstes Zeichen in der if-Anweisung enthalten ist. Wenn Sie es drucken, sieht es so aus.
$ ./test.py -a hoge -b gaga -c
optIndex: [(1, '-a'), (3, '-b'), (5, '-c')]
Erstellen Sie dann mit dem hier erhaltenen Index- und Optionsinformations-Taple "i" ein Tapple aus Optionszeichen und -werten. Mit anderen Worten, was Sie in der 2. und 3. Zeile in "[]" tun, ist wie "[(Schlüssel, Wert) für i in optIndex]". Der Schlüssel ist einfacher
[ i[1][1:] for i in optIndex ]
Kann als genommen werden. Es fühlt sich wie alles nach dem zweiten Zeichen der Position des optIndex-Werts an. (Nun, Sie können -
vom ersten Zeichen separat setzen)
Als nächstes folgt der Wert. Wenn Sie normalerweise nur den Wert verwenden, gehen Sie wie folgt vor.
[ sys.argv[i[0] + 1] for i in optIndex ]
Geben Sie einfach den nächsten Wert der Indexinformationen an. In diesem Fall müssen jedoch alle Optionen Werte annehmen, und Sie können so etwas wie "ls -a" nicht ausführen. Daher wird bestimmt, ob der Wert des Werts nicht mit beginnt - und ob sich der Wert, auf den der Index zeigt, in der Mitte des Arguments befindet. Wenn Sie in das Urteil verwickelt sind, fügen Sie True ein.
values = [ sys.argv[i[0]+1 if len(sys.argv) > i[0]+1 and sys.argv[i[0]+1][0]!='-' else True ]
Die zweite Zeile tippt nur auf diese beiden. Die erste Zeile konvertiert nur die abgetasteten Werte in ein Wörterbuch. Mit anderen Worten, machen Sie einfach "{i: j für i, j in optTuple}". Wie ich am Anfang erklärt habe, um all dies zusammenzustellen
com = { i:j for i,j in [ (i[1][1:], sys.argv[i[0]+1] if len(sys.argv)>i[0]+1 and sys.argv[i[0]+1][0]!='-' else True ) for i in enumerate(sys.argv) if i[1][0]=='-'] }
Abgeschlossen.
Auch wenn Sie auf den ersten Blick nicht verstehen, können Sie es verstehen, indem Sie es zerlegen und von hinten verfolgen. Es gibt keine "Ist es nicht eine Bibliothek ohne dies zu tun?"
Recommended Posts