IDE无法识别子类中的函数签名与基本方法匹配

时间:2019-10-06 07:36:12

标签: python inheritance intellij-idea

我有一个基类,该基类具有在子类中重写的功能。
函数的签名也被(部分地)更改了(据我所知)符合父类(例如,添加了附加参数)。
但是,我的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参数,那该怎么办?)。

1 个答案:

答案 0 :(得分:2)

找不到更好的解决方案,我将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时也不会显示警告。
这就是为什么这是该问题的部分解决方案。我很高兴接受完整的解决方案)。