Python argparse: valor predeterminado o valor especificado

174

Me gustaría tener un argumento opcional que tenga un valor predeterminado si solo el indicador está presente sin ningún valor especificado, pero almacena un valor especificado por el usuario en lugar del valor predeterminado si el usuario especifica un valor. ¿Ya hay una acción disponible para esto?

Un ejemplo:

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

Puedo crear una acción, pero quería ver si existía una forma de hacerlo.

Robar
fuente

Respuestas:

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='?' significa argumentos 0 o 1
  • const=1 establece el valor predeterminado cuando hay 0 argumentos
  • type=int convierte el argumento a int

Si desea test.pyestablecerlo exampleen 1 incluso si no --examplese especifica ninguno , incluya default=1. Es decir, con

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

luego

% test.py 
Namespace(example=1)
unutbu
fuente
¿Cómo hacer esto con cuerdas? Tengo un dilema con la diferenciación de "" (cadena vacía por defecto) y "" (cadena vacía según lo ingresado por el usuario). En el código, por ahora, estoy usando el predeterminado y, dado que necesito hacer algunas operaciones, tengo algo como esto self.foo = (args.bar or some_else_source).upper(). Se romperá en Ninguno objeto AFAIUC.
0andriy
16

En realidad, solo necesita usar el defaultargumento add_argumentcomo en este 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

Los detalles están aquí .

Adam Erickson
fuente
7

La diferencia entre:

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

y

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

es así:

myscript.py => la depuración es 7 (por defecto) en el primer caso y "Ninguno" en el segundo

myscript.py --debug => la depuración es 1 en cada caso

myscript.py --debug 2 => la depuración es 2 en cada caso

Murray
fuente