【发布时间】:2015-10-17 13:59:53
【问题描述】:
他们似乎在做同样的事情。在功能、使用等方面有区别吗?在什么情况下应该使用一种而不是另一种?
谢谢
【问题讨论】:
标签: python django signals decorator receiver
他们似乎在做同样的事情。在功能、使用等方面有区别吗?在什么情况下应该使用一种而不是另一种?
谢谢
【问题讨论】:
标签: python django signals decorator receiver
从功能的角度来看,它们确实做了完全相同的事情。除了开发人员希望如何组织代码之外,没有任何理由偏爱其中一个。
编辑:根据@knbk 的出色回答,您应该将connect 函数用于特定操作,例如传递回调函数列表。
来自Django documentation on signals:
有两种方法可以将接收器连接到信号。您可以采取手动连接路线:
from django.core.signals import request_finished request_finished.connect(my_callback)或者,您可以使用 receiver() 装饰器:
from django.core.signals import request_finished from django.dispatch import receiver @receiver(request_finished) def my_callback(sender, **kwargs): print("Request finished!")
【讨论】:
@receiver 是Signal.connect() 周围的薄包装。唯一的区别是@receiver 不仅可以接受单个信号,还可以接受list 或tuple 的信号,并且它将函数连接到这些信号中的每一个。
如果你看一下source code,@receiver 只调用signal.connect(func) 并返回原始函数。
【讨论】: