Опитвам се да напиша програма на Python, която може да бъде разширена от трети страни. Програмата ще се стартира от командния ред с предоставените аргументи.
За да позволя на трети страни да създават свои собствени модули, създадох следния (опростен) базов клас:
class MyBaseClass(object):
def __init__(self):
self.description = ''
self.command = ''
def get_args(self):
# code that I can't figure out to specify argparse arguments here
# args = []
# arg.append(.....)
return args
Всички аргументи, които предоставят чрез get_args(), ще бъдат добавени към подпарсер за този конкретен модул. Искам те да могат да определят всякакъв тип аргумент.
Не съм сигурен кой е най-добрият начин да декларирам и след това да получа аргументите от подкласовите модули в основната си програма. Успешно намирам всички подкласове на MyBaseClass и преминавам през тях, за да създам подпарсерите, но не мога да намеря чист начин за добавяне на отделните аргументи към подпарсера.
Ето текущия код от основната програма:
for module in find_modules():
m = module()
subparser_dict[module.__name__] = subparsers.add_parser(m.command, help=m.help)
for arg in m.get_args():
subparser_dict[module.__name__].add_argument(...)
Как мога най-добре да определя аргументите във външните модули чрез get_args() или подобен и след това да ги добавя към поданализатора? Един от моите неуспешни опити изглеждаше по следния начин, който не работи, защото се опитва да предаде всяка възможна опция на add_argument() независимо дали има стойност или е None:
subparser_dict[module.__name__].add_argument(arg['long-arg'],
action=arg['action'],
nargs=arg['nargs'],
const=arg['const'],
default=arg['default'],
type=arg['type'],
choices=arg['choices'],
required=arg['required'],
help=arg['help'],
metavar=arg['metavar'],
dest=arg['dest'],
)