example-code-2e/24-class-metaprog/tinyenums/nanoenum.py

42 lines
880 B
Python
Raw Normal View History

2021-04-08 19:34:06 +02:00
# 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.
2021-04-05 23:08:55 +02:00
"""
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