为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

翻阅古今 2022-08-16 16:38:58
我正在使用缓存工具进行一些基本的缓存。以下是我如何使用它的示例:class Access:  @cached(cache=TTLCache(maxsize=5, ttl=10))  def get_some_value(input: str):    # do some calls and return a value这里的问题是我如何使 和 可配置?我不能做这样的事情maxsizettlclass 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()
查看完整描述

2 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

为了解决这个问题,我们可以利用Python装饰器只是返回其他函数的函数的事实。


假设您有以下装饰器:eggs


def eggs(foo=10, bar=20):

    def wrapper_gen(func):

        def wrapper(*args):

            print(foo, bar)

            func(*args)

        return wrapper

    return wrapper_gen

这个类:Spam


class Spam:

    @eggs(foo=10, bar=20)

    def baz(self, input):

        print(input)

我们可以这样调用该方法:baz


Spam().baz("Hello, world!")

这给了我们


10 20

Hello, 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 30

Hello, world!

这有效的原因是:


@foo

def bar():

    ...

是以下的简写:


def bar():

    ...


bar = foo(bar)


查看完整回答
反对 回复 2022-08-16
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

这不能使用常规的装饰器语法工作,原因有两个:属于类,所以它不能对不同的实例有不同的行为,因为它只有一个“副本”;并且装饰器是在类声明时执行的,而不是在创建实例时执行的,因此还没有参数。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):

        ...


查看完整回答
反对 回复 2022-08-16
  • 2 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号