# This is a simplification of an idea by João S. O. Bueno (@gwidion) # shared privately with me, with permission to use in Fluent Python 2e. """ Testing ``KeyIsValueDict``:: >>> adict = KeyIsValueDict() >>> len(adict) 0 >>> adict['first'] 'first' >>> adict {'first': 'first'} >>> adict['second'] 'second' >>> len(adict) 2 >>> adict {'first': 'first', 'second': 'second'} >>> adict['__magic__'] Traceback (most recent call last): ... KeyError: '__magic__' """ class KeyIsValueDict(dict): def __missing__(self, key): if key.startswith('__') and key.endswith('__'): raise KeyError(key) self[key] = key return key class NanoEnumMeta(type): def __prepare__(name, bases, **kwargs): return KeyIsValueDict() class NanoEnum(metaclass=NanoEnumMeta): pass