Quelle serait la meilleure façon de vérifier si une variable a été transmise pour le script:
try:
sys.argv[1]
except NameError:
startingpoint = 'blah'
else:
startingpoint = sys.argv[1]
Quelle serait la meilleure façon de vérifier si une variable a été transmise pour le script:
try:
sys.argv[1]
except NameError:
startingpoint = 'blah'
else:
startingpoint = sys.argv[1]
Réponses:
En fin de compte, la différence entre les try, excepttests et les tests len(sys.argv)n'est pas si significative. Ils sont tous les deux un peu hackish par rapport àargparse .
Cela me vient à l'esprit - comme une sorte d'argument à petit budget:
arg_names = ['command', 'x', 'y', 'operation', 'option']
args = dict(zip(arg_names, sys.argv))
Vous pouvez même l'utiliser pour générer un namedtupleavec des valeurs par défaut None- le tout sur quatre lignes!
Arg_list = collections.namedtuple('Arg_list', arg_names)
args = Arg_list(*(args.get(arg, None) for arg in arg_names))
Au cas où vous ne seriez pas familier avec namedtuple, c'est juste un tuple qui agit comme un objet, vous permettant d'accéder à ses valeurs en utilisant la tup.attributesyntaxe au lieu de la tup[0]syntaxe.
Ainsi, la première ligne crée un nouveau namedtupletype avec des valeurs pour chacune des valeurs dans arg_names. La deuxième ligne transmet les valeurs du argsdictionnaire, en utilisant getpour renvoyer une valeur par défaut lorsque le nom d'argument donné n'a pas de valeur associée dans le dictionnaire.
Vérifiez la longueur de sys.argv:
if len(sys.argv) > 1:
blah = sys.argv[1]
else:
blah = 'blah'
Certaines personnes préfèrent l'approche basée sur les exceptions que vous avez suggérée (par exemple, try: blah = sys.argv[1]; except IndexError: blah = 'blah'), mais je ne l'aime pas autant car elle ne «s'adapte» pas aussi bien (par exemple, lorsque vous souhaitez accepter deux ou trois arguments) et il peut potentiellement masquer des erreurs (par exemple, si vous avez utilisé blah = foo(sys.argv[1]), mais foo(...)soulevé un IndexError, cela IndexErrorserait ignoré).
try, except. Attendez simplement foovotre argument jusqu'à la elseclause.
argparse.
argparse.pydans tous mes projets en ligne de commande.
tryclause ... Donc, étant donné que ce n'est pas plus difficile (et, à mon avis , un peu plus joli), je préfère juste vérifier la longueur (aussi, vous évitez d'avoir des gens crier après avoir utilisé des exceptions pour le contrôle de flux).
tryapologiste, je dois l'admettre. J'ai juste le sentiment que cela exprime parfois mon intention plus clairement qu'une ifdéclaration.
Une autre façon que je n'ai pas encore vue dans la liste est de définir votre valeur sentinelle à l'avance. Cette méthode tire parti de l'évaluation paresseuse de Python, dans laquelle vous n'avez pas toujours à fournir une elseinstruction. Exemple:
startingpoint = 'blah'
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
Ou si vous allez à la syntaxe CRAZY, vous pouvez utiliser l' opérateur ternaire de Python :
startingpoint = sys.argv[1] if len(sys.argv) >= 2 else 'blah'
J'utilise ceci - cela n'échoue jamais:
startingpoint = 'blah'
if sys.argv[1:]:
startingpoint = sys.argv[1]
startingpointvariable de l'exemple, mais la question est d'attribuer une variable de secours, donc j'ai juste fait la même chose.
sys.argv[1:]:. Cela fonctionne avec les arguments de position, contrairement à count.
C'est une liste Python ordinaire. L'exception que vous attraperiez pour cela est IndexError, mais vous feriez mieux de simplement vérifier la longueur à la place.
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
else:
startingpoint = 'blah'
Une solution fonctionnant avec la fonction intégrée de carte!
arg_names = ['command' ,'operation', 'parameter']
args = map(None, arg_names, sys.argv)
args = {k:v for (k,v) in args}
Ensuite, il vous suffit d'appeler vos paramètres comme ceci:
if args['operation'] == "division":
if not args['parameter']:
...
if args['parameter'] == "euclidian":
...
Vous pouvez simplement ajouter la valeur de argv [1] à argv puis vérifier si argv [1] n'est pas égal à la chaîne que vous avez entrée Exemple:
from sys import argv
argv.append('SomeString')
if argv[1]!="SomeString":
print(argv[1])
Assez proche de ce que l'auteur essayait de faire. Voici une fonction que j'utilise:
def get_arg(index):
try:
sys.argv[index]
except IndexError:
return ''
else:
return sys.argv[index]
Donc, une utilisation serait quelque chose comme:
if __name__ == "__main__":
banner(get_arg(1),get_arg(2))