【问题标题】:IDE does not recognize that function signature in sub-class matches base methodIDE 无法识别子类中的函数签名与基方法匹配
【发布时间】:2019-10-06 07:36:12
【问题描述】:

我有一个基类,其函数在子类中被覆盖。
函数的签名也(部分)改变了,以一种(据我所知)符合父类的方式(例如,添加了额外的参数)。
但是,我的 IDE (IntelliJ IDEA) 显示一个警告,即子类中方法的签名与基方法的签名不匹配。

例如:

class BaseFoo():
    def func(self, uid: int, *args, **kwargs):
        pass

class Foo(BaseFoo):
    def func(self, uid: int, name: str, *args, **kwargs):
        pass

显示此警告:

“Foo.func()”方法的签名与“BaseFoo”类中基方法的签名不匹配

如何编写这些类以使 IDE 能够识别子类中的函数签名确实与父类的函数签名匹配?
也就是说,假设它们在我的示例中匹配(我错了吗?),不想抑制这种警告(如果我错过了 uid 参数怎么办?)。

【问题讨论】:

  • 如果签名不同,它不是覆盖,而是重载。
  • 签名确实不同,因为您添加了name 参数。如果您希望签名保持不变,请使用 name 作为 kwargs['name'] 中包含的密钥参数
  • 重载?但它在一个子类中,而不是在同一个类中
  • @OferSadan 没有找到其他解决方案,我将您的评论作为答案发布

标签: python inheritance intellij-idea


【解决方案1】:

没有找到更好的解决方案,我会将 Ofer Sadan 的评论作为明确的内容发布 答:
在子类的函数定义中添加另一个参数确实会使签名不匹配。可以通过使用 *args 和 **kwargs 并从 **kwargs 中获取新参数来绕过它。

例如:

class BaseFoo:
    def func(self, uid: int, *args, **kwargs):
        pass


class Foo(BaseFoo):
    def func(self, uid: int, *args, **kwargs):
        name: str = kwargs.get('name')
        pass

不会显示警告。
(它也不会在使用 Foo().func(...) 时显示警告,其中错误地未提供 name...
这就是为什么这是该问题的部分解决方案。我很乐意接受完整的解决方案) .

【讨论】:

    猜你喜欢
    • 2018-01-15
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 2020-08-03
    • 2016-09-02
    相关资源
    最近更新 更多