argparse
может обрабатывать это через значения по умолчанию для «скрытой» опции. Это адаптировано из примера в документации
from argparse import ArgumentParser
# Assumed definitions of HCM, SHC, cloud, and _msg
parser = ArgumentParser()
subparser = p.add_subparsers(dest='name')
subparser.add_parser("hcm").set_defaults(updater=HCM().update)
subparser.add_parser("shc").set_defaults(updater=SHC().update)
subparser.add_parser("cloud").set_defaults(updater=Cloud().update)
args = parser.parse_args()
updated = args.updater()
print("{} {}.".format(args.name, _msg(updated)))
Тогда команда типа
myscript hcm
выдаст либо
hcm was updated
, либо
hcm was already up-to-date
в качестве вывода.
Чтобы иметь возможность запускать любое подмножество из трех, я избавился бы от подпарсеров и использовал бы обычные опции. Что-то вроде
parser = ArgumentParser()
parser.add_argument("--hcm", action='append_const', const=('hcm', HCM().update), dest='updaters')
parser.add_argument("--shc", action='append_const', const=('shc', SHC().update), dest='updaters')
parser.add_argument("--cloud", action='append_const', const=('cloud', Cloud().update), dest='updaters')
parser.set_defaults(updaters=[])
args = parser.parse_args()
for name, updater in args.updaters:
updated = updater()
print("{} {}.".format(name, _msg(updated)))