PySide6 函数
QComboBox.addItem
是有类型提示的,在 QtWidgets.pyi
中,如下所示:
@overload
def addItem(self, icon: Union[PySide6.QtGui.QIcon, PySide6.QtGui.QPixmap], text: str, userData: Any = ...) -> None: ...
@overload
def addItem(self, text: str, userData: Any = ...) -> None: ...
为了干净地(根据类型检查器)
@override
它,我需要提供一个Python实现,它“接受签名1和2的所有可能的参数”,但我似乎无法这样做,尤其是因为以下事实: text
参数出现在不同的位置。
有什么策略来应对这个问题?
是的,但是
@override
只需要添加到实现上,而不是@overload
上。
import typing_extensions as typing
import PyQt5.QtGui
import PyQt5.QtWidgets
class MyQComboBox(PyQt5.QtWidgets.QComboBox):
@typing.overload
def addItem(self, text: str, userData: typing.Any = ...) -> None: ...
@typing.overload
def addItem(self, icon: PyQt5.QtGui.QIcon, text: str, userData: typing.Any = ...) -> None: ...
@typing.override
def addItem(self, *args: object, **kwargs: object) -> None:
"""
Your implementation. `*args` and `**kwargs` are just
placeholders for the signature you actually want.
"""
$ mypy test.py
Success: no issues found in 1 source file
为了让 mypy 停止抱怨子类中重写的
@overload
方法,您需要复制所有重载(如上面的示例)。这是不符合人体工程学且容易出错的。在我看来,您应该只实现您想要在子类中接受的重写方法的签名,并使用 # type: ignore
抑制警告。