web-dev-qa-db-fra.com

argparse store false si non spécifié

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

Comment puis-je stocker faux si -auto n'est pas spécifié? Je me souviens à peine que de cette façon, il n'en stocke aucun s'il n'est pas spécifié

78
siamii

L'option store_true Crée automatiquement une valeur par défaut de False .

De même, store_false Sera défini par défaut sur 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

Les documents argparse ne sont pas clairs sur le sujet, je vais donc les mettre à jour maintenant: http://hg.python.org/cpython/rev/49677cc6d83a

134
Raymond Hettinger

Avec

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

fonctionnement

% test.py

les rendements

Namespace(auto=False)

Il semble donc qu'il stocke False par défaut.

9
unutbu

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 façon 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 probablement s'attendre à ce que l'instruction de journalisation soit désactivée lorsque la valeur dans stop_logging est vraie. Mais un code tel que le suivant conduira à en face 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
0
MonsieurBeilto