本文整理汇总了Python中weakref.WeakKeyDictionary.changed方法的典型用法代码示例。如果您正苦于以下问题:Python WeakKeyDictionary.changed方法的具体用法?Python WeakKeyDictionary.changed怎么用?Python WeakKeyDictionary.changed使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类weakref.WeakKeyDictionary
的用法示例。
在下文中一共展示了WeakKeyDictionary.changed方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: Value
# 需要导入模块: from weakref import WeakKeyDictionary [as 别名]
# 或者: from weakref.WeakKeyDictionary import changed [as 别名]
class Value(object):
"""A simple reactive value container to demonstrate how all this
package works.
"""
def __init__(self, generator=undefined, initial_value=undefined,
equal=None):
self._equal = equal or operator.eq
self._tracker = t = get_tracker()
self._descriptor_initialized = False
if callable(generator):
# suppose it's used as a method decorator
self._generator = generator
self._value = initial_value
elif generator is not undefined:
self._generator = None
self._value = generator
else:
self._generator = None
self._value = initial_value
self._comp = None
self._dep = t.dependency()
def _init_descriptor_environment(self):
"""There's no way to distinguis between description and simple
generator mode, so the initialization of the necessary
per-instance mappings is done at the first __get__
execution.
"""
self._dep = WeakKeyDictionary()
self._value = WeakKeyDictionary()
self._comp = WeakKeyDictionary()
self._descriptor_initialized = True
def _auto(self, instance, generator, comp=None):
if instance:
self._set_instance_value(instance, generator(instance))
else:
self.value = generator()
def _get_value(self, instance=None):
if self._tracker.active:
dep = self._get_member('dep', instance)
if dep is undefined or dep is None:
dep = self._tracker.dependency()
self._set_member('dep', dep, instance)
dep.depend()
value = self._get_member('value', instance)
if self._generator and value is undefined:
raise ReactiveError("Value hasn't been calculated yet..why?")
elif not self._generator and value is undefined:
if instance:
# access via __get__
raise AttributeError("Value is undefined")
else:
raise ValueError('You have to set a value first')
return value
@property
def value(self):
if self._generator:
self._trigger_generator()
return self._get_value()
@value.setter
def value(self, new):
old = self._value
self._value = new
if not ((old is undefined) or self._equal(old, new)):
self._dep.changed()
def _set_instance_value(self, instance, new):
old = self._value.get(instance, undefined)
self._value[instance] = new
if not ((old is undefined) or self._equal(old, new)):
if instance not in self._dep:
self._dep[instance] = self._tracker.dependency()
self._dep[instance].changed()
def _get_member(self, name, instance=None):
member = getattr(self, '_' + name)
if instance:
member = member.get(instance, undefined)
return member
def _set_member(self, name, value, instance=None):
if instance:
member = getattr(self, '_' + name)
member[instance] = value
else:
setattr(self, '_' + name, value)
def _trigger_generator(self, instance=None):
if self._generator:
tracker = self._tracker
func = functools.partial(self._auto, instance, self._generator)
comp = self._get_member('comp', instance)
if comp is undefined or comp is None:
comp = tracker.reactive(func, with_parent=False)
comp.guard = functools.partial(
#.........这里部分代码省略.........