Respostas:
A store_true
opção cria automaticamente um valor padrão False .
Da mesma forma, store_false
o padrão será True quando o argumento da linha de comando não estiver presente.
A fonte para esse comportamento é sucinta e clara: http://hg.python.org/cpython/file/2.7/Lib/argparse.py#l861
Os documentos do argparse não são claros sobre o assunto, então vou atualizá-los agora: http://hg.python.org/cpython/rev/49677cc6d83a
Raymond Hettinger já respondeu à pergunta de OP.
No entanto, meu grupo teve problemas de legibilidade ao usar "store_false". Especialmente quando novos membros se juntam ao nosso grupo. Isso ocorre porque é a maneira mais intuitiva de pensar que, quando um usuário especifica um argumento, o valor correspondente a esse argumento será Verdadeiro ou 1.
Por exemplo, se o código for -
parser.add_argument('--stop_logging', action='store_false')
O leitor de código provavelmente pode esperar que a instrução de log seja desativada quando o valor em stop_logging for true. Mas um código como o seguinte levará ao oposto do comportamento desejado -
if not stop_logging:
#log
Por outro lado, se a interface for definida da seguinte forma, a "instrução if" funciona e é mais intuitiva de ler -
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 realmente será o padrão 0
por padrão (você pode testar para verificar). Para alterar o padrão, basta adicionar default=True
à sua declaração.
Portanto, neste 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
, odest
será automaticamente definido comobar
, com base em hg.python.org/cpython/rev/49677cc6d83a . No entanto, não vejo onde esse comportamento padrão é definido no código. Sempre defini odest
argumento explicitamente. Além disso, acho que deixar a opção forbar
padrão não faz muito sentido se for . Não deveria ser neste caso?dest
--bar
--bar
store_false
dest
notbar