如何使用装饰器引入功能和参数?

我有一段代码,如下所示:


def range_print(n, *args):

    for i in range(n):

        func(i)

@range_print(n=10)

def func(i):

    print(i)

我得到:


TypeError                                 Traceback (most recent call last)

<ipython-input-4-b13e44263521> in <module>

      2     for i in range(n):

      3         func(i)

----> 4 @range_print(n=10)

      5 def func(i):

      6     print(i)


<ipython-input-4-b13e44263521> in range_print(n, *args)

      1 def range_print(n, *args):

      2     for i in range(n):

----> 3         func(i)

      4 @range_print(n=10)

      5 def func(i):


TypeError: 'NoneType' object is not callable

后来我解决了这个问题,但我不知道有没有更好的方法?我想使用装饰器使我的代码看起来更干净。


def range_print(n, *args):

    def inner(func): # <----Why do I need this def to load func?

        for i in range(n):

            func(i)

    return inner

@range_print(n=10)

def func(i):

    print(i)


繁星点点滴滴
浏览 76回答 1
1回答

GCT1015

该函数将函数作为参数的原因是,当您向函数添加类似装饰器时,这就是Python的机制的工作方式。inner@range_print(n=10)调用函数时,Python 会将函数本身及其参数传递给装饰器。range_print因此,在您的情况下,函数签名中指定的参数实际上是一个函数。nrange_print
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python