Je voudrais vérifier si un argument optionnel argparse a été défini par l'utilisateur ou non.
Puis-je vérifier en toute sécurité en utilisant isset?
Quelque chose comme ça:
if(isset(args.myArg)):
#do something
else:
#do something else
Cela fonctionne-t-il de la même manière pour les arguments de type float/int/string?
Je pourrais définir un paramètre par défaut et le vérifier (par exemple, définir myArg = -1 ou "" pour une chaîne ou "NOT_SET"). Cependant, la valeur que je souhaite utiliser n’est calculée que plus tard dans le script. Donc, je le mettrais à -1 par défaut, puis le changerais plus tard. Cela semble un peu maladroit par rapport à simplement vérifier si la valeur a été définie par l'utilisateur.
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 le tester. Mais que se passe-t-il si l'utilisateur spécifie cette chaîne? Cela compte-t-il comme paramètre ou pas?
Vous pouvez également spécifier default=argparse.SUPPRESS
. Ensuite, si l'utilisateur n'utilise pas l'argument, il n'apparaîtra pas dans l'espace de noms args
. Mais tester cela pourrait être plus compliqué:
args.foo # raises an AttributeError
hasattr(args, 'foo') # returns False
getattr(args, 'foo', 'other') # returns 'other'
En interne, la parser
conserve une liste de seen_actions
et l'utilise pour les tests "requis" et "mutuellement_exclusif". Mais il ne vous est pas disponible en dehors de parse_args
.
Je pense que l’utilisation de l’option default=argparse.SUPPRESS
a plus de sens. Ensuite, au lieu de vérifier si l'argument est not None
, on vérifie si l'argument est in
l'espace de nommage résultant.
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))
$ python argparse_test.py --foo 1
Parsed arguments: Namespace(foo='1')
foo in namespace?: True
$ python argparse_test.py
Parsed arguments: Namespace()
foo in namespace?: False
Vous pouvez vérifier un indicateur éventuellement transmis avec les options d'action de l'argument store_true
et store_false
:
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 la vérification par is not None
conditionnel. Vous vérifiez simplement True
ou False
. En savoir plus sur ces options dans la documentation ici
Si votre argument est positionnel (c'est-à-dire qu'il n'a pas de préfixe "-" ou "-", il s'agit simplement de l'argument, généralement un nom de fichier. ) alors vous pouvez utiliser le paramètre nargs pour le 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')
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 une idée plus précise de la réponse ci-dessus que j'ai utilisée et adaptée pour fonctionner pour mon programme.