Как использовать Python argparse для ленивой загрузки подкомандPython

Программы на Python
Ответить
Anonymous
 Как использовать Python argparse для ленивой загрузки подкоманд

Сообщение Anonymous »

У меня есть пакет Python с множеством подкоманд и подкоманд. Он организован примерно так:
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)
sum.py

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»