Python实现简单的缓存和缓存decorator详解编程语言

一个简单的缓存实现,将缓存数据保存在单例的对象中。

使用方法:

 # Initialize 
    SimpleCache({'data':{'example':'example data'}}) 
    # Getting instance 
    c = SimpleCache.getInstance() 
 
    c.set('re.reg_exp_compiled',re.compile(r'/W*')) 
    reg_exp = c.get('re.reg_exp_compiled',default=re.compile(r'/W*')) 
 
    # -------------------------------------------------------------- 
 
    c = SimpleCache.getInstance() 
    reg_exp = c.getset('re.reg_exp_compiled',re.compile(r'/W*')) 
 
    # --------------------------------------------------------------     
 
    @scache 
    def func1(): 
        return 'OK'

实现

__author__ = "Andrey Nikishaev" 
__copyright__ = "Copyright 2010, http://creotiv.in.ua" 
__license__ = "GPL" 
__version__ = "0.3" 
__maintainer__ = "Andrey Nikishaev" 
__email__ = "[email protected]" 
__status__ = "Production" 
 
""" 
Simple local cache. 
It saves local data in singleton dictionary with convenient interface 
 
Examples of use: 
    # Initialize 
    SimpleCache({'data':{'example':'example data'}}) 
    # Getting instance 
    c = SimpleCache.getInstance() 
 
    c.set('re.reg_exp_compiled',re.compile(r'/W*')) 
    reg_exp = c.get('re.reg_exp_compiled',default=re.compile(r'/W*')) 
 
or 
 
    c = SimpleCache.getInstance() 
    reg_exp = c.getset('re.reg_exp_compiled',re.compile(r'/W*')) 
 
or 
    @scache 
    def func1(): 
        return 'OK' 
 
""" 
 
class SimpleCache(dict): 
 
    def __new__(cls,*args): 
        if not hasattr(cls,'_instance'): 
            cls._instance = dict.__new__(cls) 
        else: 
            raise Exception('SimpleCache already initialized') 
        return cls._instance 
 
    @classmethod 
    def getInstance(cls): 
        if not hasattr(cls,'_instance'): 
            cls._instance = dict.__new__(cls) 
        return cls._instance 
 
    def get(self,name,default=None): 
        """Multilevel get function. 
        Code:         
        Config().get('opt.opt_level2.key','default_value') 
        """ 
        if not name:  
            return default 
        levels = name.split('.') 
        data = self             
        for level in levels: 
            try:             
                data = data[level] 
            except: 
                return default 
 
        return data 
 
    def set(self,name,value): 
        """Multilevel set function 
        Code:         
        Config().set('opt.opt_level2.key','default_value') 
        """ 
        levels = name.split('.') 
        arr = self         
        for name in levels[:-1]: 
            if not arr.has_key(name):          
                arr[name] = {}    
            arr = arr[name] 
        arr[levels[-1]] = value 
 
    def getset(self,name,value): 
        """Get cache, if not exists set it and return set value 
        Code:         
        Config().getset('opt.opt_level2.key','default_value') 
        """ 
        g = self.get(name) 
        if not g: 
            g = value 
            self.set(name,g) 
        return g 
 
def scache(func): 
    def wrapper(*args, **kwargs): 
        cache = SimpleCache.getInstance() 
        fn = "scache." + func.__module__ + func.__class__.__name__ + / 
             func.__name__ + str(args) + str(kwargs)         
        val = cache.get(fn) 
        if not val: 
            res = func(*args, **kwargs) 
            cache.set(fn,res) 
            return res 
        return val 
    return wrapper 

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/8504.html

(0)
上一篇 2021年7月18日
下一篇 2021年7月18日

相关推荐

发表回复

登录后才能评论