[Python] Passing a list of senders to the sender parameter of @receiver decorator

Discussão em 'Python' iniciado por Stack, Junho 17, 2025.

  1. Stack

    Stack Membro Participativo

    So at the moment, I'm working on my Django project and I have a signal receiver function that looks like this:

    @receiver(pre_save, sender=Task, dispatch_uid='core.models.task_handler_pre_1')
    @receiver(pre_save, sender=TaskHistory, dispatch_uid='core.models.task_handler_pre_2')
    @receiver(pre_save, sender=TaskUser, dispatch_uid='core.models.task_handler_pre_3')
    def task_handler_pre(sender, instance, **kwargs):
    # do some stuff


    In an attempt to make the code look cleaner, I was wondering whether would it be possible to do something like this:

    @receiver(pre_save, sender=[Task, TaskHistory, TaskUser], dispatch_uid='core.models.task_handler_pre')
    def task_handler_pre(sender, instance, **kwargs):
    # do some stuff


    i.e. Does the sender parameter accepts a list of senders as a valid argument ? If not, then does the value of the dispatch_uid parameter within the @receiver decorator, have to be different for each individual sender, or can it be the same i.e.

    As mentioned previously, my receiver function looks like this at the moment:

    @receiver(pre_save, sender=Task, dispatch_uid='core.models.task_handler_pre_1')
    @receiver(pre_save, sender=TaskHistory, dispatch_uid='core.models.task_handler_pre_2')
    @receiver(pre_save, sender=TaskUser, dispatch_uid='core.models.task_handler_pre_3')
    def task_handler_pre(sender, instance, **kwargs):
    # do some stuff


    What difference would it make if I make the following change:

    @receiver(pre_save, sender=Task, dispatch_uid='core.models.task_handler_pre')
    @receiver(pre_save, sender=TaskHistory, dispatch_uid='core.models.task_handler_pre')
    @receiver(pre_save, sender=TaskUser, dispatch_uid='core.models.task_handler_pre')
    def task_handler_pre(sender, instance, **kwargs):
    # do some stuff


    i.e. make the value of the dispatch_uid parameter the same ( core.models.task_handler_pre ) for each individual sender. Thanks!

    Continue reading...

Compartilhe esta Página