и т. д., но это пригодится, если вы начнете указывать опции для разных подпарсеров.

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

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

Просмотр документации 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. Любые предложения о том, как я могу получить это работает?

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

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

Ответы на вопрос(2)

Ваш ответ на вопрос