|
2849 | 2849 | "#| export\n",
|
2850 | 2850 | "def flexicache(*funcs, maxsize=128):\n",
|
2851 | 2851 | " \"Like `lru_cache`, but customisable with policy `funcs`\"\n",
|
| 2852 | + " import asyncio\n", |
2852 | 2853 | " def _f(func):\n",
|
2853 | 2854 | " cache,states = {}, [None]*len(funcs)\n",
|
2854 |
| - " @wraps(func)\n", |
2855 |
| - " def wrapper(*args, **kwargs):\n", |
2856 |
| - " key = f\"{args} // {kwargs}\"\n", |
| 2855 | + " def _cache_logic(key, execute_func):\n", |
2857 | 2856 | " if key in cache:\n",
|
2858 | 2857 | " result,states = cache[key]\n",
|
2859 | 2858 | " if not any(f(state) for f,state in zip(funcs, states)):\n",
|
2860 | 2859 | " cache[key] = cache.pop(key)\n",
|
2861 | 2860 | " return result\n",
|
2862 | 2861 | " del cache[key]\n",
|
2863 |
| - " try: newres = func(*args, **kwargs)\n", |
| 2862 | + " try: newres = execute_func()\n", |
2864 | 2863 | " except:\n",
|
2865 | 2864 | " if key not in cache: raise\n",
|
2866 | 2865 | " cache[key] = cache.pop(key)\n",
|
2867 | 2866 | " return result\n",
|
2868 | 2867 | " cache[key] = (newres, [f(None) for f in funcs])\n",
|
2869 | 2868 | " if len(cache) > maxsize: cache.popitem()\n",
|
2870 | 2869 | " return newres\n",
|
2871 |
| - " return wrapper\n", |
| 2870 | + "\n", |
| 2871 | + " @wraps(func)\n", |
| 2872 | + " def wrapper(*args, **kwargs):\n", |
| 2873 | + " return _cache_logic(f\"{args} // {kwargs}\", lambda: func(*args, **kwargs))\n", |
| 2874 | + "\n", |
| 2875 | + " @wraps(func)\n", |
| 2876 | + " async def async_wrapper(*args, **kwargs):\n", |
| 2877 | + " return await _cache_logic(f\"{args} // {kwargs}\", lambda: asyncio.ensure_future(func(*args, **kwargs)))\n", |
| 2878 | + "\n", |
| 2879 | + " return async_wrapper if asyncio.iscoroutinefunction(func) else wrapper\n", |
2872 | 2880 | " return _f"
|
2873 | 2881 | ]
|
2874 | 2882 | },
|
|
2913 | 2921 | "cell_type": "code",
|
2914 | 2922 | "execution_count": null,
|
2915 | 2923 | "metadata": {},
|
2916 |
| - "outputs": [], |
| 2924 | + "outputs": [ |
| 2925 | + { |
| 2926 | + "data": { |
| 2927 | + "text/plain": [ |
| 2928 | + "3" |
| 2929 | + ] |
| 2930 | + }, |
| 2931 | + "execution_count": null, |
| 2932 | + "metadata": {}, |
| 2933 | + "output_type": "execute_result" |
| 2934 | + } |
| 2935 | + ], |
2917 | 2936 | "source": [
|
2918 | 2937 | "@flexicache(time_policy(10), mtime_policy('000_tour.ipynb'))\n",
|
2919 |
| - "def cached_func(x, y): return x+y" |
| 2938 | + "def cached_func(x, y): return x+y\n", |
| 2939 | + "\n", |
| 2940 | + "cached_func(1,2)" |
2920 | 2941 | ]
|
2921 | 2942 | },
|
2922 | 2943 | {
|
|
2936 | 2957 | }
|
2937 | 2958 | ],
|
2938 | 2959 | "source": [
|
2939 |
| - "cached_func(1,2)" |
| 2960 | + "@flexicache(time_policy(10), mtime_policy('000_tour.ipynb'))\n", |
| 2961 | + "async def cached_func(x, y): return x+y\n", |
| 2962 | + "\n", |
| 2963 | + "await cached_func(1,2)\n", |
| 2964 | + "await cached_func(1,2)" |
2940 | 2965 | ]
|
2941 | 2966 | },
|
2942 | 2967 | {
|
|
0 commit comments