Argumento booleano para script

79

En Python, entiendo cómo se pueden agregar argumentos int y str a los scripts.

parser=argparse.ArgumentParser(description="""Mydescription""")
parser.add_argument('-l', type=str, default='info', help='String argument')
parser.add_argument('-dt', type=int, default ='', help='int argument')

¿Qué es para los booleanos?

Básicamente, quiero pasar una bandera a mi script que le dirá al script si debe realizar una acción específica o no.

dublintech
fuente
2
¿Qué pasa con action='store_true'?
Rik Poggi
¿Qué comportamiento quieres con los booleanos? (por ejemplo, ¿con '-v verdadero' y '-v falso'?)
kennytm

Respuestas:

152

Puede usar el actionconstore_true | store_false, o puede usar un int y dejar que la conversión implícita verifique un valor booleano.

Al usar action, no pasaría un argumento --foo=truey --foo=false, simplemente lo incluiría si se configurara como verdadero.

python myProgram.py --foo

De hecho, creo que lo que quieres es

parser.add_argument('-b', action='store_true', default=False)
arándano
fuente
7
No creo que default=Falsesea ​​necesario.
Paul Draper
24
@PaulDraper: Explícito es mejor que implícito.
sberry
@PaulDraper He comprobado que no es necesario, pero puede ponerlo como un valor explícito.
Caumons
@PaulDraper ¿No es el valor predeterminado de boolean True?
Aerin
19
parser.add_argument('--foo', action='store_true')
Ned Batchelder
fuente
7
import distutils.util
ARGP.add_argument('--on', '-o', type=distutils.util.strtobool, default='true')

Ejemplo llamándolo:

$ ./myscript                # argp.on = 1
$ ./myscript --on=false     # argp.on = 0
$ ./myscript --on=False     # argp.on = 0
$ ./myscript --on=0         # argp.on = 0
$ ./myscript --on=1         # argp.on = 1
$ ./myscript -o0            # argp.on = 0
$ ./myscript -o false       # argp.on == 0

Debo mencionar que también puede vincular el argumento a una función contenedora local, para manejar alguna otra coincidencia exacta de cadenas si desea admitir valores como "sí" y "no". también puede intentar interpretar la entrada como yaml, que también puede manejar sí / no. Sin embargo, no he hecho esto en un tiempo, y creo que últimamente he apelado a argumentos mutuamente excluyentes con el mismo destvalor, uno --no-optioncon action='store_false'y otro --optionconaction='store_true'

ThorInvocador
fuente