コード例 #1
0
    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)
コード例 #2
0
ファイル: cached_property.py プロジェクト: cool-RR/combi
 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)
コード例 #3
0
    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)
コード例 #4
0
    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)
コード例 #5
0
ファイル: lazy_tuple.py プロジェクト: cool-RR/combi
 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)
コード例 #6
0
    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
コード例 #7
0
ファイル: decorators.py プロジェクト: cool-RR/combi
    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
コード例 #8
0
 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)