декоратора состоит из функции декоратора и функция оболочки (и если вы хотите дополнительные аргументы для декоратора другого внешнего слоя функции вокруг него):
# Takes the arguments for the decorator and makes them accessible inside
def my_fun(decorator_argument1, decorator_argument2):
# Takes the function so that it can be wrapped.
def wrapfunc(func):
# Here we are actually going to wrap the function ... finally
def wrapper(*args, **kwargs):
# Call the function with the args and kwargs
res = func(*args, **kwargs)
# return this result
return res
# Replace the decorated function with the wrapper
return wrapper
# Return the wrapper for the function wrapper :-)
return wrapfunc
В вашем случае, если вы хотите использовать только декоратору с функцией вам не нужно возиться с *args, **kwargs
и заменить его:
def wrapper(x, y):
# Here you can do stuff with x and y, i.e. print(x)
# Call the function with x and y
res = func(x, y)
# Here you can do stuff with the result, i.e. res = res * decorator_argument1
return res
Я указал место, где вы можете получить доступ к x
и y
и результату.
Если вы хотите предопределять значения для x
и y
, пользовательский декоратор не лучший способ. Вы можете использовать по умолчанию:
def add(x=4,y=5): return x+y
add() # returns 9
add(2) # returns 7
add(5, 10) # returns 15
или если вы хотите, чтобы исправить аргумент, вы должны использовать functools.partial
Если вы хотите, чтобы декоратор принимал такие параметры, как '4,5' в коде OP, тогда должен быть дополнительный уровень обертывания , – interjay
Да, как добавить дополнительную оболочку для аргументов, а также –
отредактировал ответ для необязательных аргументов. Я думал, что в основном это касается доступа к «х» и «у» и результата вызова функции, и другой слой будет немного запутывающим. Сожалею. – MSeifert