#!/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
Si vous donnez un argument au programme ci-dessus et que vous l'exécutez, ce sera comme suit. (Le nom du fichier est 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'}
Après cela, vous pouvez faire quelque chose comme un boîtier de commutation, et vous pouvez transporter cet objet dict tel quel.
Tout d'abord, ajoutez des sauts de ligne et des commentaires pour faciliter la compréhension.
com = { i:j for i,j in #Créer un dictionnaire
[ (i[1][1:], sys.argv[i[0]+1] if len(sys.argv)>i[0]+1 and sys.argv[i[0]+1][0]!='-' else True ) #Créer un taple
for i in enumerate(sys.argv) if i[1][0]=='-' #Indexage
]
}
L'explication vient de l'arrière. Commencez par créer un index. Si vous ne retirez que la dernière partie
optIndex = [ i for i in enumerate(sys.argv) if i[1][0] == '-' ]
Attribuez un numéro à sys.argv qui stocke les arguments de commande à l'aide de enumerate et extrayez uniquement les arguments de commande dont le premier caractère se trouve dans l'instruction if. Lorsque vous l'imprimez, cela ressemble à ceci.
$ ./test.py -a hoge -b gaga -c
optIndex: [(1, '-a'), (3, '-b'), (5, '-c')]
Ensuite, en utilisant l'index et les informations d'option, tapez sur «i» obtenu ici, créez un tapple de caractères et de valeurs d'option. En d'autres termes, ce que vous faites dans le «[]» sur les 2ème et 3ème lignes est comme «[(key, value) for i in optIndex]». La clé est plus facile
[ i[1][1:] for i in optIndex ]
Peut être pris comme. Cela ressemble à tout après le deuxième caractère de l'emplacement de la valeur optIndex. (Eh bien, vous pouvez mettre -
du premier caractère séparément)
Vient ensuite la valeur, et si vous ne prenez normalement que la valeur, procédez comme suit.
[ sys.argv[i[0] + 1] for i in optIndex ]
Spécifiez simplement la valeur suivante des informations d'index. Cependant, dans ce cas, toutes les options doivent prendre des valeurs et vous ne pouvez pas faire quelque chose comme ls -a
. Par conséquent, il est déterminé si la valeur de value ne commence pas par - et si la valeur pointée par l'index se trouve au milieu de l'argument. Si vous êtes pris dans le jugement, insérez Vrai.
values = [ sys.argv[i[0]+1 if len(sys.argv) > i[0]+1 and sys.argv[i[0]+1][0]!='-' else True ]
La deuxième ligne touche simplement ces deux. La première ligne convertit simplement les valeurs tapled dans un dictionnaire. En d'autres termes, faites simplement {i: j for i, j in optTuple}
.
Comme je l'ai expliqué au début pour mettre tout cela ensemble
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]=='-'] }
Est terminé.
Même si vous ne comprenez pas à première vue, vous pouvez le comprendre en le démontant et en le chassant par derrière. Il n'y a rien de tel que "N'est-ce pas une bibliothèque sans faire cela?"
Recommended Posts