如何使python装饰器中的参数可配置?

我正在使用缓存工具进行一些基本的缓存。以下是我如何使用它的示例:


class Access:


  @cached(cache=TTLCache(maxsize=5, ttl=10))

  def get_some_value(input: str):

    # do some calls and return a value

这里的问题是我如何使 和 可配置?我不能做这样的事情maxsizettl


class Access:

  def __init__(self, maxsize: int = 5, ttl: int = 10):

    self.maxsize = maxsize

    self.ttl = ttl


  @cached(cache=TTLCache(maxsize=self.maxsize, ttl=self.ttl))

  def get_some_value(input: str):

    # do some calls and return a value

我正在寻找一种方法来注入这些值,如果需要,并且还有默认值。有什么有用的指示吗?此外,不必是实例方法。如果需要,我也可以将其设置为类方法或模块级别。get_some_value()


翻阅古今
浏览 96回答 2
2回答

皈依舞

为了解决这个问题,我们可以利用Python装饰器只是返回其他函数的函数的事实。假设您有以下装饰器:eggsdef eggs(foo=10, bar=20):    def wrapper_gen(func):        def wrapper(*args):            print(foo, bar)            func(*args)        return wrapper    return wrapper_gen这个类:Spamclass Spam:    @eggs(foo=10, bar=20)    def baz(self, input):        print(input)我们可以这样调用该方法:bazSpam().baz("Hello, world!")这给了我们10 20Hello, world!现在,我们将在我们的方法中装饰,而不是直接修饰函数:__init__class Spam:    def __init__(self, foo=10, bar=20):        self.baz = eggs(foo=foo, bar=bar)(self._baz_func)    def _baz_func(self, input):        print(input)现在:Spam(foo=20, bar=30).baz("Hello, world!")此输出20 30Hello, world!这有效的原因是:@foodef bar():    ...是以下的简写:def bar():    ...bar = foo(bar)

开心每一天1111

这不能使用常规的装饰器语法工作,原因有两个:属于类,所以它不能对不同的实例有不同的行为,因为它只有一个“副本”;并且装饰器是在类声明时执行的,而不是在创建实例时执行的,因此还没有参数。get_some_value__init__但是,您可以通过在方法中显式应用修饰器来获得所需的结果:__init__class Access:    def __init__(self, maxsize: int = 5, ttl: int = 10):        decorator = cached(cache=TTLCache(maxsize=maxsize, ttl=ttl))        self.get_some_value = decorator(self.get_some_value)    def get_some_value(self, input: str):        ...
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python