Vérifiez si l'argument optionnel argparse est défini ou non
Je voudrais vérifier si un argument argparse facultatif a été défini par l'utilisateur ou non.
Puis-je vérifier en toute sécurité en utilisant isset?
Quelque Chose comme ceci:
if(isset(args.myArg)):
#do something
else:
#do something else
Cela fonctionne-t-il de même pour les arguments de type float / int / string?
Je pourrais définir un paramètre par défaut et le vérifier (par exemple, set myArg = -1, ou "" pour une chaîne, ou"NOT_SET"). Cependant, la valeur que je veux finalement utiliser n'est calculée que plus tard dans le script. Donc, je le mettrais à -1 comme un par défaut, puis le mettre à jour vers autre chose plus tard. Cela semble un peu maladroit en comparaison avec simplement vérifier si la valeur a été définie par l'utilisateur.
6 réponses
Je pense que les arguments optionnels (spécifiés avec --) sont initialisés à None s'ils ne sont pas fournis. Vous pouvez donc tester avec is not None. Essayez l'exemple ci-dessous:
import argparse as ap
def main():
parser = ap.ArgumentParser(description="My Script")
parser.add_argument("--myArg")
args, leftovers = parser.parse_known_args()
if args.myArg is not None:
print "myArg has been set (value is %s)" % args.myArg
Comme le note @ Honza is None est un bon test. C'est la valeur par défaut default, et l'utilisateur ne peut pas vous donner une chaîne qui la duplique.
Vous pouvez spécifier un autre default='mydefaultvalue, et tester pour cela. Mais que faire si l'utilisateur spécifie cette chaîne? Ça compte aussi ou non?
, Vous pouvez également spécifier default=argparse.SUPPRESS. Ensuite, si l'utilisateur n'utilise pas l'argument, il n'apparaîtra pas dans le args espace de noms. Mais les tests qui pourraient être plus compliqués:
args.foo # raises an AttributeError
hasattr(args, 'foo') # returns False
getattr(args, 'foo', 'other') # returns 'other'
En Interne, le parser conserve une liste de seen_actions, et l'utilise pour "requis" et "mutually_exclusive' essai. Mais il n'est pas disponible à l'extérieur de parse_args.
Si votre argument est position (c'est à dire qu'il n'a pas un "-" ou un "--" préfixe, juste l'argument, généralement un nom de fichier), vous pouvez utiliser la nargs paramètre pour ce faire:
parser = argparse.ArgumentParser(description='Foo is a program that does things')
parser.add_argument('filename', nargs='?')
args = parser.parse_args()
if args.filename is not None:
print('The file name is {}'.format(args.filename))
else:
print('Oh well ; No args, no problems')
Vous pouvez vérifier un indicateur éventuellement passé avec store_true et store_false options d'action de l'argument:
import argparse
argparser = argparse.ArgumentParser()
argparser.add_argument('-flag', dest='flag_exists', action='store_true')
print argparser.parse_args([])
# Namespace(flag_exists=False)
print argparser.parse_args(['-flag'])
# Namespace(flag_exists=True)
De Cette façon, vous n'avez pas à vous soucier de vérifier par conditionnelle is not None. Vous vérifiez simplement True ou False. En savoir plus sur ces options dans les documents ici
Je pense que l'utilisation de l'option default=argparse.SUPPRESS a le plus de sens. Alors, au lieu de vérifier si l'argument est not None, on vérifie si l'argument est in résultant de l'espace de noms.
Exemple:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--foo", default=argparse.SUPPRESS)
ns = parser.parse_args()
print("Parsed arguments: {}".format(ns))
print("foo in namespace?: {}".format("foo" in ns))
Utilisation:
$ python argparse_test.py --foo 1
Parsed arguments: Namespace(foo='1')
foo in namespace?: True
L'Argument n'est pas fourni:
$ python argparse_test.py
Parsed arguments: Namespace()
foo in namespace?: False
Voici ma solution pour voir si j'utilise une variable argparse
import argparse
ap = argparse.ArgumentParser()
ap.add_argument("-1", "--first", required=True)
ap.add_argument("-2", "--second", required=True)
ap.add_argument("-3", "--third", required=False)
# Combine all arguments into a list called args
args = vars(ap.parse_args()
if args["third"] is not None:
# do something
Cela pourrait donner plus de perspicacité à la réponse ci-dessus que j'ai utilisée et adaptée pour travailler pour mon programme.