def parse_args(parser: ArgumentParser) -> Box: # get defaults defaults = {} # taken from parser_known_args code # add any action defaults that aren't present for action in parser._actions: if action.dest is not argparse.SUPPRESS: if action.default is not argparse.SUPPRESS: defaults[action.dest] = action.default # add any parser defaults that aren't present for dest in parser._defaults: defaults[dest] = parser._defaults[dest] # check if there is config & read config args = parser.parse_args() if vars(args).get("config") is not None: # load a .py config configFile = args.config spec = importlib.util.spec_from_file_location("config", configFile) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) config = module.config # merge config and override defaults defaults.update({k: v for k, v in config.items()}) # override defaults with command line params # this will get rid of defaults and only read command line args parser._defaults = {} parser._actions = {} args = parser.parse_args() defaults.update({k: v for k, v in vars(args).items()}) return boxify_dict(defaults)