当前位置: 首页>>代码示例>>Python>>正文


Python WeakKeyDictionary.changed方法代码示例

本文整理汇总了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(
#.........这里部分代码省略.........
开发者ID:azazel75,项目名称:metapensiero.reactive,代码行数:103,代码来源:value.py


注:本文中的weakref.WeakKeyDictionary.changed方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。