创建可观看词典的最佳方法是什么?

时间:2016-11-08 17:34:58

标签: python angularjs dictionary wxpython

我目前正在创建一个库,允许GUI https://github.com/jackburridge/pywatch使用可观察的字典,意图是像AngularJS一样,可观察的对象(在Angulars案例中,$ scope)可以像任何其他字典一样对待(Angular中的对象)

我目前有一个像这样的可观察词典结构:

class Watcher:
def __init__(self, watch_object, item):
    self.watch_object = watch_object
    self.item = item
    self.listeners = []

def bind(self, callback):
    self.listeners.append(callback)

def notify(self):
    for listener in self.listeners:
        try:
            listener()
        except Exception as e:
            logging.error(traceback.format_exc())

def get_value(self):
    return self.watch_object[self.item]

def set_value(self, value):
    self.watch_object[self.item] = value


class WatchableDict(dict):
    def __init__(self, seq=None, **kwargs):
        self.watchers = {}
        dict.__init__(self)

    def __setitem__(self, item, new_value):
        new_b = item in self
        old_value = self[item] if item in self else None
        dict.__setitem__(self, item, new_value)
        if new_b:
            if old_value != new_value:
                self.watchers[item].notify()
        else:
            self.watchers[item] = Watcher(self, item)

    def get_watcher(self, name):
        if name in self.watchers:
            return self.watchers[name]
        return None

然后有人可以从dict获取值,使用get_watcher方法观看它。这当前效果很好,但我想知道当我添加嵌套词典和列表等附加功能时是否有更好的方法

1 个答案:

答案 0 :(得分:0)

我前段时间尝试过这些方法。您可以在https://github.com/petrblahos/modellerkit查看,特别是step07。我的想法是只允许容器中的不可变值(我没有使用dict而是使用类作为容器)。然后每当有人调用container_object.watched_property ="新值"时,这将由watched_property的 set 方法检测到,并且可以通知听众。

所以我真的最终得到了我打电话的情况

my_model.operation_list.append(Operation(10, 2123, datetime.datetime.now())

我的列表视图会自动更新,标签也包含项目计数。

我相信您可以简单地克隆repo并运行示例以查看它是如何工作的。我甚至在项目中使用它或2.但我觉得这种方法在某种程度上更适合java而不是python。