【问题标题】:How Django signal receiver should handle errors?Django 信号接收器应该如何处理错误?
【发布时间】:2013-12-18 09:53:38
【问题描述】:

引用docs:

...查看 **kwargs 参数。所有信号都发送关键字参数, 并且可以随时更改这些关键字参数。如果是 request_finished,它被记录为不发送任何参数,这意味着 我们可能会想把我们的信号处理写成 我的回调(发件人)。

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

我不明白。为什么“可以随时添加参数”,程序中的接口不是恒定存在的,每个人都应该意识到它们吗?还是这些话的意思是,每个接收器都必须总是默默地失败?因为很明显,如果发送方随机更改接口,接收方将失败并抛出错误。

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

使用信号时抛出错误是错误的,或者它们是什么意思?

【问题讨论】:

    标签: python django signals messaging


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      在 Python 中,尤其是在 Django 中,对 API(或者更准确地说,公开 API 的函数)进行编程是很常见的,即当给定额外的参数时,它们仍然可以运行而不是崩溃。

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

      def (sender, param1, param2):
          pass
      

      假设你有一些版本的 Django,这个处理程序可以完美地工作。然后你意识到 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 设计在对参数进行自愿操作时是合理的。考虑一个(简单的)示例,如以下“sum” API。

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

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

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

      【讨论】:

        【解决方案3】:

        使用信号时抛出错误是错误的,或者它们是什么意思?

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-04
          • 2018-09-18
          • 2011-08-19
          • 1970-01-01
          • 1970-01-01
          • 2013-06-28
          相关资源
          最近更新 更多