Source code for catalyst.utils.parser

import copy
from pathlib import Path

from .config import load_config
from .dict import merge_dicts

[docs]def parse_config_args(*, config, args, unknown_args): """@TODO: Docs. Contribution is welcome.""" for arg in unknown_args: arg_name, value = arg.split("=") arg_name = arg_name.lstrip("-").strip("/") value_content, value_type = value.rsplit(":", 1) if "/" in arg_name: arg_names = arg_name.split("/") if value_type == "str": arg_value = value_content if arg_value.lower() == "none": arg_value = None else: arg_value = eval("%s(%s)" % (value_type, value_content)) config_ = config for arg_name in arg_names[:-1]: if arg_name not in config_: config_[arg_name] = {} config_ = config_[arg_name] config_[arg_names[-1]] = arg_value else: if value_type == "str": arg_value = value_content else: arg_value = eval("%s(%s)" % (value_type, value_content)) args.__setattr__(arg_name, arg_value) args_exists_ = config.get("args", None) if args_exists_ is None: config["args"] = {} for key, value in args._get_kwargs(): if value is not None: if key in ["logdir", "baselogdir"] and value == "": continue config["args"][key] = value autoresume = config["args"].get("autoresume", None) logdir = config["args"].get("logdir", None) resume = config["args"].get("resume", None) if autoresume is not None and logdir is not None and resume is None: logdir = Path(logdir) checkpoint_filename = logdir / "checkpoints" / f"{autoresume}_full.pth" if checkpoint_filename.is_file(): config["args"]["resume"] = str(checkpoint_filename) return config, args
[docs]def parse_args_uargs(args, unknown_args): """Function for parsing configuration files. Args: args: recognized arguments unknown_args: unrecognized arguments Returns: tuple: updated arguments, dict with config """ args_ = copy.deepcopy(args) # load params config = {} for config_path in args_.configs: config_ = load_config(config_path, ordered=True) config = merge_dicts(config, config_) config, args_ = parse_config_args( config=config, args=args_, unknown_args=unknown_args ) # hack with argparse in config config_args = config.get("args", None) if config_args is not None: for key, value in config_args.items(): arg_value = getattr(args_, key, None) if arg_value is None or ( key in ["logdir", "baselogdir"] and arg_value == "" ): arg_value = value setattr(args_, key, arg_value) return args_, config
__all__ = ["parse_config_args", "parse_args_uargs"]