Argparse - Как указать подкоманду по умолчанию

Я использую пакет argparse Python 2.7, чтобы написать логику разбора параметров для инструмента командной строки. Инструмент должен принимать один из следующих аргументов:

"ON": включить функцию.
«ВЫКЛ.»: Отключение функции.
[Аргументы не предоставлены]: отображение текущего состояния функции.

Просмотр документации argparse заставил меня поверить в то, что я хотел, чтобы были определены две - возможно, три - подкоманды, поскольку эти три состояния являются взаимоисключающими и представляют различные концептуальные действия. Это моя текущая попытка кода:

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

У меня создалось впечатление, что если бы я предоставил 0 аргументов, основной синтаксический анализатор установил бы func = print_state , а если бы я предоставил 1 аргумент, основной синтаксический анализатор используйте значения по умолчанию для соответствующей подкоманды и вызовите func = set_state . Вместо этого я получаю следующую ошибку с 0 аргументами:

usage: cvsSecure.py [-h] {ON,OFF} ...
cvsSecure.py: error: too few arguments

И если я указываю «OFF» или «ON», вызывается print_state вместо set_state . Если я закомментирую строку parser.set_defaults , set_state вызывается правильно.

Я программист на уровне подмастерья, но новичок в Python. Есть предложения о том, как я могу заставить это работать?

Edit : Еще одна причина, по которой я смотрел на подкоманды, была потенциальная четвертая функция, которую я рассматриваю на будущее:

«FORCE txtval»: установить состояние функции в txtval .

20
задан Will Shipley 3 March 2011 в 06:02
поделиться