def __call__(self, function): '''Decorate `function` to use this context manager when it's called.''' def inner(function_, *args, **kwargs): with self: return function_(*args, **kwargs) return decorator_tools.decorator(inner, function)
def __call__(self, method_function): ''' Decorate method to use value of `CachedProperty` as a context manager. ''' def inner(same_method_function, self_obj, *args, **kwargs): with getattr(self_obj, self.get_our_name(self_obj)): return method_function(self_obj, *args, **kwargs) return decorator_tools.decorator(inner, method_function)
def __call__(self, method_function): ''' Decorate method to use value of `CachedProperty` as a context manager. ''' def inner(same_method_function, self_obj, *args, **kwargs): with getattr(self_obj, self.get_our_name(self_obj)): return method_function(self_obj, *args, **kwargs) return decorator_tools.decorator(inner, method_function)
def factory(cls, definitely_infinite=False): ''' Decorator to make generators return a `LazyTuple`. Example: @LazyTuple.factory() def my_generator(): yield from ['hello', 'world', 'have', 'fun'] This works on any function that returns an iterator. todo: Make it work on iterator classes. ''' def inner(function, *args, **kwargs): return cls(function(*args, **kwargs), definitely_infinite=definitely_infinite) return decorator_tools.decorator(inner)
def factory(cls, definitely_infinite=False): ''' Decorator to make generators return a `LazyTuple`. Example: @LazyTuple.factory() def my_generator(): yield from ['hello', 'world', 'have', 'fun'] This works on any function that returns an iterator. todo: Make it work on iterator classes. ''' def inner(function, *args, **kwargs): return cls(function(*args, **kwargs), definitely_infinite=definitely_infinite) return decorator_tools.decorator(inner)
def decorator(function): # In case we're being given a function that is already cached: if getattr(function, 'is_cached', False): return function if max_size == infinity: if time_to_keep: sorting_key_function = lambda sleek_call_args: \ cached._cache[sleek_call_args][1] def remove_expired_entries(): almost_cutting_point = \ binary_search.binary_search_by_index( list(cached._cache.keys()), _get_now(), sorting_key_function, rounding=binary_search.LOW ) if almost_cutting_point is not None: cutting_point = almost_cutting_point + 1 for key in cached._cache.keys()[:cutting_point]: del cached._cache[key] @misc_tools.set_attributes(_cache=OrderedDict()) def cached(function, *args, **kwargs): remove_expired_entries() sleek_call_args = \ SleekCallArgs(cached._cache, function, *args, **kwargs) try: return cached._cache[sleek_call_args][0] except KeyError: value = function(*args, **kwargs) cached._cache[sleek_call_args] = (value, _get_now() + time_to_keep) cached._cache.sort(key=sorting_key_function) return value else: # not time_to_keep @misc_tools.set_attributes(_cache={}) def cached(function, *args, **kwargs): sleek_call_args = \ SleekCallArgs(cached._cache, function, *args, **kwargs) try: return cached._cache[sleek_call_args] except KeyError: cached._cache[sleek_call_args] = value = \ function(*args, **kwargs) return value else: # max_size < infinity @misc_tools.set_attributes(_cache=OrderedDict()) def cached(function, *args, **kwargs): sleek_call_args = \ SleekCallArgs(cached._cache, function, *args, **kwargs) try: result = cached._cache[sleek_call_args] cached._cache.move_to_end(sleek_call_args) return result except KeyError: cached._cache[sleek_call_args] = value = \ function(*args, **kwargs) if len(cached._cache) > max_size: cached._cache.popitem(last=False) return value result = decorator_tools.decorator(cached, function) def cache_clear(key=CLEAR_ENTIRE_CACHE): if key is CLEAR_ENTIRE_CACHE: cached._cache.clear() else: try: del cached._cache[key] except KeyError: pass result.cache_clear = cache_clear result.is_cached = True return result
def decorator(function): # In case we're being given a function that is already cached: if getattr(function, 'is_cached', False): return function if max_size == infinity: if time_to_keep: sorting_key_function = lambda sleek_call_args: \ cached._cache[sleek_call_args][1] def remove_expired_entries(): almost_cutting_point = \ binary_search.binary_search_by_index( list(cached._cache.keys()), _get_now(), sorting_key_function, rounding=binary_search.LOW ) if almost_cutting_point is not None: cutting_point = almost_cutting_point + 1 for key in list(cached._cache.keys())[:cutting_point]: del cached._cache[key] @misc_tools.set_attributes(_cache=OrderedDict()) def cached(function, *args, **kwargs): remove_expired_entries() sleek_call_args = \ SleekCallArgs(cached._cache, function, *args, **kwargs) try: return cached._cache[sleek_call_args][0] except KeyError: value = function(*args, **kwargs) cached._cache[sleek_call_args] = ( value, _get_now() + time_to_keep ) cached._cache.sort(key=sorting_key_function) return value else: # not time_to_keep @misc_tools.set_attributes(_cache={}) def cached(function, *args, **kwargs): sleek_call_args = \ SleekCallArgs(cached._cache, function, *args, **kwargs) try: return cached._cache[sleek_call_args] except KeyError: cached._cache[sleek_call_args] = value = \ function(*args, **kwargs) return value else: # max_size < infinity @misc_tools.set_attributes(_cache=OrderedDict()) def cached(function, *args, **kwargs): sleek_call_args = \ SleekCallArgs(cached._cache, function, *args, **kwargs) try: result = cached._cache[sleek_call_args] cached._cache.move_to_end(sleek_call_args) return result except KeyError: cached._cache[sleek_call_args] = value = \ function(*args, **kwargs) if len(cached._cache) > max_size: cached._cache.popitem(last=False) return value result = decorator_tools.decorator(cached, function) def cache_clear(key=CLEAR_ENTIRE_CACHE): if key is CLEAR_ENTIRE_CACHE: cached._cache.clear() else: try: del cached._cache[key] except KeyError: pass result.cache_clear = cache_clear result.is_cached = True return result
def __call__(self, function): '''Decorate `function` to use this context manager when it's called.''' def inner(function_, *args, **kwargs): with self: return function_(*args, **kwargs) return decorator_tools.decorator(inner, function)