gpt4 book ai didi

python - 返回 lambda 的装饰器工厂

转载 作者:行者123 更新时间:2023-12-02 01:39:52 26 4
gpt4 key购买 nike

我遇到了以下代码(这是真实代码的简化),它结合了装饰器工厂和 lambda 用法:

from functools import wraps

def decorator_factory(arg1):
def decorator(arg2):
return lambda func: real_decorator(arg1, arg2, func)
return decorator

def real_decorator(prefix: str, perm: str, func):
@wraps(func)
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return result
return wrapper

my_decorator_instance = decorator_factory("r")

class MyClass():

def __init__(self, *args, **kwargs):
pass

@my_decorator_instance('decorator args')
def method_1(self):
print("method_1")


m = MyClass()
m.method_1()

该代码工作得很好,但我不太了解其机制。特别是作为装饰器返回时如何使用 lambda 值。请注意,在 decorator_factory 中,没有 no func 参数。 func 是 lambda 的 arg。

最佳答案

造成混淆的一个可能原因是 decorator_factory 函数不是一个装饰器工厂,而是一个(装饰器工厂)工厂。 p>

装饰器工厂是一个返回装饰器的函数(参见 this answer by Martijn Pieters )。例如,functools.lru_cache是一个装饰器工厂,因为它返回一个装饰器:

import functools

decorator = functools.lru_cache(maxsize=69)

@decorator
def compute_something_expensive(foo, bar):
...

但是你的函数返回一个装饰器工厂,而不是装饰器。您可以像这样重构它:

def decorator_factory_factory(arg1):
def decorator_factory(arg2):
def decorator(func):
return real_decorator(arg1, arg2, func)
return decorator
return decorator_factory

你不能像这样使用这个函数,因为它不是装饰器工厂:

# will not really work:
@decorator_factory_factory('foo')
def method_1(self):
print("method_1")

你必须像这样使用它:

@decorator_factory_factory('foo')('bar')
def method_1(self):
print("method_1")

# alternatively:
decorator_factory = decorator_factory_factory('foo')

@decorator_factory('bar')
def method_1(self):
print("method_1")

关于python - 返回 lambda 的装饰器工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71769090/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com