web-dev-qa-db-fra.com

Vérifier si l'argument optionnel argparse est défini ou non

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.

86

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
110
Honza Osobne

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.

28
hpaulj

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.

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))

Usage:

$ 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
12
Erasmus Cedernaes

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

10
Harry Sadler

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')
5
yPhil

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.

2
C.Radford