main.py
Код: Выделить всё
import argparse
from sum import prepare_arg_parser as prepare_sum_parser
from sub import prepare_arg_parser as prepare_sub_parser
parser = argparse.ArgumentParser()
sub_parsers = parser.add_subparsers(dest="command", required=True)
prepare_sum_parser(sub_parsers.add_parser("sum"))
prepare_sub_parser(sub_parsers.add_parser("sub"))
args = parser.parse_args()
args.func(args)
Код: Выделить всё
import argparse
def prepare_arg_parser(parser):
parser.set_defaults(func=do_sum)
parser.add_argument("a", type=int)
parser.add_argument("b", type=int)
def do_sum(args):
print(f"{args.a} + {args.b} = {args.a + args.b}")
Однако по мере роста списка модулей время запуска также загружается.
Я хотел бы лениво загружать каждую подкоманду, чтобы загружалось только то, что необходимо для выбранной команды.
Я пробовал что-то вроде этого:
Код: Выделить всё
import argparse
def do_sum(args):
from sum import prepare_arg_parser
parser = argparse.ArgumentParser()
prepare_arg_parser(parser)
sum_args = parser.parse_args(args)
sum_args.func(sum_args)
parser = argparse.ArgumentParser()
sub_parsers = parser.add_subparsers(dest="command", required=True)
sub_parsers.add_parser("sum").set_defaults(func=do_sum)
args, rest = parser.parse_known_args()
args.func(rest)
Другой способ — разделить каждую подкоманду на модуль «prepare argparse», который знал бы все аргументы, но, например, лениво вызывал бы функцию do_sum, но мне это не нравится, поскольку она отделяет объявление аргументов от их использования. Кроме того, он по-прежнему будет загружать много ненужных файлов.
Есть ли лениво загружаемые подкоманды?
Подробнее здесь: https://stackoverflow.com/questions/790 ... ubcommands