Да, это так. Как известно, декоратор - это функция. Когда написано в форме:
def mydecorator(func):
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
@mydecorator
def foo(a, b, c):
pass
аргумент, переданный mydecorator
, является самой функцией foo
.
Когда декоратор принимает аргумент, вызов @mydecorator('/path/to')
на самом деле собирается сначала вызвать функцию mydecorator с помощью '/ path / to'. Затем будет вызван результат вызова mydecorator(path)
для получения функции foo
. Вы эффективно определяете динамическую функцию-обертку.
В двух словах, вам нужен еще один слой функций декоратора.
Вот этот слегка глупый пример:
def addint(val):
def decorator(func):
def wrapped(*args, **kwargs):
result = func(*args, **kwargs)
return result + val
return wrapped # returns the decorated function "add_together"
return decorator # returns the definition of the decorator "addint"
# specifically built to return an extra 5 to the sum
@addint(5)
def add_together(a, b):
return a + b
print add_together(1, 2)
# prints 8, not 3