Django信号接收器应如何处理错误?

时间:2013-12-02 16:05:21

标签: python django signals messaging

引自docs

  

......看看** kwargs的论点。所有信号发送关键字参数,   并且可以随时更改这些关键字参数。如果是   request_finished,它记录为不发送参数,这意味着   我们可能想把我们的信号处理写成   my_callback(发送者)。

     

这是错误的 - 事实上,如果你这样做,Django会抛出一个错误   所以。这是因为在任何时候都可以将参数添加到   信号和你的接收者必须能够处理这些新论点。

我不明白。为什么'可以在任何时候添加参数',程序中的接口是否存在不变并且每个人都应该意识到它们?或者这些词是否意味着,每个接收者必须始终无声地失败?因为很明显,发送方会随机更改接口,接收方会失败并抛出错误。

  

这是错误的 - 事实上,如果你这样做,Django会抛出一个错误   如此。

使用信号时投掷错误是错误的还是它们意味着什么?

3 个答案:

答案 0 :(得分:0)

似乎只是告诉你要确保你总是包含**kwargs参数。所以你应该这样做。

答案 1 :(得分:0)

在Python中,特别是在Django中,通常以一种方式对API进行编程(或者更确切地说,是公开API的函数),在给定附加参数的情况下,它们仍然可以运行崩溃。

在您的特定情况下 - 考虑信号处理程序,如:

def (sender, param1, param2):
    pass

假设你有一些Django的X.Y版本,这个处理程序可以完美运行。然后你意识到Django已经更新到X.Z并且更改日志中的一件事是信号现在被赋予第四个关键字arg(param3)。

您是否愿意通过整个代码库并将处理程序更改为:

def handler(sender, param1, param2, param3):
    pass

......或者对所有处理程序进行编程会更好:

def handler(sender, param1, param2, **kwargs):
    pass

当您的函数应该将参数传递给其他函数时,这种设计也很有用:

def func(*args,**kwargs):
    # do something
    other_func(*args, **kwargs)

但有一点需要注意:这种API设计在合理使用params时是合理的。考虑一个(天真的)例子,如下所示" sum" API。

def sum(a,b):
    return a+b

然后在下一个版本中,sum函数突然开始获得更多参数:a,b,c。像下面这样的函数可能会导致很难跟踪错误:

def sum(a,b,**kwargs):
    return a+b

答案 2 :(得分:0)

  

使用信号时投掷错误是错误的还是它们意味着什么?

它们仅表示在调用信号接收器功能时需要**kwargs。使用信号时抛出错误并不是先验错误。总之,提醒您在需要定义接收函数时始终包含kwargs,如docs所示:

def my_callback(sender, **kwargs):
    print("Request finished!")