【发布时间】:2020-05-15 07:33:39
【问题描述】:
我不知道如何将原始参数传递给堆叠的装饰器。这是我的例子:
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 的装饰器模块来装饰装饰器,但它使装饰器或包装器只允许位置参数输入。每种组合我都试过了,但我无法判断它的正面或反面。
如何通过堆叠装饰器保留参数?
【问题讨论】:
-
我不确定你的意思。你的装饰者不接受任何争论。如果你去掉那个
inspect...,只打印args和kwargs,你可以看到你已经可以访问args了。 -
你想做什么?您是否意识到装饰器只是将函数作为参数,所以您的
trial.__init__()方法实际上是outside_decorator(inside_decorator(trial.__init__(*args, **kwargs)))。
标签: python arguments decorator wrapper python-3.7