    def from_file(cls, filepath: str) -> EasyDict:
        """Build config from file. Supported filetypes: `.py`,`.yaml`,`.json`.

        Args:
            filepath (str): The config file path.

        Returns: TODO

        """
        filepath = osp.abspath(osp.expanduser(filepath))
        if not osp.isfile(filepath):
            raise IOError(f"File does not exist: {filepath}")
        if filepath.endswith(".py"):
            sys.path.insert(0, osp.dirname(filepath))
            mod = import_module(osp.splitext(osp.basename(filepath))[0])
            cfg_dict = {
                name: value
                for name, value in mod.__dict__.items()
                if not name.startswith("__")
            }

            # I've no idea what the fuck is this
            # with tempfile.TemporaryDirectory() as temp_config_dir:
            #     print(temp_config_dir, filepath)

            #     print(f"Copying {osp.dirname(filepath)} to {osp.join(temp_config_dir, 'tmp_config')}")
            #     shutil.copytree(osp.dirname(filepath), osp.join(temp_config_dir, "tmp_config"))
            #     sys.path.insert(0, temp_config_dir)
            #     mod = import_module("tmp_config." + osp.splitext(osp.basename(filepath))[0])
            #     # mod = import_module(temp_module_name)
            #     sys.path.pop(0)
            #     cfg_dict = {
            #         name: value
            #         for name, value in mod.__dict__.items()
            #         if not name.startswith("__")
            #     }
            #     print("Removing")
            #     for k in list(sys.modules.keys()):
            #         if "tmp_config" in k:
            #             del sys.modules[k]
        elif filepath.endswith((".yml", ".yaml")):
            cfg_dict = yaml.load(open(filepath, "r"), Loader=yaml.Loader)
        elif filepath.endswith(".json"):
            cfg_dict = json.load(open(filepath, "r"))
        else:
            raise IOError("Only py/yml/yaml/json type are supported now!")

        cfg_text = filepath + "\n"
        with open(filepath, "r") as f:
            cfg_text += f.read()

        if BASE_KEY in cfg_dict:  # load configs in `BASE_KEY`
            cfg_dir = osp.dirname(filepath)
            base_filename = cfg_dict.pop(BASE_KEY)
            base_filename = (
                base_filename if isinstance(base_filename, list) else [base_filename]
            )

            cfg_dict_list = list()
            for f in base_filename:
                _cfg_dict = Config.from_file(osp.join(cfg_dir, f))
                cfg_dict_list.append(_cfg_dict)

            base_cfg_dict = dict()
            for c in cfg_dict_list:
                if len(base_cfg_dict.keys() & c.keys()) > 0:
                    raise KeyError("Duplicate key is not allowed among bases")
                base_cfg_dict.update(c)

            cfg_dict = merge_a_into_b(cfg_dict, base_cfg_dict)

        return EasyDict(cfg_dict)
Build config from file. Supported filetypes: `.py`,`.yaml`,`.json`.

Args:
filepath (str): The config file path.

Returns: TODO
videomamba/video_mm/utils/config.py