如果我从一个函数发送一个python'Signal'对象,那么“sender”参数应该是什么?

时间:2013-06-11 11:38:54

标签: python django signals

如果我从一个模块函数发送一个信号(发生了一个django视图函数),那不在一个类中,那么(对我来说)发送者应该是什么不明显 - 如果有的话?在这种情况下sender=None是否合适?

或者,该函数由HTTP请求调用,我当前将其作为单独的参数传递 - 我应该传递它吗?

选项A:

from django.dispatch import Signal
my_signal = Signal(
    providing_args=['my_arg', 'request']
)    

# this is a view function
def do_something(request):
    # ... do useful stuff
    my_signal.send(
        sender=None,
        my_arg="Hello",
        request=request
    )

选项B:

from django.dispatch import Signal
my_signal = Signal(
    providing_args=['my_arg']
)    

# this is a view function
def do_something(request):
    # ... do useful stuff
    my_signal.send(
        sender=request,
        my_arg="Hello",
    )

[UPDATE]

选项A有它。在这种情况下,接收者可以对发送者做任何有用的事情(即它不是对象),因此将其设置为无。

2 个答案:

答案 0 :(得分:12)

django.dispatch.Dispatcher source只是说它应该是

"...[t]he sender of the signal. Either a specific object or None."

然后通过connect()与接收者联系,发送者的意义是:

"The sender to which the receiver should respond. Must either be
 of type Signal, or None to receive events from any sender"
我承认,

并不是特别清楚,但在你的情况下,我会说使用sender=None,因为没有什么具体可以挂钩,因为请求是暂时的。

答案 1 :(得分:0)

函数是Python中的对象,因此您可以将发件人设置为函数的引用,如下所示:

def my_func():
    my_signal.send(sender=my_func, my_arg="Hello")