Как использовать декораторы для ввода функций и параметров? - PullRequest
1 голос
/ 19 марта 2020

У меня есть фрагмент кода следующим образом:

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)

1 Ответ

1 голос
/ 19 марта 2020

Причина, по которой функция inner принимает функцию в качестве параметра, заключается в том, что именно так работает механизм Python, когда вы добавляете декоратор, такой как @range_print(n=10), в свою функцию.

Когда вы вызываете свою функцию, Python передает саму функцию вместе с ее аргументами декоратору range_print.

Итак, в вашем случае параметр с именем n в сигнатуре функции range_print на самом деле является функцией.

...