class Fact(object): def __init__(self, kind): self._kind = kind self._domains = {} @property def kind() -> str: return self._kind def attr(self, domain: str, key: str): try: return self._domains[domain][key] except KeyError: pass def set(self, domain: str, key: str, value: str): _kv(domain)[key] = value def _kv(self, domain: str): try: kv = self._domains[domain] except KeyError: kv = {} self._domains[domain] = kv return kv def view(self, domain: str): return FactKv(self, domain, self._kv(domain)) def write(self, output): import configparser ini = configparser.ConfigParser(interpolation = None) for domain, kv in self._domains.items(): ini.add_section(domain) for key, value in kv.items(): ini.set(domain, key, value) ini.write(output) class FactKv(object): def __init__(self, fact, domain, kv): self._fact = fact self._domain = domain self._kv = kv def set(self, key, value): self._kv[key] = value