Vérifier si le sys.argv[x] est défini
Quelle serait la meilleure façon de vérifier si une variable a été transféré pour le script:
try:
sys.argv[1]
except NameError:
startingpoint = 'blah'
else:
startingpoint = sys.argv[1]
- Double Possible de Comment vérifier si un argument de ligne de commande a été réglée?
Vous devez vous connecter pour publier un commentaire.
En fin de compte, la différence entre
try, except
et les testslen(sys.argv)
n'est pas importante. Ils sont tous les deux un peu hackish par rapport àargparse
.Ce qui se passe pour moi, mais-comme une sorte de bas-budget argparse:
Vous pouvez même l'utiliser pour générer un
namedtuple
avec des valeurs par défaut pourNone
, le tout dans quatre lignes!Dans le cas où vous n'êtes pas familier avec
namedtuple
, c'est juste un tuple qui agit comme un objet, vous permettant d'accéder à ses valeurs en utilisanttup.attribute
syntaxe au lieu detup[0]
de la syntaxe.De sorte que la première ligne crée un nouveau
namedtuple
type avec des valeurs pour chacune des valeurs dansarg_names
. La deuxième ligne transmet les valeurs de laargs
dictionnaire, à l'aide deget
pour retourner une valeur par défaut lors de l'argument donné le nom n'a pas de valeur associée dans le dictionnaire.Vérifier la longueur de
sys.argv
:Certaines personnes préfèrent l'exception basée sur l'approche que vous avez suggéré (par exemple,
try: blah = sys.argv[1]; except IndexError: blah = 'blah'
), mais je ne l'aime pas comme beaucoup car il n'a pas “l'échelle” presque aussi bien (par exemple, lorsque vous souhaitez accepter deux ou trois arguments) et il peut éventuellement masquer les erreurs (par exemple, si vous avez utiliséblah = foo(sys.argv[1])
, maisfoo(...)
soulevé unIndexError
, queIndexError
sera ignoré).try, except
. Juste attendre pourfoo
votre argument jusqu'à ce que leelse
clause.argparse
.argparse.py
dans l'ensemble de ma commande de ligne de projets.try
clause... Donc, étant donné que c'est pas plus difficile (et, de l'OMI, un peu plus joli), je préfère juste vérifier la longueur (vous éviter d'avoir des gens crier à vous pour l'utilisation d'exceptions pour le contrôle de flux).try
apologiste, je dois l'admettre. J'ai simplement le sentiment qu'il exprime parfois mon intention plus clairement qu'unif
déclaration.Une autre façon je n'ai pas vu encore inscrit est de définir vos sentinelles de la valeur à l'avance. Cette méthode tire parti de Python l'évaluation différée, dans lequel vous n'avez toujours pas de fournir une
else
déclaration. Exemple:Ou si vous allez syntaxe FOU, vous pourriez utiliser Python opérateur ternaire:
C'est une banale liste Python. L'exception que vous attraper pour ce qui est IndexError, mais vous êtes mieux de simplement la vérification de la longueur la place.
Je l'utiliser - il ne manque jamais:
startingpoint
variable à partir de l'exemple, mais la question est d'attribuer un secours variable, donc j'ai juste fait le même.sys.argv[1:]:
. Cela fonctionne avec des arguments de position, tandis que le comte ne le fait pas.Une solution de travail avec une carte construit en fonction !
Ensuite vous avez juste à appeler vos paramètres comme ceci:
Vous pouvez tout simplement ajouter la valeur de argv[1], argv et de vérifier ensuite si argv[1] n'est pas égal à la chaîne que vous avez entré Exemple:
Assez proches de ce que l'auteur essayait de faire. Voici une fonction que j'utilise:
Donc une utilisation serait quelque chose comme: