Django:堆叠装饰器

Joe*_*der 3 python django

我有以下信号.是否有可能像我在这里'堆叠'这两个装饰器一样?

@receiver(signal=charge_succeeded)
@transaction.atomic
def create_influencer_transaction(sender, order, charge, **kwargs):
    pass
Run Code Online (Sandbox Code Playgroud)

AKX*_*AKX 7

是.

考虑装饰器的工作原理,这相当于

def create_influencer_transaction(sender, order, charge, **kwargs):
    pass


create_influencer_transaction = transaction.atomic(
    create_influencer_transaction
)
create_influencer_transaction = receiver(signal=charge_succeeded)(
    create_influencer_transaction
)
Run Code Online (Sandbox Code Playgroud)

- transaction.atomic将返回一个具有原子性包装器逻辑的新函数,但receiver只返回相同的函数.

但是,这里的顺序很重要(你已经做对了); 如果装饰器是另一种方式,receiver将注册非原子版本,这是不好的.