我正在学习编写python装饰器。以下是两个示例。
示例1:
<DayPickerInput
format="L"
value={this.props.value}
onDayChange={() => console.log('onDayChange')}
inputProps={{
onChange: () => { console.log('onChange') }
}}
/>
示例2:
def dec():
def wrapper(func):
print(func)
return func
return wrapper
@dec
def hello():
print('hello')
所以我的问题是,为什么示例1在示例2运行良好的情况下引发def dec(name):
def wrapper(fn):
print(fn)
return fn
return wrapper
@dec('a')
def hello(x):
print(x)
异常。
答案 0 :(得分:1)
示例不正确。装饰器的外部功能(在这种情况下为dec)必须带有一个参数,即装饰的功能。
因此示例1应该如下所示:
def dec(func):
def wrapper():
print(func)
return func
return wrapper
@dec
def hello():
print('hello')
hello()
示例2虽然不会立即崩溃,但如果您尝试调用hello
(修饰的函数),则会立即崩溃。
要让装饰器接受参数,您需要另一层嵌套。
因此,示例2应该如下所示:
def dec_args(name):
def dec(func):
def wrapper():
print(func)
print(name)
return func
return wrapper
return dec
@dec_args('a')
def hello():
print('hello')
hello()
内部装饰器函数(wrapper
)应该采用传递给装饰函数(hello
)的参数。在这些情况下,您没有任何
还要注意,wrapper
函数实际上不需要返回func
。 wrapper
本质上是func
的替代。这就是装饰者所做的。它们用装饰器的内部函数替换您装饰的函数(通过以装饰的函数作为参数调用外部函数)。