"""
Functions/classes which depend on the package ``attrs``
( `Attrs.org <https://www.attrs.org/en/stable/>`_ )
**Copyright**::
+===================================================+
| © 2019 Privex Inc. |
| https://www.privex.io |
+===================================================+
| |
| Originally Developed by Privex Inc. |
| License: X11 / MIT |
| |
| Core Developer(s): |
| |
| (+) Chris (@someguy123) [Privex] |
| (+) Kale (@kryogenic) [Privex] |
| |
+===================================================+
Copyright 2019 Privex Inc. ( https://www.privex.io )
"""
import attr
__all__ = [
'AttribDictable'
]
[docs]@attr.s
class AttribDictable:
"""
A small mixin class for :py:func:`attr.s` classes, allowing them to behave like dictionaries, and
support casting into dictionaries using ``dict(x)``.
Usage::
>>> import attr
>>> from privex.helpers import AttribDictable
>>>
>>> @attr.s
>>> class Example(AttribDictable):
... hello = attr.ib(type=str)
... testing = attr.ib(type=bool, default=True)
...
>>> x = Example(hello='world')
>>> x['hello']
'world'
>>> x['hello'] = 'lorem ipsum'
>>> dict(x)
{'hello': 'lorem ipsum', 'testing': True}
"""
[docs] def get(self, key, default=None):
try:
return self[key]
except KeyError:
return default
def __iter__(self):
"""Handle casting via ``dict(myclass)``"""
for k, v in attr.asdict(self).items():
yield k, v
def __getitem__(self, key):
"""
When the instance is accessed like a dict, try returning the matching attribute.
If the attribute doesn't exist, raise :class:`KeyError`
"""
if hasattr(self, key):
return getattr(self, key)
raise KeyError(key)
def __setitem__(self, key, value):
return setattr(self, key, value)