Source code for dotwiz

"""
``dotwiz``
~~~~~~~~~~

DotWiz is a ``dict`` subclass that enables accessing (nested) keys
in dot notation.

Sample Usage::

    >>> from dotwiz import DotWiz
    >>> dw = DotWiz({'this': {'works': {'for': [{'nested': {'values': True}}]}}},
    ...             the_answer_to_life=42)
    >>> dw
    ✫(this=✫(works=✫(for=[✫(nested=✫(values=True))])), the_answer_to_life=42)
    >>> dw.this.works['for'][0].nested.values
    True
    >>> dw.the_answer_to_life
    42

For full documentation and more advanced usage, please see
<https://dotwiz.readthedocs.io>.

:copyright: (c) 2022 by Ritvik Nag.
:license: MIT, see LICENSE for more details.
"""

__all__ = [
    'DotWiz',
    'DotWizPlus',
    'make_dot_wiz',
    'make_dot_wiz_plus',
    'set_default_for_missing_keys',
]

from .main import DotWiz, make_dot_wiz
from .plus import DotWizPlus, make_dot_wiz_plus


[docs]def set_default_for_missing_keys(default=None, overwrite=False): """ Modifies :class:`DotWiz` and :class:`DotWizPlus` to add a custom :meth:`__getattr__`, so that accessing missing or non-existing attributes (keys) returns ``default`` instead of raising an :exc:`AttributeError`. This provides a handy alternative to the builtin :func:`hasattr`. For more details, see https://github.com/rnag/dotwiz/issues/14. Example:: >>> from dotwiz import DotWiz, set_default_for_missing_keys >>> set_default_for_missing_keys('test') >>> dw = DotWiz(hello='world!') >>> assert dw.hello == 'world!' >>> assert dw.world == 'test' :param default: The default value to return for missing or non-existing attributes (keys). :param overwrite: True to overwrite a class's `__getattr__()` method, if one already exists; defaults to False. """ for cls in DotWiz, DotWizPlus: cls_dict = cls.__dict__ if not overwrite and '__getattr__' in cls_dict: msg = f'{cls.__qualname__} already defines a __getattr__() - ' \ f'pass `overwrite=True` to continue anyway.' raise ValueError(msg) def __getattr__(self: cls, item: str, __default=default, __get=cls_dict.get): return __get(item, __default) setattr(cls, '__getattr__', __getattr__)