【问题标题】:Signature differs from overidden 'save' method, pylint(signature-differs)签名不同于覆盖的“保存”方法,pylint(signature-differs)
【发布时间】:2021-03-07 12:56:22
【问题描述】:

能否帮助我理解 pylint 消息 Signature 与覆盖的“保存”方法不同,pylint(signature-differs) 指的是什么?:

def save(self, *args, **kwargs):
    """
    Override the original save method and update the number of
    seats available
    """
    reservations = (
        Booking.objects.aggregate(
            num_passengers=Count("passengers")
        )
        ["num_passengers"] or 0
    )
    self.seats_available = self.destination.max_passengers - reservations
    super().save(*args, **kwargs)

Django docs 说 “如果您在方法定义中使用 *args, **kwargs,您可以保证您的代码会自动支持这些(更新的方法)参数已添加。”

我不完全理解签名的工作原理,但我的理解是它与确保参数匹配有关。在这种情况下,我不认为我已经更改了默认保存方法的任何内容...那么是什么导致了问题?

【问题讨论】:

    标签: django methods overriding signature


    【解决方案1】:

    我刚刚遇到这个问题,并一直试图自己解决这个问题。我不明白确切的细节,但我相信我找到了一般的推理。

    基本上def save(self, *args, **kwargs) 比save method in the Django Docs 限制更少:

    def save(self, force_insert=False, force_update=False, using=None,
              update_fields=None)
    

    您会注意到,如果您从文档中复制并粘贴 save 方法中的参数,而不是 *args, **kwargs,则错误会消失。

    这是因为理论上使用*args, **kwargs 作为参数可以让您将额外的参数传递给方法,从而违反LSP Principle(请参阅conversation here 以获得清晰的示例)。替换中的参数必须与父方法相同或更严格。它们不应该允许你传递额外的参数。

    但是,在实践中,除非您自己编写代码,否则 Django 永远不会这样做,所以我认为在这种情况下,作为警告相对不重要。我想 Django 开发人员推荐使用简写 *args, **kwargs,因为它更容易在许多方法中用作替代,而不必记住每个单独的类或方法的特定参数。我猜它属于 Python 风格指南建议之一when it is better to be inconsistent with recommendations。

    希望能有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 2012-10-13
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多