2024-04-26 09:22:21 发布
网友
我希望构建一个缓存装饰器,它将函数的结果缓存到装饰中指定的位置。像这样:
@cacheable('/path/to/cache/file') def my_function(a, b, c): return 'something'
decorator的参数与它包装的函数的参数完全独立。我看了很多例子,但我不太明白如何做到这一点——有没有可能为decorator提供一个与包装函数无关且没有传递给包装函数的参数?在
每次缓存都会出错,所以我不需要每次缓存都会出错
def cache(filepath): def decorator(f): f._cache = Cache(cachepath) def decorated(*args,**kwargs): try: key = (args, kwargs) res = f._cache.get(key) except KeyError: res = f(*args, **kwargs) f._cache.put(key, res) return res return decorated return decorator
其思想是您的decorator是一个返回decorator的函数。在
首先编写修饰符,就像知道参数是全局变量一样。比如说:
-
def decorator(f): def decorated(*args,**kwargs): cache = Cache(cachepath) if cache.iscached(*args,**kwargs): ... else: res = f(*args,**kwargs) cache.store((*args,**kwargs), res) return res return decorated
然后编写一个以cachepath为参数的函数,并返回decorator。在
是的。正如您所知,装饰器是一个函数。以表格形式书写时:
def mydecorator(func): def wrapper(*args, **kwargs): return func(*args, **kwargs) return wrapper @mydecorator def foo(a, b, c): pass
传递给mydecorator的参数是函数foo本身。在
mydecorator
foo
当decorator接受一个参数时,调用@mydecorator('/path/to')实际上是先用'/path/to'调用mydecorator函数。然后调用mydecorator(path)的结果来接收函数foo。你正在有效地定义一个动态包装器函数。在
@mydecorator('/path/to')
mydecorator(path)
简而言之,您需要另一层decorator函数。在
下面是一个有点傻的例子:
每次缓存都会出错,所以我不需要每次缓存都会出错
其思想是您的decorator是一个返回decorator的函数。在
首先编写修饰符,就像知道参数是全局变量一样。比如说:
-
然后编写一个以cachepath为参数的函数,并返回decorator。在
-
^{pr2}$是的。正如您所知,装饰器是一个函数。以表格形式书写时:
传递给
mydecorator
的参数是函数foo
本身。在当decorator接受一个参数时,调用
@mydecorator('/path/to')
实际上是先用'/path/to'调用mydecorator函数。然后调用mydecorator(path)
的结果来接收函数foo
。你正在有效地定义一个动态包装器函数。在简而言之,您需要另一层decorator函数。在
下面是一个有点傻的例子:
^{pr2}$相关问题 更多 >
编程相关推荐