from types import SimpleNamespace class Config(SimpleNamespace): def __getattribute__(self, value): # If attribute not specified in config, # return None instead of raise error try: return super().__getattribute__(value) except AttribuateError: return None def __str__(self): # pretty print string = ["config"] string.append("=" * len(string[0])) longest_param_name = max([len(k) for k in [*self.__dict__]]) for k, v in self.__dict__.items(): string.append(f"{k.ljust(longest_param_name)} : {v}") return "\n".join(string)