mirror of
				https://github.com/matrix-org/synapse.git
				synced 2025-10-30 19:58:36 +00:00 
			
		
		
		
	Add a cached helper to the module API (#14663)
				
					
				
			This commit is contained in:
		
							parent
							
								
									a4ca770655
								
							
						
					
					
						commit
						3854d0f949
					
				
							
								
								
									
										1
									
								
								changelog.d/14663.feature
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								changelog.d/14663.feature
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | Add a `cached` function to `synapse.module_api` that returns a decorator to cache return values of functions. | ||||||
| @ -18,6 +18,7 @@ from typing import ( | |||||||
|     TYPE_CHECKING, |     TYPE_CHECKING, | ||||||
|     Any, |     Any, | ||||||
|     Callable, |     Callable, | ||||||
|  |     Collection, | ||||||
|     Dict, |     Dict, | ||||||
|     Generator, |     Generator, | ||||||
|     Iterable, |     Iterable, | ||||||
| @ -126,7 +127,7 @@ from synapse.types import ( | |||||||
| from synapse.types.state import StateFilter | from synapse.types.state import StateFilter | ||||||
| from synapse.util import Clock | from synapse.util import Clock | ||||||
| from synapse.util.async_helpers import maybe_awaitable | from synapse.util.async_helpers import maybe_awaitable | ||||||
| from synapse.util.caches.descriptors import CachedFunction, cached | from synapse.util.caches.descriptors import CachedFunction, cached as _cached | ||||||
| from synapse.util.frozenutils import freeze | from synapse.util.frozenutils import freeze | ||||||
| 
 | 
 | ||||||
| if TYPE_CHECKING: | if TYPE_CHECKING: | ||||||
| @ -136,6 +137,7 @@ if TYPE_CHECKING: | |||||||
| 
 | 
 | ||||||
| T = TypeVar("T") | T = TypeVar("T") | ||||||
| P = ParamSpec("P") | P = ParamSpec("P") | ||||||
|  | F = TypeVar("F", bound=Callable[..., Any]) | ||||||
| 
 | 
 | ||||||
| """ | """ | ||||||
| This package defines the 'stable' API which can be used by extension modules which | This package defines the 'stable' API which can be used by extension modules which | ||||||
| @ -185,6 +187,42 @@ class UserIpAndAgent: | |||||||
|     last_seen: int |     last_seen: int | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | def cached( | ||||||
|  |     *, | ||||||
|  |     max_entries: int = 1000, | ||||||
|  |     num_args: Optional[int] = None, | ||||||
|  |     uncached_args: Optional[Collection[str]] = None, | ||||||
|  | ) -> Callable[[F], CachedFunction[F]]: | ||||||
|  |     """Returns a decorator that applies a memoizing cache around the function. This | ||||||
|  |     decorator behaves similarly to functools.lru_cache. | ||||||
|  | 
 | ||||||
|  |     Example: | ||||||
|  | 
 | ||||||
|  |         @cached() | ||||||
|  |         def foo('a', 'b'): | ||||||
|  |             ... | ||||||
|  | 
 | ||||||
|  |     Added in Synapse v1.74.0. | ||||||
|  | 
 | ||||||
|  |     Args: | ||||||
|  |         max_entries: The maximum number of entries in the cache. If the cache is full | ||||||
|  |             and a new entry is added, the least recently accessed entry will be evicted | ||||||
|  |             from the cache. | ||||||
|  |         num_args: The number of positional arguments (excluding `self`) to use as cache | ||||||
|  |             keys. Defaults to all named args of the function. | ||||||
|  |         uncached_args: A list of argument names to not use as the cache key. (`self` is | ||||||
|  |             always ignored.) Cannot be used with num_args. | ||||||
|  | 
 | ||||||
|  |     Returns: | ||||||
|  |         A decorator that applies a memoizing cache around the function. | ||||||
|  |     """ | ||||||
|  |     return _cached( | ||||||
|  |         max_entries=max_entries, | ||||||
|  |         num_args=num_args, | ||||||
|  |         uncached_args=uncached_args, | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class ModuleApi: | class ModuleApi: | ||||||
|     """A proxy object that gets passed to various plugin modules so they |     """A proxy object that gets passed to various plugin modules so they | ||||||
|     can register new users etc if necessary. |     can register new users etc if necessary. | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user