| 687 | self.__convert_and_store(key, value) |
| 688 | |
| 689 | def __setattr__(self, key, value): |
| 690 | if key == "_box_config": |
| 691 | return object.__setattr__(self, key, value) |
| 692 | if self._box_config["frozen_box"] and self._box_config["__created"]: |
| 693 | raise BoxError("Box is frozen") |
| 694 | if key in self._protected_keys: |
| 695 | raise BoxKeyError(f'Key name "{key}" is protected') |
| 696 | |
| 697 | safe_key = self._safe_attr(key) |
| 698 | if safe_key in self._box_config["__safe_keys"]: |
| 699 | key = self._box_config["__safe_keys"][safe_key] |
| 700 | |
| 701 | # if user has customized property setter, fall back to default implementation |
| 702 | if _get_property_func(self, key)[1] is not None: |
| 703 | super().__setattr__(key, value) |
| 704 | else: |
| 705 | self.__setitem__(key, value) |
| 706 | |
| 707 | def __delitem__(self, key): |
| 708 | if self._box_config["frozen_box"]: |