Spaces:
Paused
Paused
import json | |
import os | |
from copy import deepcopy | |
from dataclasses import dataclass | |
class BaseConfig: | |
def clone(self): | |
return deepcopy(self) | |
def inherit(self, another): | |
"""inherit common keys from a given config""" | |
common_keys = set(self.__dict__.keys()) & set(another.__dict__.keys()) | |
for k in common_keys: | |
setattr(self, k, getattr(another, k)) | |
def propagate(self): | |
"""push down the configuration to all members""" | |
for k, v in self.__dict__.items(): | |
if isinstance(v, BaseConfig): | |
v.inherit(self) | |
v.propagate() | |
def save(self, save_path): | |
"""save config to json file""" | |
dirname = os.path.dirname(save_path) | |
if not os.path.exists(dirname): | |
os.makedirs(dirname) | |
conf = self.as_dict_jsonable() | |
with open(save_path, 'w') as f: | |
json.dump(conf, f) | |
def load(self, load_path): | |
"""load json config""" | |
with open(load_path) as f: | |
conf = json.load(f) | |
self.from_dict(conf) | |
def from_dict(self, dict, strict=False): | |
for k, v in dict.items(): | |
if not hasattr(self, k): | |
if strict: | |
raise ValueError(f"loading extra '{k}'") | |
else: | |
print(f"loading extra '{k}'") | |
continue | |
if isinstance(self.__dict__[k], BaseConfig): | |
self.__dict__[k].from_dict(v) | |
else: | |
self.__dict__[k] = v | |
def as_dict_jsonable(self): | |
conf = {} | |
for k, v in self.__dict__.items(): | |
if isinstance(v, BaseConfig): | |
conf[k] = v.as_dict_jsonable() | |
else: | |
if jsonable(v): | |
conf[k] = v | |
else: | |
# ignore not jsonable | |
pass | |
return conf | |
def jsonable(x): | |
try: | |
json.dumps(x) | |
return True | |
except TypeError: | |
return False | |