Что происходит с аргументами функции со сложенными python декораторами? - PullRequest
0 голосов
/ 29 января 2020

Я не могу понять, как передать исходные аргументы сложенным декораторам. Вот мой пример:

def outside_decorator(function):
    @functools.wraps(function)
    def wrapper(*args, **kwargs):
        print('outside args:',inspect.getfullargspec(function).args)
        return function(*args,**kwargs)
    return wrapper

def inside_decorator(function):
    @functools.wraps(function)
    def innerwrapper(*args,**kwargs):
        print('inside args:', inspect.getfullargspec(function).args)
        return function(*args,**kwargs)
    return innerwrapper

class trial:
    @outside_decorator
    @inside_decorator
    def __init__(self,val1,val2,val3,note1='hello',note2='hi'):
        print('decorated function args:',inspect.getfullargspec(trial).args)
        print('arg values:',val1, val2, val3, note1, note2)

a=trial(1,2,3)

Вывод:

outside args: []
inside args: ['self', 'val1', 'val2', 'val3', 'note1', 'note2']
decorated function args: []
arg values: 1 2 3 hello hi

Я видел несколько ответов, которые приводят к ошибке с @functools.wraps() и включают модуль декоратора с @decorator.decorator украшать декораторы, но это делает так, чтобы декоратор или обертка принимали только позиционный аргумент. Я перепробовал каждую комбинацию, но не могу понять, как это сделать.

Как мне сохранить аргументы с помощью составных декораторов?

1 Ответ

0 голосов
/ 09 февраля 2020

Вот хороший пример того, как использовать параметры в декораторах в Python: https://www.geeksforgeeks.org/decorators-with-parameters-in-python/

Имейте в виду, что все является объектом в Python, и когда вы попробуйте украсить функцию другой функцией в Python, это означает, что вы просто используете внутреннюю функцию в качестве параметра для внешней функции.

...