无需传递函数作为参数的Python装饰器

时间:2019-07-02 12:09:22

标签: python decorator

我正在学习编写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) 异常。

1 个答案:

答案 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函数实际上不需要返回funcwrapper本质上是func的替代。这就是装饰者所做的。它们用装饰器的内部函数替换您装饰的函数(通过以装饰的函数作为参数调用外部函数)。