Search code examples
pythonpython-3.xargparse

How to get nested dict from argument_group


I wanted different part of the program to see only the necessary args parsed.

parser = argparse.ArgumentParser()
log = parser.add_argument_group()
log.add_argument('--name')

mp = parser.add_argument_group()
mp.add_argument('--processes', type=int)

args = parser.parse_args()

I'm hoping for a dict like {'mp':{'processes'=1}, 'log':{'name'='log.log'}}, but vars(args) flatten this to {'processes'=1, 'name'='log.log'}


Solution

  • Although this is not a precise solution to the question, it returns the ideal dict.

    class Config(Namespace):
        def __setattr__(self, name, value):
            if '.' in name:
                name = name.split('.')
                name, rest = name[0], '.'.join(name[1:])
                setattr(self, name, type(self)())
                setattr(getattr(self, name), rest, value)
            else:
                super().__setattr__(name, value)
    
        def dict(self):
            dict = {}
            for k, v in self.__dict__.items():
                if isinstance(v, Config):
                    dict[k] = v.dict()
                else:
                    dict[k] = v
            return dict