Réponses:
L' store_true
option crée automatiquement une valeur par défaut False .
De même, la store_false
valeur 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 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
parser.add_argument('--stop_logging', action='store_false', dest='use_logging')
.
store_false sera en fait 0
par 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)
>>> 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
, alors ledest
est automatiquement défini surbar
, 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'dest
argument explicitement. De plus, je pense que laisserbar
par défautdest
l'--bar
option pour l' option n'a pas vraiment de sens si--bar
c'est le casstore_false
. Cela ne devrait-il pasdest
êtrenotbar
dans ce cas?