Spaces:
Build error
Build error
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
# The code is based on | |
# https://github.com/open-mmlab/mmcv/blob/master/mmcv/utils/config.py | |
# Copyright (c) OpenMMLab. | |
import os.path as osp | |
import shutil | |
import sys | |
import tempfile | |
from importlib import import_module | |
from addict import Dict | |
class ConfigDict(Dict): | |
def __missing__(self, name): | |
raise KeyError(name) | |
def __getattr__(self, name): | |
try: | |
value = super(ConfigDict, self).__getattr__(name) | |
except KeyError: | |
ex = AttributeError("'{}' object has no attribute '{}'".format( | |
self.__class__.__name__, name)) | |
except Exception as e: | |
ex = e | |
else: | |
return value | |
raise ex | |
class Config(object): | |
def _file2dict(filename): | |
filename = str(filename) | |
if filename.endswith('.py'): | |
with tempfile.TemporaryDirectory() as temp_config_dir: | |
shutil.copyfile(filename, | |
osp.join(temp_config_dir, '_tempconfig.py')) | |
sys.path.insert(0, temp_config_dir) | |
mod = import_module('_tempconfig') | |
sys.path.pop(0) | |
cfg_dict = { | |
name: value | |
for name, value in mod.__dict__.items() | |
if not name.startswith('__') | |
} | |
# delete imported module | |
del sys.modules['_tempconfig'] | |
else: | |
raise IOError('Only .py type are supported now!') | |
cfg_text = filename + '\n' | |
with open(filename, 'r') as f: | |
cfg_text += f.read() | |
return cfg_dict, cfg_text | |
def fromfile(filename): | |
cfg_dict, cfg_text = Config._file2dict(filename) | |
return Config(cfg_dict, cfg_text=cfg_text, filename=filename) | |
def __init__(self, cfg_dict=None, cfg_text=None, filename=None): | |
if cfg_dict is None: | |
cfg_dict = dict() | |
elif not isinstance(cfg_dict, dict): | |
raise TypeError('cfg_dict must be a dict, but got {}'.format( | |
type(cfg_dict))) | |
super(Config, self).__setattr__('_cfg_dict', ConfigDict(cfg_dict)) | |
super(Config, self).__setattr__('_filename', filename) | |
if cfg_text: | |
text = cfg_text | |
elif filename: | |
with open(filename, 'r') as f: | |
text = f.read() | |
else: | |
text = '' | |
super(Config, self).__setattr__('_text', text) | |
def filename(self): | |
return self._filename | |
def text(self): | |
return self._text | |
def __repr__(self): | |
return 'Config (path: {}): {}'.format(self.filename, | |
self._cfg_dict.__repr__()) | |
def __getattr__(self, name): | |
return getattr(self._cfg_dict, name) | |
def __setattr__(self, name, value): | |
if isinstance(value, dict): | |
value = ConfigDict(value) | |
self._cfg_dict.__setattr__(name, value) | |