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



引用自文档:

看看**kwargs的论点。所有信号都发送关键字自变量,并且可以随时更改那些关键字参数。假使request_finished,它被记录为不发送参数,这意味着我们可能会想把我们的信号处理写成my_callback(发件人)。

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

我不明白。为什么"参数可以随时添加",程序中的接口不是恒定的,每个人都应该知道吗?或者这些话的意思是,每个接收者都必须默默地失败?因为很明显,如果发送方随机更改接口,接收方就会失败并抛出错误。

这是错误的——事实上,如果你这样做,Django会抛出一个错误所以

在使用信号时抛出错误是错误的,或者它们的含义是什么?

在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)

但需要注意的是:当对params采取行动是自愿的时,这种API设计是合理的。考虑一个(幼稚的)例子,如下面的"sum"API。

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

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

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

这似乎只是告诉您要确保始终包含**kwargs参数。所以你应该这么做。

在使用信号时抛出错误是错误的,或者它们的含义是什么?

它们只意味着当您调用信号接收器功能时需要**kwargs。在使用信号时抛出错误并不是先验错误。总之,提醒您在需要定义接收器函数时始终包括kwargs,正如文档所说:

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

最新更新