簡體   English   中英

創建可觀察的字典的最佳方法是什么

[英]What is the best way to create a watchable dict

我當前正在創建一個庫,以允許GUI https://github.com/jackburridge/pywatch使用可監視的dict,其目的是像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

然后,某人可以從字典中獲取一個值,並使用get_watcher方法對其進行get_watcher 目前,這很好用,但是我想知道當我添加嵌套字典和列表之類的附加功能時是否有更好的方法

一段時間前,我試圖按照這些思路做一些事情。 您可以在https://github.com/petrblahos/modellerkit上查看它,尤其是step07。 我的想法是在容器中只允許不可變的值(我沒有使用dict而是將類用作容器)。 然后,每當有人調用container_object.watched_property =“ new value”時,watched_property的set方法就會檢測到此值,並可以通知偵聽器。

所以我真的以這種情況結束了

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

我的列表視圖將自動更新,帶有項目數的標簽也將自動更新。

我相信您可以僅克隆存儲庫並運行示例以了解其工作原理。 我什至在一個項目或2中都使用過它。但是我覺得這種方法在某種程度上更適合Java,而不是python。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM