Argparse - Como especificar um subcomando padrão
Estou usando o pacote argparse do Python 2.7 para escrever alguma lógica de análise de opção para uma ferramenta de linha de comando. A ferramenta deve aceitar um dos seguintes argumentos:
"ON": ativa uma função.
"OFF": desativa uma função.
[Nenhum argumento fornecido]: reproduz o estado atual da função.
Examinar a documentação da argparse me levou a acreditar que eu queria definir dois - possivelmente três - subcomandos, uma vez que esses três estados são mutuamente exclusivos e representam diferentes atividades conceituais. Esta é minha tentativa atual no código:
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
parser.set_defaults(func=print_state) # I think this line is wrong.
parser_on = subparsers.add_parser('ON')
parser_on.set_defaults(func=set_state, newstate='ON')
parser_off = subparsers.add_parser('OFF')
parser_off.set_defaults(func=set_state, newstate='OFF')
args = parser.parse_args()
if(args.func == set_state):
set_state(args.newstate)
elif(args.func == print_state):
print_state()
else:
args.func() # Catchall in case I add more functions later
Fiquei com a impressão de que, se fornecesse 0 argumentos, o analisador principal definiriafunc=print_state
, e se eu fornecesse 1 argumento, o analisador principal usaria os padrões do subcomando apropriado e chamariafunc=set_state
. Em vez disso, recebo o seguinte erro com 0 argumentos:
usage: cvsSecure.py [-h] {ON,OFF} ...
cvsSecure.py: error: too few arguments
E se eu fornecer "OFF" ou "ON",print_state
é chamado em vez deset_state
. Se eu comentar oparser.set_defaults
linha,set_state
é chamado corretamente.
Sou um programador em nível de viajante, mas um iniciante no Python. Alguma sugestão sobre como posso fazer isso funcionar?
Editar: Outra razão pela qual eu estava olhando para subcomandos foi uma quarta função potencial que estou considerando para o futuro:
"FORCE txtval": defina o estado da função comotxtval
.