引自docs:
......看看** kwargs的论点。所有信号发送关键字参数, 并且可以随时更改这些关键字参数。如果是 request_finished,它记录为不发送参数,这意味着 我们可能想把我们的信号处理写成 my_callback(发送者)。
这是错误的 - 事实上,如果你这样做,Django会抛出一个错误 所以。这是因为在任何时候都可以将参数添加到 信号和你的接收者必须能够处理这些新论点。
我不明白。为什么'可以在任何时候添加参数',程序中的接口是否存在不变并且每个人都应该意识到它们?或者这些词是否意味着,每个接收者必须始终无声地失败?因为很明显,发送方会随机更改接口,接收方会失败并抛出错误。
这是错误的 - 事实上,如果你这样做,Django会抛出一个错误 如此。
使用信号时投掷错误是错误的还是它们意味着什么?
答案 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!")