argparse almacenar falso si no se especifica

104
parser.add_argument('-auto', action='store_true')

¿Cómo puedo almacenar false si -autono está especificado? Puedo recordar vagamente que de esta manera, almacena Ninguno si no se especifica

siamii
fuente

Respuestas:

171

La store_trueopción crea automáticamente un valor predeterminado de Falso .

Asimismo, store_falsese establecerá por defecto en True cuando el argumento de la línea de comandos no esté presente.

La fuente de este comportamiento es sucinta y clara: http://hg.python.org/cpython/file/2.7/Lib/argparse.py#l861

Los documentos argparse no son claros sobre el tema, así que los actualizaré ahora: http://hg.python.org/cpython/rev/49677cc6d83a

Raymond Hettinger
fuente
2
Un par de comentarios sobre esto. Primero, parece que si la opción es -bar, entonces destse establece automáticamente en bar, según hg.python.org/cpython/rev/49677cc6d83a . Sin embargo, no veo dónde se establece este comportamiento predeterminado en el código. Siempre he establecido el destargumento explícitamente. Además, creo que dejar la opción barpredeterminada destpara la --baropción no tiene sentido si lo --bares store_false. ¿No debería destser notbaren este caso?
Faheem Mitha
4
No entendí la convención de nomenclatura contraria.
brainLoop
Estoy de acuerdo, esto es un poco confuso. De todos modos, 'store_false' o 'store_true' se especifica como acción y no como un valor predeterminado. Por lo tanto, cuando agrega este argumento al programa, se activa la acción especificada.
ady
15

Con

import argparse
parser=argparse.ArgumentParser()
parser.add_argument('-auto', action='store_true', )
args=parser.parse_args()
print(args)

corriendo

% test.py

rendimientos

Namespace(auto=False)

Entonces parece que se almacena Falsede forma predeterminada.

unutbu
fuente
3

Raymond Hettinger ya responde a la pregunta de OP.

Sin embargo, mi grupo ha experimentado problemas de legibilidad al utilizar "store_false". Especialmente cuando nuevos miembros se unen a nuestro grupo. Esto se debe a que la forma más intuitiva de pensar es que cuando un usuario especifica un argumento, el valor correspondiente a ese argumento será Verdadero o 1.

Por ejemplo, si el código es -

parser.add_argument('--stop_logging', action='store_false')

Es probable que el lector de código espere que la declaración de registro esté desactivada cuando el valor de stop_logging sea verdadero. Pero un código como el siguiente conducirá al comportamiento opuesto al deseado:

if not stop_logging:
    #log

Por otro lado, si la interfaz se define de la siguiente manera, entonces la "instrucción if" funciona y es más intuitiva de leer:

parser.add_argument('--stop_logging', action='store_true')
if not stop_logging:
    #log
MonsieurBeilto
fuente
7
Puede configurar un alias de destino, lo que mejorará la legibilidad: parser.add_argument('--stop_logging', action='store_false', dest='use_logging').
Krassi
-4

store_false en realidad se establecerá de forma 0predeterminada (puede probar para verificar). Para cambiar el valor predeterminado, simplemente agregue default=Truea su declaración.

Entonces en este caso: parser.add_argument('-auto', action='store_true', default=True)

Unix-Ninja
fuente
Este no parece ser el caso en Python 2.7 y 3.4: >>> parser.add_argument('--bar', action='store_false') _StoreFalseAction(option_strings=['--bar'], dest='bar', nargs=0, const=False, default=True, type=None, choices=None, help=None, metavar=None) >>> parser.parse_args([]) Namespace(bar=True)
Leynos
2
lo siento, ese es en realidad el comportamiento predeterminado de optparse. argparse debería tomar como valor predeterminado el inverso de la tienda. es decir, 'store_false' por defecto es 'True'.
Unix-Ninja