Pregunta ¿Por qué en argparse, un 'verdadero' es siempre 'verdadero'? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Aquí está el script de Python más simple, llamado test.py:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--bool', default=True, type=bool, help='Bool type')
args = parser.parse_args()
print(args.bool)

Pero cuando ejecuto este código en la línea de comando:

python test.py --bool False
True

Mientras que cuando mi código dice '--bool', default=False, el argparse se ejecuta correctamente.

¿Por qué?


5
2018-06-15 07:51


origen


Respuestas:


No estás pasando en el False objeto. Estás pasando en el 'False' cadena, y eso es una cadena de longitud distinta de cero.

Solo una cadena de longitud 0 se prueba como falsa:

>>> bool('')
False
>>> bool('Any other string is True')
True
>>> bool('False')  # this includes the string 'False'
True

Usar una store_true o store_false acción en lugar. por default=True, utilizar store_false:

parser.add_argument('--bool', default=True, action='store_false', help='Bool type')

Ahora omitiendo los conjuntos de interruptor args.bool a True, utilizando --bool (sin más argumento) conjuntos args.bool a False:

python test.py
True

python test.py --bool
False

Si tu debe analizar una cadena con True o False en él, tendrás que hacerlo explícitamente:

def boolean_string(s):
    if s not in {'False', 'True'}:
        raise ValueError('Not a valid boolean string')
    return s == 'True'

y usar eso como el argumento de conversión:

parser.add_argument('--bool', default=True, type=boolean_string, help='Bool type')

en cuyo punto --bool False Funcionará como esperas que lo haga.


12
2018-06-15 07:51