Python:特定于修饰符的参数(与包装函数无关)?

2024-04-26 09:22:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望构建一个缓存装饰器,它将函数的结果缓存到装饰中指定的位置。像这样:

@cacheable('/path/to/cache/file')
def my_function(a, b, c):
    return 'something'

decorator的参数与它包装的函数的参数完全独立。我看了很多例子,但我不太明白如何做到这一点——有没有可能为decorator提供一个与包装函数无关且没有传递给包装函数的参数?在


Tags: topath函数cache参数returnmydef
3条回答

每次缓存都会出错,所以我不需要每次缓存都会出错

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。在

-

^{pr2}$

是的。正如您所知,装饰器是一个函数。以表格形式书写时:

def mydecorator(func):
   def wrapper(*args, **kwargs):
       return func(*args, **kwargs)
   return wrapper

@mydecorator
def foo(a, b, c):
    pass

传递给mydecorator的参数是函数foo本身。在

当decorator接受一个参数时,调用@mydecorator('/path/to')实际上是先用'/path/to'调用mydecorator函数。然后调用mydecorator(path)的结果来接收函数foo。你正在有效地定义一个动态包装器函数。在

简而言之,您需要另一层decorator函数。在

下面是一个有点傻的例子:

^{pr2}$

相关问题 更多 >