我可以@override下面的@overloaded Python函数吗?

问题描述 投票:0回答:1

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
参数出现在不同的位置。

有什么策略来应对这个问题?

python overriding overloading mypy typing
1个回答
0
投票

是的,但是

@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 抑制警告。
    

© www.soinside.com 2019 - 2024. All rights reserved.