HEX
Server: Apache/2.4.65 (Ubuntu)
System: Linux ielts-store-v2 6.8.0-1036-gcp #38~22.04.1-Ubuntu SMP Thu Aug 14 01:19:18 UTC 2025 x86_64
User: root (0)
PHP: 7.2.34-54+ubuntu20.04.1+deb.sury.org+1
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,
Upload Files
File: //snap/google-cloud-cli/396/lib/third_party/cachetools/__init__.py
"""Extensible memoizing collections and decorators."""

from __future__ import absolute_import

import functools

from . import keys
from .cache import Cache
from .lfu import LFUCache
from .lru import LRUCache
from .rr import RRCache
from .ttl import TTLCache

__all__ = ('Cache', 'LFUCache', 'LRUCache', 'RRCache', 'TTLCache', 'cached',
           'cachedmethod')

__version__ = '3.1.1'

if hasattr(functools.update_wrapper(lambda f: f(), lambda: 42), '__wrapped__'):
  _update_wrapper = functools.update_wrapper
else:

  def _update_wrapper(wrapper, wrapped):
    functools.update_wrapper(wrapper, wrapped)
    wrapper.__wrapped__ = wrapped
    return wrapper


def cached(cache, key=keys.hashkey, lock=None):
  """Decorator to wrap a function with a memoizing callable that saves

    results in a cache.

    """

  def decorator(func):
    if cache is None:

      def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    elif lock is None:

      def wrapper(*args, **kwargs):
        k = key(*args, **kwargs)
        try:
          return cache[k]
        except KeyError:
          pass  # key not found
        v = func(*args, **kwargs)
        try:
          cache[k] = v
        except ValueError:
          pass  # value too large
        return v
    else:

      def wrapper(*args, **kwargs):
        k = key(*args, **kwargs)
        try:
          with lock:
            return cache[k]
        except KeyError:
          pass  # key not found
        v = func(*args, **kwargs)
        try:
          with lock:
            cache[k] = v
        except ValueError:
          pass  # value too large
        return v

    return _update_wrapper(wrapper, func)

  return decorator


def cachedmethod(cache, key=keys.hashkey, lock=None):
  """Decorator to wrap a class or instance method with a memoizing

    callable that saves results in a cache.

    """

  def decorator(method):
    if lock is None:

      def wrapper(self, *args, **kwargs):
        c = cache(self)
        if c is None:
          return method(self, *args, **kwargs)
        k = key(*args, **kwargs)
        try:
          return c[k]
        except KeyError:
          pass  # key not found
        v = method(self, *args, **kwargs)
        try:
          c[k] = v
        except ValueError:
          pass  # value too large
        return v
    else:

      def wrapper(self, *args, **kwargs):
        c = cache(self)
        if c is None:
          return method(self, *args, **kwargs)
        k = key(*args, **kwargs)
        try:
          with lock(self):
            return c[k]
        except KeyError:
          pass  # key not found
        v = method(self, *args, **kwargs)
        try:
          with lock(self):
            c[k] = v
        except ValueError:
          pass  # value too large
        return v

    return _update_wrapper(wrapper, method)

  return decorator