Я использую пакет 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
И если я предоставляю "ВЫКЛ" или "ON", вместо set_state
вызывается print_state
. Если я прокомментирую строку parser.set_defaults
, set_state
вызывается правильно.
Я программист на уровне подмастерья, но начинающий новичок на Python. Любые предложения о том, как я могу заставить это работать?
Изменить. Еще одна причина, по которой я рассматривал подкоманды, - это потенциальная четвертая функция, которую я рассматриваю в будущем:
"FORCE txtval": установите для состояния функции значение txtval
.