Décomposer les arguments de commande en une seule ligne en Python

La source

#!/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.

Commentaire

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é.

Résumé

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

Décomposer les arguments de commande en une seule ligne en Python
Comment recevoir des arguments de ligne de commande en Python
Fizzbuzz en Python (en une ligne)
Segfo python en une ligne
CGI Server (1) édition python en une ligne
[Python] Inversion de valeur booléenne en une ligne
python Remarque: déterminez si l'argument de ligne de commande est dans la liste
Une doublure en Python
Modèle pour créer des applications de ligne de commande en Python
Créez un jeu Janken en une seule ligne (python)
[Introduction à Udemy Python3 + Application] 67. Arguments de ligne de commande
Obtenez des options en Python à partir des fichiers JSON et des arguments de ligne de commande
Spécifiez une sous-commande comme argument de ligne de commande en Python
Exécuter des commandes externes avec python
Essayez LINE Notify avec Python
Exécution de commandes externes en Python
Autoriser l'installation des outils de ligne de commande en Python
Comment spécifier des arguments de ligne de commande lors du débogage avec PyCharm
[Python] Lire les arguments de ligne de commande à partir du nom de fichier ou de stdin
Appuyez sur une commande en Python (Windows)
Notation inclusive dans l'argument de la fonction Python
Exécutez la commande shell / Python dans R
Énumération des nombres premiers sur une ligne
J'ai essayé la notification de ligne en Python
[Introduction] Insérer des sauts de ligne dans Python 3
Implémenté en 1 minute! LINE Notify en Python
[Python] [3D line graph] Plusieurs données dans un graphique, valeurs d'axe en caractères
Créer une autre version de l'environnement Python conda avec une seule ligne de commande
[LLDB] Créez votre propre commande avec Python
Graphique à lignes pliées et ligne d'échelle en python
Apprenez le modèle de conception "Commande" en Python
Lisez le fichier ligne par ligne avec Python
Lisez le fichier ligne par ligne avec Python
Un serveur Web de ligne (avec CGI) en python
[Python / Tkinter] Comment passer des arguments à la commande
Combinez les arguments de la fonction python en une seule variable
[Python] Lire la ligne spécifiée dans le fichier
Notes J'ai recherché la création d'outils de ligne de commande en Python
Quadtree en Python --2
Python en optimisation
CURL en Python
[Python] Comment tester l'analyseur de ligne de commande cliquez sur
Une doublure qui produit quatre-vingt-dix-neuf en Python
Géocodage en python
SendKeys en Python
Enregistrer automatiquement les arguments de fonction dans argparse en Python
Méta-analyse en Python
Essayez d'implémenter deux piles en Python sur un seul tableau
Unittest en Python
Une doublure qui rend l'utilisation du cœur du CPU 1 à 100% en Python
Époque en Python
Discord en Python
Résumé des outils utilisés dans la ligne de commande vol.8
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Charger et exécuter la commande depuis yml avec python