argparse store false si non spécifié

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

Comment puis-je stocker false si ce -auton'est pas spécifié? Je me souviens vaguement que de cette façon, il ne stocke aucun si non spécifié

siamii
la source

Réponses:

171

L' store_trueoption crée automatiquement une valeur par défaut False .

De même, la store_falsevaleur par défaut est True lorsque l'argument de ligne de commande n'est pas présent.

La source de ce comportement est succincte et claire: http://hg.python.org/cpython/file/2.7/Lib/argparse.py#l861

La documentation argparse n'est pas claire sur le sujet, je vais donc les mettre à jour maintenant: http://hg.python.org/cpython/rev/49677cc6d83a

Raymond Hettinger
la source
2
Quelques commentaires à ce sujet. Premièrement, il semble que si l'option est -bar, alors le destest automatiquement défini sur bar, basé sur hg.python.org/cpython/rev/49677cc6d83a . Cependant, je ne vois pas où ce comportement par défaut est défini dans le code. J'ai toujours défini l' destargument explicitement. De plus, je pense que laisser barpar défaut destl' --baroption pour l' option n'a pas vraiment de sens si --barc'est le cas store_false. Cela ne devrait-il pas destêtre notbardans ce cas?
Faheem Mitha
4
Je n'ai pas compris la convention de dénomination à contre-courant.
brainLoop
Je suis d'accord, c'est un peu déroutant. Quoi qu'il en soit, «store_false» ou «store_true» est spécifié comme action et non comme valeur par défaut. Ainsi, lorsque vous ajoutez cet argument au programme, l'action spécifiée est déclenchée.
ady
15

Avec

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

fonctionnement

% test.py

rendements

Namespace(auto=False)

Il semble donc être stocké Falsepar défaut.

unutbu
la source
3

Raymond Hettinger répond déjà à la question d'OP.

Cependant, mon groupe a rencontré des problèmes de lisibilité en utilisant "store_false". Surtout lorsque de nouveaux membres rejoignent notre groupe. En effet, la manière la plus intuitive de penser est que lorsqu'un utilisateur spécifie un argument, la valeur correspondant à cet argument sera True ou 1.

Par exemple, si le code est -

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

Le lecteur de code peut s'attendre à ce que l'instruction de journalisation soit désactivée lorsque la valeur de stop_logging est vraie. Mais un code tel que le suivant conduira à l' opposé du comportement souhaité -

if not stop_logging:
    #log

D'un autre côté, si l'interface est définie comme suit, alors le "if-statement" fonctionne et est plus intuitif à lire -

parser.add_argument('--stop_logging', action='store_true')
if not stop_logging:
    #log
MonsieurBeilto
la source
7
Vous pouvez définir un alias de destination, ce qui améliorera la lisibilité: parser.add_argument('--stop_logging', action='store_false', dest='use_logging').
Krassi
-4

store_false sera en fait 0par défaut par défaut (vous pouvez tester pour vérifier). Pour modifier la valeur par défaut, ajoutez simplement default=Trueà votre déclaration.

Donc dans ce cas: parser.add_argument('-auto', action='store_true', default=True)

Unix-Ninja
la source
Cela ne semble pas être le cas dans Python 2.7 et 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
désolé, c'est en fait le comportement par défaut d'Optparse. argparse doit par défaut être l'inverse du magasin. c'est-à-dire que «store_false» est par défaut «True».
Unix-Ninja