def _change(self, key, oldv, newv):
"""Analyze changed values and trigger changed events on dependencies."""
if oldv is missing:
# add
vdep = EventDependency(tracker=self._tracker)
self._key_dependencies[key] = vdep
if self._is_immutable(newv):
self._all_immutables.follow(vdep)
else:
self._follow_reactive(newv, key=key)
change = (operator.setitem, (self, key, newv))
vdep.changed(change)
self._structure.changed(change)
elif newv is missing:
# delete
vdep = self._key_dependencies.pop(key)
change = (operator.delitem, (self, key))
vdep.changed(change)
self._structure.changed(change)
if self._is_immutable(oldv):
self._all_immutables.unfollow(vdep)
else:
self._follow_reactive(oldv, stop=True)
else:
# change
is_immu = self._is_immutable(newv)
if oldv is newv or (is_immu and self._equal(oldv, newv)):
return
was_reactive = isinstance(oldv, ReactiveContainerBase)
is_reactive = isinstance(newv, ReactiveContainerBase)
dep = self._key_dependencies[key]
if was_reactive:
self._follow_reactive(oldv, stop=True)
if is_reactive:
self._follow_reactive(newv)
dep.changed((operator.setitem, (self, key, newv)))
评论列表
文章目录