Python IDE无法识别子类中的函数签名与基方法匹配
我有一个基类,其函数在子类中被重写Python IDE无法识别子类中的函数签名与基方法匹配,python,inheritance,intellij-idea,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,
函数的签名也(部分)更改,以(据我所知)符合父类的方式(例如,添加了附加参数)
但是,我的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
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()”的签名与类“BaseFoo”中基方法的签名不匹配
如何编写这些类,使IDE能够识别子类中的函数签名确实与父类中的函数签名匹配?
也就是说,假设它们在我的示例中匹配(我错了吗?),我不想抑制这种警告(如果我错过了
uid
arg?)。没有找到更好的解决方案,我会将Ofer Sadan的评论作为一个明确的注释发布
回答:在子类的函数定义中添加另一个参数确实会使签名不匹配。可以使用*args和**kwargs并从**kwargs获取新的参数来绕过它 例如:
class BaseFoo():
def func(self, uid: int, *args, **kwargs):
pass
class Foo(BaseFoo):
def func(self, uid: int, name: str, *args, **kwargs):
pass
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
错误地没有提供…这就是为什么这是问题的部分解决方案。我很乐意接受完整解决方案)。如果签名不同,则不会覆盖,这是重载。由于添加了
name
参数,签名确实有所不同。如果希望签名保持不变,请使用name
作为kwargs['name']
重载中包含的密钥工作参数?但它是在一个子类中,而不是在同一个子类中class@OferSadan没有找到另一个解决方案,我把你的评论作为一个答案