argparse store false se non specificato


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

Come posso memorizzare false se -autonon è specificato? Ricordo vagamente che in questo modo memorizza Nessuno se non specificato

Risposte:


171

L' store_trueopzione crea automaticamente un valore predefinito False .

Allo stesso modo, store_falseverrà 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


2
Un paio di commenti su questo. Innanzitutto, sembra che se l'opzione è -bar, allora destviene automaticamente impostato su bar, in base a hg.python.org/cpython/rev/49677cc6d83a . Tuttavia, non vedo dove è impostato questo comportamento predefinito nel codice. Ho sempre impostato l' destargomento in modo esplicito. Inoltre, penso che lasciare l' barimpostazione predefinita destper l' --baropzione per non abbia davvero senso se lo --barè store_false. Non dovrebbe destessere notbarin questo caso?
Faheem Mitha

4
Non ho capito la convenzione di denominazione contrarian.
brainLoop

Sono d'accordo, questo crea un po 'di confusione. Ad ogni modo, "store_false" o "store_true" è specificato come azione e non come valore predefinito. Pertanto, quando si aggiunge questo argomento al programma, viene attivata l'azione specificata.
ady

15

Con

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

in esecuzione

% test.py

i rendimenti

Namespace(auto=False)

Quindi sembra archiviare Falseper impostazione predefinita.


3

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

7
È possibile impostare un alias di destinazione, che permetterà di migliorare la leggibilità: parser.add_argument('--stop_logging', action='store_false', dest='use_logging').
Krassi

-4

store_false verrà effettivamente impostato per impostazione 0predefinita (puoi testare per verificare). Per modificare il valore predefinito, aggiungilo default=Truealla tua dichiarazione.

Quindi in questo caso: parser.add_argument('-auto', action='store_true', default=True)


Questo non sembra essere il caso in Python 2.7 e 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
scusa, questo è in realtà il comportamento predefinito di optparse. argparse dovrebbe essere impostato come predefinito sull'inverso del negozio. ad esempio, "store_false" viene impostato su "True".
Unix-Ninja
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.