Значения по умолчанию синтаксического анализатора верхнего уровня переопределяют значения по умолчанию для подпарасеров, поэтому установка значения по умолчанию func
в подпарасерах игнорируется, но значение newstate
из значений по умолчанию подпарасераправильно.
Я не думаю, что вы хотите использовать подкоманды.Подкоманды используются, когда доступные опции и позиционные аргументы изменяются в зависимости от того, какая подкоманда выбрана.Однако у вас нет других опций или позиционных аргументов.
Следующий код, кажется, делает то, что вам требуется:
import argparse
def print_state():
print "Print state"
def set_state(s):
print "Setting state to " + s
parser = argparse.ArgumentParser()
parser.add_argument('state', choices = ['ON', 'OFF'], nargs='?')
args = parser.parse_args()
if args.state is None:
print_state()
elif args.state in ('ON', 'OFF'):
set_state(args.state)
Запишите необязательные параметры для parser.add_argument
.Параметр "choices" указывает допустимые параметры, а для параметра "nargs" устанавливается значение "?"указывает, что 1 аргумент должен использоваться, если он доступен, в противном случае ни один из них не должен использоваться.
Редактировать: Если вы хотите добавить команду FORCE с аргументом и иметь отдельный текст справки для ON иКоманда OFF, тогда вам нужно использовать подкоманды.К сожалению, кажется, нет способа указать подкоманду по умолчанию.Однако вы можете обойти эту проблему, проверив пустой список аргументов и предоставив свой собственный.Вот пример кода, иллюстрирующий, что я имею в виду:
import argparse
import sys
def print_state(ignored):
print "Print state"
def set_state(s):
print "Setting state to " + s
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
on = subparsers.add_parser('ON', help = 'On help here.')
on.set_defaults(func = set_state, newstate = 'ON')
off = subparsers.add_parser('OFF', help = 'Off help here.')
off.set_defaults(func = set_state, newstate = 'OFF')
prt = subparsers.add_parser('PRINT')
prt.set_defaults(func = print_state, newstate = 'N/A')
force = subparsers.add_parser('FORCE' , help = 'Force help here.')
force.add_argument('newstate', choices = [ 'ON', 'OFF' ])
force.set_defaults(func = set_state)
if (len(sys.argv) < 2):
args = parser.parse_args(['PRINT'])
else:
args = parser.parse_args(sys.argv[1:])
args.func(args.newstate)