Package pype32 :: Module caching |
[hide private]
[frames] | no frames]

# Source Code for Module pype32.caching

     1  #!/usr/bin/env python
     2  # -*- coding: utf-8 -*-
     3
     4  # Copyright (c) 2015, Sandor Nemes
     5  # All rights reserved.
     6  #
     7  # Redistribution and use in source and binary forms, with or without
     8  # modification, are permitted provided that the following conditions are met:
     9  #
    10  #     * Redistributions of source code must retain the above copyright notice,
    11  #       this list of conditions and the following disclaimer.
    12  #     * Redistributions in binary form must reproduce the above copyright
    13  #       notice,this list of conditions and the following disclaimer in the
    14  #       documentation and/or other materials provided with the distribution.
    15  #     * Neither the name of the copyright holder nor the names of its
    16  #       contributors may be used to endorse or promote products derived from
    17  #       this software without specific prior written permission.
    18  #
    19  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    20  # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    21  # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    22  # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    23  # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    24  # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    25  # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    26  # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    27  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    28  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    29  # POSSIBILITY OF SUCH DAMAGE.
    30
    31  caches = {}
    32
    33 -class Cache(object):
    34
    35 -    def __init__(self, name):
    36          self.name = name
    37          self.cache = {}
    38
    39 -    def get(self, key):
    40          return self.cache.get(key)
    41
    42 -    def put(self, key, value):
    43          self.cache.update({ key: value })
    44
    45 -def getCache(name):
    46      cache = caches.get(name)
    47      if cache is None:
    48          cache = Cache(name)
    49          caches[name] = cache
    50      return cache
    51
    52 -def cached(*ids):
    53      def decorator(func):
    54          def decorated(self, *args):
    55              funcname = "#".join([func.__name__] + [str(_) for _ in ids])
    56              cache = getCache(funcname)
    57              key = hash(args)
    58              result = cache.get(key)
    59              if result is None:
    60                  result = func(self, *args)
    61                  cache.put(key, result)
    62              return result
    63          return decorated
    64      return decorator
    65