argparse store false se não for especificado

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

Como posso armazenar false se -autonão for especificado? Posso lembrar vagamente que, desta forma, ele armazena Nenhum, se não for especificado

siamii
fonte

Respostas:

171

A store_trueopção cria automaticamente um valor padrão False .

Da mesma forma, store_falseo 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
fonte
2
Alguns comentários sobre isso. Em primeiro lugar, parece que, se a opção for -bar, o destserá automaticamente definido como bar, 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 o destargumento explicitamente. Além disso, acho que deixar a opção for barpadrão não faz muito sentido se for . Não deveria ser neste caso? dest--bar--barstore_falsedestnotbar
Faheem Mitha de
4
Eu não entendi a convenção de nomenclatura contrária.
brainLoop
Eu concordo, isso é um pouco confuso. De qualquer forma, 'store_false' ou 'store_true' é especificado como ação e não um valor padrão. Portanto, quando você adiciona esse argumento ao programa, a ação especificada é disparada.
ady
15

Com

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

corrida

% test.py

rendimentos

Namespace(auto=False)

Portanto, parece estar armazenando Falsepor padrão.

unutbu
fonte
3

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
MonsieurBeilto
fonte
7
Você pode definir um alias de destino, o que irá melhorar a legibilidade: parser.add_argument('--stop_logging', action='store_false', dest='use_logging').
Krassi de
-4

store_false realmente será o padrão 0por 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)

Unix-Ninja
fonte
Este não parece ser o caso no 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
desculpe, esse é realmente o comportamento padrão do optparse. argparse deve ser o padrão do inverso da loja. ou seja, 'store_false' é padronizado como 'True'.
Unix-Ninja de