MCPcopy Index your code
hub / github.com/MongoEngine/mongoengine / BaseDict

Class BaseDict

mongoengine/base/datastructures.py:41–102  ·  view source on GitHub ↗

A special dict so we can watch any changes.

Source from the content-addressed store, hash-verified

39
40
41class BaseDict(dict):
42 """A special dict so we can watch any changes."""
43
44 _dereferenced = False
45 _instance = None
46 _name = None
47
48 def __init__(self, dict_items, instance, name):
49 BaseDocument = _import_class("BaseDocument")
50
51 if isinstance(instance, BaseDocument):
52 self._instance = weakref.proxy(instance)
53 self._name = name
54 super().__init__(dict_items)
55
56 def get(self, key, default=None):
57 # get does not use __getitem__ by default so we must override it as well
58 try:
59 return self.__getitem__(key)
60 except KeyError:
61 return default
62
63 def __getitem__(self, key):
64 value = super().__getitem__(key)
65
66 EmbeddedDocument = _import_class("EmbeddedDocument")
67 if isinstance(value, EmbeddedDocument) and value._instance is None:
68 value._instance = self._instance
69 elif isinstance(value, dict) and not isinstance(value, BaseDict):
70 value = BaseDict(value, None, f"{self._name}.{key}")
71 super().__setitem__(key, value)
72 value._instance = self._instance
73 elif isinstance(value, list) and not isinstance(value, BaseList):
74 value = BaseList(value, None, f"{self._name}.{key}")
75 super().__setitem__(key, value)
76 value._instance = self._instance
77 return value
78
79 def __getstate__(self):
80 self.instance = None
81 self._dereferenced = False
82 return self
83
84 def __setstate__(self, state):
85 self = state
86 return self
87
88 __setitem__ = mark_key_as_changed_wrapper(dict.__setitem__)
89 __delattr__ = mark_key_as_changed_wrapper(dict.__delattr__)
90 __delitem__ = mark_key_as_changed_wrapper(dict.__delitem__)
91 pop = mark_as_changed_wrapper(dict.pop)
92 clear = mark_as_changed_wrapper(dict.clear)
93 update = mark_as_changed_wrapper(dict.update)
94 popitem = mark_as_changed_wrapper(dict.popitem)
95 setdefault = mark_as_changed_wrapper(dict.setdefault)
96
97 def _mark_as_changed(self, key=None):
98 if hasattr(self._instance, "_mark_as_changed"):

Callers 8

_attach_objectsMethod · 0.90
_reloadMethod · 0.90
__get__Method · 0.90
_get_basedictMethod · 0.90
test___init___Method · 0.90
__getitem__Method · 0.85
__getitem__Method · 0.85

Calls 2

mark_as_changed_wrapperFunction · 0.85

Tested by 2

_get_basedictMethod · 0.72
test___init___Method · 0.72