我刚开始学习编程,一直在尽力吸收尽可能多的知识。我不太理解你们发布的很多技术解释,所以请尽量使用简单易懂的英语。我了解如何使用装饰器函数,但我的问题是跟随代码逻辑 - 具体来说,为什么我们必须添加*args和** kwargs。是否正确地陈述:无论我们将什么传递给接受带有参数函数的装饰器函数,在装饰器中嵌套了的包装器函数总是会传递相同的参数,因为它嵌套在装饰器中?这就是我不明白的地方。我不理解原始函数中的参数如何被传递。
我刚开始学习编程,一直在尽力吸收尽可能多的知识。我不太理解你们发布的很多技术解释,所以请尽量使用简单易懂的英语。我了解如何使用装饰器函数,但我的问题是跟随代码逻辑 - 具体来说,为什么我们必须添加*args和** kwargs。是否正确地陈述:无论我们将什么传递给接受带有参数函数的装饰器函数,在装饰器中嵌套了的包装器函数总是会传递相同的参数,因为它嵌套在装饰器中?这就是我不明白的地方。我不理解原始函数中的参数如何被传递。
def tracing(func):
@functools.wraps
def wrapper(*args, **kwargs):
logging.debug(f'Calling {func.__name__}')
try:
return func(*args, **kwargs)
finally:
logging.debug(f'Called {func.__name__}')
return wrapper
@tracing
def spam():
print('spam')
@tracing
def add3(n):
return n+3
*args, **kwargs
来传递同样的*args, **kwargs
到被包装的函数中。tracing
不需要了解它所包装的函数的任何信息-它可以接受任何一组位置参数和关键字参数,并返回任何值,而装饰器仍然有效。*args,**kwargs
,然后混合列表和字典以查找该特定参数,但更简单、更清晰的方法是明确指定:def caching_spam(func):
cache = {}
@functool.wraps
def wrapper(eggs, beans, spam, cheese):
if spam not in cache:
cache[spam] = func(eggs, beans, spam, cheese)
return cache[spam]
return wrapper
但是通用的装饰器比特定的装饰器更多。