簡體   English   中英

如何使用 Python 裝飾器使方法使用 functools.lru_cache 並注冊自己?

[英]How to use Python decorators so that a method uses functools.lru_cache andregisters itself?

我正在裝飾 class 中的一些方法,這些方法使用 lru_cache 訪問數據存儲。 我想應用另一個裝飾器,或者以另一種方式調用 lru_cache,以便在第一次調用時將緩存方法添加到集合中。 這樣,當我知道我的數據存儲區變臟時,我可以清理每個方法的緩存。 換句話說,我如何在下面構建“register_data_reader”? 或者我應該換一種方式嗎?

from functools import lru_cache
class foo:

    _cached_funcs = set()

    @register_data_reader  # adds the LRU DECORATED func to _cached_funcs
    @lru_cache(maxsize=16)
    def reads_data_somewhere(self, ...)
        ...
        return data

    def clear_cache(self):
        for f in _cached_funcs:
            f.cache_clear()

只是想一想如何實現這個......為什么還要費心用裝飾器注冊方法並在_cache_funcs中跟蹤它們? 而是遍歷類方法並嘗試在它們上運行.cache_clear()


class Foo:

    @lru_cache(maxsize=16)
    def reads_data_somewhere(self):
        return 2 + 2

    def clear_cache(self):
        for method in dir(self):
            try:
                getattr(self, method).cache_clear()
            except AttributeError:
                pass


f = Foo()

print(f.reads_data_somewhere())
print(f.reads_data_somewhere())
print(f.reads_data_somewhere())
print(f.reads_data_somewhere())

print(f.reads_data_somewhere.cache_info())
f.clear_cache()
print(f.reads_data_somewhere.cache_info())

Output:

4
4
4
4
CacheInfo(hits=3, misses=1, maxsize=16, currsize=1)
CacheInfo(hits=0, misses=0, maxsize=16, currsize=0)

謝謝特里,這很有用。

最后,受您的啟發,我在 class 的init中運行了以下方法。 它允許我繞過拋出異常,並且我正在注冊一次緩存的方法,因為與總數相比,它們相對較少。

Class foo:

    ...

    def _register_cache(self):
        lst = dir(self)
        for method in lst:
            if hasattr(getattr(self, method), "cache_info"):
                self._cached_methods.add(method)

暫無
暫無

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

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