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 ç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 finalement utiliser n'est calculée que plus tard dans le script. Je le définirais donc sur -1 par défaut, puis je le mettrais à jour à autre chose plus tard. Cela semble un peu maladroit en comparaison avec le simple fait de vérifier si la valeur a été définie par l'utilisateur.
isset()
(indice: Python n'est pas PHP)? Voulez-vous dire à lahasattr()
place, peut-être? Pourquoi ne pas configurer argparse pour définir une valeur par défaut pour une option à la place?Réponses:
Je pense que les arguments optionnels (spécifiés avec
--
) sont initialisésNone
s'ils ne sont pas fournis. Vous pouvez donc tester avecis not None
. Essayez l'exemple ci-dessous:la source
default
valeur définie.default
, vous pouvez toujours définirnargs='?'
et fournir uneconst
valeur, comme décrit dans la documentation . Quand arg est absent,default
est utilisé, quand arg est donné sans valeur, alorsconst
est utilisé, sinon la valeur donnée est utilisée. Avec seulementdefault
etnargs='?'
,default
est utilisé s'il n'est pas donné,None
s'il est donné sans valeur, sinon la valeur donnée.action= "store_true"
ouaction="store_const", const="yourconst"
ne pouvez pas utiliser cet argument pour stocker une autre valeur. Cela ne fonctionnera pas lors de l'utilisation des valeurs par défaut. Dans le mien, j'ai supprimé toutes les valeurs par défaut d'argparser et géré tout dans une autre fonctiondef defaults():
où je mélange ConfigParser, ArgumentParser et les valeurs par défaut dans l'ordre que je veuxaction
. La réponse n'utilise pas deaction
. Les actions que vous mentionnez sont documentées pour se comporter d'une manière spécifique (comme vous l'avez observé). Il n'est cependant pas nécessaire de définir une action.Comme le note @Honza,
is None
c'est un bon test. C'est la valeur par défautdefault
, et l'utilisateur ne peut pas vous donner une chaîne qui la duplique.Vous pouvez en spécifier un autre
default='mydefaultvalue
et le tester. Mais que faire si l'utilisateur spécifie cette chaîne? Est-ce que cela compte 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 l'args
espace de noms. Mais des tests qui pourraient être plus compliqués:En interne, le
parser
garde une liste deseen_actions
, et l'utilise pour les tests «obligatoires» et «mutuellement_exclusifs». Mais il n'est pas disponible pour vous en dehors deparse_args
.la source
Je pense que l'utilisation de l'option
default=argparse.SUPPRESS
est la plus logique. Ensuite, au lieu de vérifier si l'argument estnot None
, on vérifie si l'argument estin
l'espace de noms résultant.Exemple:
Usage:
L'argument n'est pas fourni:la source
testfoo.py: error: argument --foo: expected one argument
--foo
sans valeur (c'est-1
à- dire dans mon exemple), vous devez spécifiernargs=0
dans laadd_argument
fonction.action='store_true'
réponse ci-dessous à la place dans mon code réel.python argparse_test.py --foo 1
?Vous pouvez vérifier un indicateur éventuellement passé avec
store_true
etstore_false
des options d'action d'argument:De cette façon, vous n'avez pas à vous soucier de la vérification par condition
is not None
. Vous vérifiez simplementTrue
ouFalse
. En savoir plus sur ces options dans la documentation icila source
Si votre argument est positionnel (c'est-à-dire qu'il n'a pas de préfixe "-" ou "-", juste l'argument, généralement un nom de fichier), vous pouvez utiliser le paramètre nargs pour ce faire:
la source
Voici ma solution pour voir si j'utilise une variable argparse
Cela pourrait donner un meilleur aperçu de la réponse ci-dessus que j'ai utilisée et adaptée pour travailler pour mon programme.
la source
Afin de répondre au commentaire de @ kcpr sur la réponse (actuellement acceptée) de @Honza Osobne
on peut d'abord vérifier si l'argument a été fourni en le comparant à l'
Namespace
objet abd fournissant l'default=argparse.SUPPRESS
option (voir les réponses de @ hpaulj et @Erasmus Cedernaes et ce document python3 ) et s'il n'a pas été fourni, puis définissez-le sur une valeur par défaut.Usage
la source
Très simple, après avoir défini la variable args par 'args = parser.parse_args ()', elle contient également toutes les données des variables du sous-ensemble args. Pour vérifier si une variable est définie ou non en supposant que 'action = "store_true" est utilisé ...
la source