Gostaria de verificar se um argumento argparse opcional foi definido pelo usuário ou não.
Posso verificar com segurança usando o isset?
Algo assim:
if(isset(args.myArg)):
#do something
else:
#do something else
Isso funciona da mesma forma para argumentos do tipo float / int / string?
Eu poderia definir um parâmetro padrão e verificá-lo (por exemplo, definir myArg = -1, ou "" para uma string, ou "NOT_SET"). No entanto, o valor que desejo usar só é calculado posteriormente no script. Portanto, eu o configuraria como -1 como padrão e, em seguida, atualizaria para algo diferente. Isso parece um pouco desajeitado em comparação a simplesmente verificar se o valor foi definido pelo usuário.
isset()
seria (dica: Python não é PHP)? Você quis dizer emhasattr()
vez disso, talvez? Por que não configurar argparse para definir um padrão para uma opção?Respostas:
Acho que os argumentos opcionais (especificados com
--
) são inicializados paraNone
se não forem fornecidos. Então você pode testar comis not None
. Experimente o exemplo abaixo:fonte
default
valor definido.default
, ainda pode definirnargs='?'
e fornecer umconst
valor, conforme descrito nos documentos . Quando o arg está ausente,default
é usado, quando arg dado o valor w / o, entãoconst
é usado, caso contrário, o valor fornecido é usado. Com apenasdefault
enargs='?'
,default
é usado se não for fornecido,None
se fornecido valor w / o, caso contrário, o valor fornecido.action= "store_true"
ouaction="store_const", const="yourconst"
não puder usar esse argumento para armazenar outro valor. Isso não funcionará ao usar padrões. No meu próprio eu removi todos os padrões do argparser e lidei com todos dentro de outra funçãodef defaults():
onde eu misturo ConfigParser, ArgumentParser e valores padrão na ordem que eu queroaction
. A resposta não usa umaction
. As ações que você menciona são documentadas para se comportarem de uma maneira específica (como você observou). Porém, não é necessário definir uma ação.Como observa @Honza,
is None
é um bom teste. É o padrãodefault
e o usuário não pode fornecer uma string que o duplique.Você pode especificar outro
default='mydefaultvalue
e testar isso. Mas e se o usuário especificar essa string? Isso conta como cenário ou não?Você também pode especificar
default=argparse.SUPPRESS
. Então, se o usuário não usar o argumento, ele não aparecerá noargs
namespace. Mas testar isso pode ser mais complicado:Internamente, o
parser
mantém uma lista deseen_actions
e a usa para testes 'obrigatórios' e 'mutuamente_exclusivos'. Mas não está disponível para você fora deparse_args
.fonte
Acho que usar a opção
default=argparse.SUPPRESS
faz mais sentido. Então, em vez de verificar se o argumento énot None
, verifica-se se o argumento éin
o namespace resultante.Exemplo:
Uso:
O argumento não é fornecido:fonte
testfoo.py: error: argument --foo: expected one argument
--foo
sem um valor (ou seja,1
no meu exemplo), você deve especificarnargs=0
naadd_argument
função.action='store_true'
resposta abaixo no meu código real.python argparse_test.py --foo 1
?Você pode verificar uma bandeira opcionalmente passou com
store_true
estore_false
opções de ação argumento:Dessa forma, você não precisa se preocupar em verificar por condicional
is not None
. Você simplesmente verificaTrue
ouFalse
. Leia mais sobre essas opções nos documentos aquifonte
Se o seu argumento for posicional (ou seja, não tem um prefixo "-" ou "-", apenas o argumento, normalmente um nome de arquivo), você pode usar o parâmetro nargs para fazer isso:
fonte
Aqui está minha solução para ver se estou usando uma variável argparse
Isso pode fornecer mais informações sobre a resposta acima, que usei e adaptei para trabalhar em meu programa.
fonte
Para responder ao comentário de @kcpr sobre a resposta (atualmente aceita) de @Honza Osobne
pode-se primeiro verificar se o argumento foi fornecido comparando-o com o
Namespace
objeto abd fornecendo adefault=argparse.SUPPRESS
opção (veja as respostas de @hpaulj e @Erasmus Cedernaes e este documento python3 ) e se não foi fornecido, defina-o com um valor padrão.Uso
fonte
Muito simples, após definir a variável args por 'args = parser.parse_args ()', ela contém todos os dados das variáveis do subconjunto args também. Para verificar se uma variável está definida ou não, assumindo que 'action = "store_true" é usado ...
fonte