instance of a decorator
- декораторы, реализованные с функциями и обычными функциями, являются просто функциями типа function
.
Не уверен, что именно вы хотите получить.Код ниже, как я бы подошел к проблеме.По сути, я добавляю атрибут primal_type
ко всем функциям, участвующим в оформлении карнавала, для хранения названия функций / декораторов.Я делаю это с другим декоратором по имени DecoratorApplier
.Кажется, что код выполняет что-то связанное с проблемой в вопросе.
РЕДАКТИРОВАТЬ
Добавленные пояснения не прояснили все.Я полагаю, что не стоит смешивать логику функций и декораторов таким образом.Может быть, есть другая возможность получить нужную информацию внутри функции?В любом случае две измененные версии моего оригинального подхода ниже (oda
обозначает необязательные аргументы декоратора).
(1) - с DecoratorApplier
import functools
def decorator_1(*d1_args, **d1_kwargs):
def decorator(func):
@functools.wraps(func)
def wrapped(*args, **kwargs):
print('inside decorator_1', d1_args, d1_kwargs)
return func(*args, **kwargs)
return wrapped
return decorator
def decorator_2(*d2_args, **d2_kwargs):
def decorator(func):
@functools.wraps(func)
def wrapped(*args, **kwargs):
print('inside decorator_2', d2_args, d2_kwargs)
return func(*args, **kwargs)
return wrapped
return decorator
class DecoratorApplier:
def __init__(self, *decorators):
self.decorators = decorators
def __call__(self, func):
func.oda = dict()
for decorator in self.decorators:
func = decorator[0](*decorator[1], **decorator[2])(func)
(
func
.oda
.setdefault(decorator[0].__name__, list())
.extend([decorator[1], decorator[2]])
)
return func
@DecoratorApplier(
(decorator_1, (1, 2), {'x': 10, 'y': 20}),
(decorator_2, tuple(), dict()))
def f_1():
print('inside f_1')
print(f_1.oda)
return
if __name__ == '__main__':
f_1()
(2) - с изменением оригиналадекораторы
import functools
def decorator_1(*d1_args, **d1_kwargs):
def decorator(func):
@functools.wraps(func)
def wrapped(*args, **kwargs):
print('inside decorator_1', d1_args, d1_kwargs)
(
kwargs
.setdefault('oda', dict())
.setdefault('decorator_1', list())
.extend([d1_args, d1_kwargs])
)
return func(*args, **kwargs)
return wrapped
return decorator
def decorator_2(*d2_args, **d2_kwargs):
def decorator(func):
@functools.wraps(func)
def wrapped(*args, **kwargs):
print('inside decorator_2', d2_args, d2_kwargs)
(
kwargs
.setdefault('oda', dict())
.setdefault('decorator_2', list())
.extend([d2_args, d2_kwargs])
)
return func(*args, **kwargs)
return wrapped
return decorator
@decorator_1(1, 2, x=10, y=20)
@decorator_2()
def f_1(oda=None):
print('inside f_1')
print(' oda', oda)
return
if __name__ == '__main__':
f_1()