【发布时间】:2023-03-28 16:08:01
【问题描述】:
以下是一个无用的示例,表明我无法用my_decorator 装饰我的add 函数,并提供一些额外的参数:
def my_decorator(fn=None, message=None, **options):
assert fn is not None, 'fn is not found'
print('function is found')
print(message)
return fn
# This syntax works (but does not make sense...)
@my_decorator
def multiply(a, b):
return a * b
# This syntax does not work
@my_decorator(message='surprise')
def add(a, b):
return a + b
# This no sugar-syntax works
add = my_decorator(add, message='surprise') # Works
在第二个示例中,fn 被视为None,这引发了AssertionError,但使用“无糖”语法!
我的代码有什么问题? (Python 2.7。是的,我们将迁移它...)
【问题讨论】:
-
其实你不需要装饰器而是装饰器工厂:一个创建装饰器的函数。
-
@TimothéDelion “如果我不使用 @- 语法,装饰器就可以工作!” ——因为这只是一个普通的函数调用,那为什么行不通呢?相比之下,装饰器语法具有 Laurent 所指出的特定约束。
-
这篇文章真的很有用:stackoverflow.com/q/739654/1513933
-
这篇文章,对面hynek.me/articles/decorators,对
@wraps非常批评