Risposte:
L' store_true
opzione crea automaticamente un valore predefinito False .
Allo stesso modo, store_false
verrà impostato su True quando l'argomento della riga di comando non è presente.
La fonte di questo comportamento è concisa e chiara: http://hg.python.org/cpython/file/2.7/Lib/argparse.py#l861
I documenti argparse non sono chiari sull'argomento, quindi li aggiornerò ora: http://hg.python.org/cpython/rev/49677cc6d83a
Raymond Hettinger ha già risposto alla domanda di OP.
Tuttavia, il mio gruppo ha riscontrato problemi di leggibilità utilizzando "store_false". Soprattutto quando nuovi membri si uniscono al nostro gruppo. Questo perché il modo più intuitivo di pensare è che quando un utente specifica un argomento, il valore corrispondente a tale argomento sarà True o 1.
Ad esempio, se il codice è:
parser.add_argument('--stop_logging', action='store_false')
Il lettore di codice potrebbe probabilmente aspettarsi che l'istruzione di registrazione sia disattivata quando il valore in stop_logging è vero. Ma un codice come il seguente porterà all'opposto del comportamento desiderato -
if not stop_logging:
#log
D'altra parte, se l'interfaccia è definita come la seguente, l '"istruzione if" funziona ed è più intuitiva da leggere -
parser.add_argument('--stop_logging', action='store_true')
if not stop_logging:
#log
parser.add_argument('--stop_logging', action='store_false', dest='use_logging')
.
store_false verrà effettivamente impostato per impostazione 0
predefinita (puoi testare per verificare). Per modificare il valore predefinito, aggiungilo default=True
alla tua dichiarazione.
Quindi in questo caso:
parser.add_argument('-auto', action='store_true', default=True)
>>> 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)
-bar
, alloradest
viene automaticamente impostato subar
, in base a hg.python.org/cpython/rev/49677cc6d83a . Tuttavia, non vedo dove è impostato questo comportamento predefinito nel codice. Ho sempre impostato l'dest
argomento in modo esplicito. Inoltre, penso che lasciare l'bar
impostazione predefinitadest
per l'--bar
opzione per non abbia davvero senso se lo--bar
èstore_false
. Non dovrebbedest
esserenotbar
in questo caso?