Я использую пакет 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
.