Config wrapping a dict: normal attribute access (cfg.host) should look keys up in the wrapped dict via __getattr__ (which fires only when normal lookup fails), returning None for unknown keys instead of raising. Store the dict with self._data — and mind the recursion trap if you forget the underscore.cfg = Config({'host': 'db1'}); cfg.host'db1'
__getattr__ consulted the wrapped dict.
cfg.missing
None
Unknown keys return None, no AttributeError.
__getattr__ only fires for names not found normally.
self._data.get(name) completes it.