示例#1
0
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)