42 lines
880 B
Python
42 lines
880 B
Python
# 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
|