我有一个基类,该基类具有在子类中重写的功能。
函数的签名也被(部分地)更改了(据我所知)符合父类(例如,添加了附加参数)。
但是,我的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
参数,那该怎么办?)。
答案 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
时也不会显示警告。
这就是为什么这是该问题的部分解决方案。我很高兴接受完整的解决方案)。