| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| """A simple attribute dictionary used for representing configuration options.""" |
|
|
| from __future__ import absolute_import |
| from __future__ import division |
| from __future__ import print_function |
| from __future__ import unicode_literals |
|
|
|
|
| class AttrDict(dict): |
|
|
| IMMUTABLE = '__immutable__' |
|
|
| def __init__(self, *args, **kwargs): |
| super().__init__(*args, **kwargs) |
| self.__dict__[AttrDict.IMMUTABLE] = False |
|
|
| def __getattr__(self, name): |
| if name in self.__dict__: |
| return self.__dict__[name] |
| elif name in self: |
| return self[name] |
| else: |
| raise AttributeError(name) |
|
|
| def __setattr__(self, name, value): |
| if not self.__dict__[AttrDict.IMMUTABLE]: |
| if name in self.__dict__: |
| self.__dict__[name] = value |
| else: |
| self[name] = value |
| else: |
| raise AttributeError( |
| 'Attempted to set "{}" to "{}", but AttrDict is immutable'.format(name, value) |
| ) |
|
|
| def immutable(self, is_immutable): |
| """Set immutability to is_immutable and recursively apply the setting |
| to all nested AttrDicts. |
| """ |
| self.__dict__[AttrDict.IMMUTABLE] = is_immutable |
| |
| for v in self.__dict__.values(): |
| if isinstance(v, AttrDict): |
| v.immutable(is_immutable) |
| for v in self.values(): |
| if isinstance(v, AttrDict): |
| v.immutable(is_immutable) |
|
|
| def is_immutable(self): |
| return self.__dict__[AttrDict.IMMUTABLE] |
|
|