Python實現簡單的緩存和緩存decorator

eb5y 9年前發布 | 2K 次閱讀 Python 緩存

一個簡單的緩存實現,將緩存數據保存在單例的對象中。

使用方法:

 # 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'</pre> 


實現

author = "Andrey Nikishaev"
copyright = "Copyright 2010, http://creotiv.in.ua&quot;
license = "GPL"
version = "0.3"
maintainer = "Andrey Nikishaev"
email = "creotiv@gmail.com"
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 </pre>

 本文由用戶 eb5y 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!