Argparse Python: valeur par défaut ou valeur spécifiée

174

Je voudrais avoir un argument facultatif qui par défaut à une valeur si seul le drapeau est présent sans valeur spécifiée, mais stocker une valeur spécifiée par l'utilisateur au lieu de la valeur par défaut si l'utilisateur spécifie une valeur. Une action est-elle déjà disponible pour cela?

Un exemple:

python script.py --example
# args.example would equal a default value of 1
python script.py --example 2
# args.example would equal a default value of 2

Je peux créer une action, mais je voulais voir s'il existait un moyen de le faire.

Rob
la source

Réponses:

273
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--example', nargs='?', const=1, type=int)
args = parser.parse_args()
print(args)

% test.py 
Namespace(example=None)
% test.py --example
Namespace(example=1)
% test.py --example 2
Namespace(example=2)

  • nargs='?' signifie 0 ou 1 arguments
  • const=1 définit la valeur par défaut lorsqu'il n'y a aucun argument
  • type=int convertit l'argument en int

Si vous souhaitez test.pydéfinir examplesur 1 même si aucun --examplen'est spécifié, incluez default=1. Autrement dit, avec

parser.add_argument('--example', nargs='?', const=1, type=int, default=1)

puis

% test.py 
Namespace(example=1)
unutbu
la source
Comment faire cela avec des chaînes? J'ai un dilemme avec la différenciation de "" (chaîne vide par défaut) et "" (chaîne vide entrée par l'utilisateur). Dans le code pour l'instant, j'utilise la valeur par défaut et comme j'ai besoin de faire quelques opérations, j'ai quelque chose comme ça self.foo = (args.bar or some_else_source).upper(). Il cassera sur Aucun objet AFAIUC.
0andriy
16

En fait, il vous suffit d'utiliser l' defaultargument add_argumentcomme dans ce test.pyscript:

import argparse

if __name__ == '__main__':

    parser = argparse.ArgumentParser()
    parser.add_argument('--example', default=1)
    args = parser.parse_args()
    print(args.example)

test.py --example
% 1
test.py --example 2
% 2

Les détails sont ici .

Adam Erickson
la source
7

La différence entre:

parser.add_argument("--debug", help="Debug", nargs='?', type=int, const=1, default=7)

et

parser.add_argument("--debug", help="Debug", nargs='?', type=int, const=1)

est ainsi:

myscript.py => le débogage est 7 (par défaut) dans le premier cas et "Aucun" dans le second

myscript.py --debug => debug vaut 1 dans chaque cas

myscript.py --debug 2 => debug est 2 dans chaque cas

Murray
la source