无法猜测为什么重载函数实现不接受所有可能的参数

2024-05-29 10:06:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我想完全输入我的Python项目。但是我被一个可以用不同参数调用的构造函数困住了。你知道吗

我试着从最终的构造函数中删除类型,我试着删除一些构造函数。。。但还是有同样的问题。你知道吗

class PageObject(ABC):
    logger = logging.getLogger(__name__)

    @overload
    def __init__(self, driver: Driver) -> None:
        ...

    @overload
    def __init__(self, by: Tuple[By, str], driver: Driver) -> None:
        ...

    @overload
    def __init__(self, context: WebElement, driver: Driver) -> None:
        ...

    @overload
    def __init__(self, by: Tuple[By, str], parent: "PageObject") -> None:
        ...

    @overload
    def __init__(self, parent: "PageObject") -> None:
        ...

    def __init__(
        self,
        by: Optional[Tuple[By, str]] = None,
        context: Optional[WebElement] = None,
        parent: Optional["PageObject"] = None,
        driver: Optional[Driver] = None,
    ) -> None:

        if by and context:
            raise ValueError("You cannot provide a locator AND a context.")
        # ...

运行mypy时出现以下错误:

基本/页面_对象。py:36:错误:重载函数实现不接受签名1的所有可能参数

基本/页面_对象。py:36:错误:重载函数实现不接受签名2的所有可能参数

基本/页面_对象。py:36:错误:重载函数实现不接受签名3的所有可能参数

基本/页面_对象。py:36:错误:重载函数实现不接受签名4的所有可能参数

基本/页面_对象。py:36:错误:重载函数实现不接受签名5的所有可能参数


Tags: 对象函数pyselfnone参数byinit
1条回答
网友
1楼 · 发布于 2024-05-29 10:06:20

问题来了。假设有人尝试运行PageObject(Driver()),也就是说,我们传入一个Driver对象作为第一个参数。你知道吗

这与您的第一个重载匹配,因此将由mypy进行类型检查。但在运行时到底发生了什么?第一个运行时参数是by,因此Driver对象被分配给by而不是driver。所以现在类型之间存在不匹配,因为by应该是Optional[Tuple[By, str]]类型。你知道吗

可能最简单的解决方法是禁止用户同时使用位置参数和mandate that they use only keyword arguments。你可以这样做:

class PageObject:
    @overload
    def __init__(self, *, driver: Driver) -> None:
        ...

    @overload
    def __init__(self, *, by: Tuple[By, str], driver: Driver) -> None:
        ...

    @overload
    def __init__(self, *, context: WebElement, driver: Driver) -> None:
        ...

    @overload
    def __init__(self, *, by: Tuple[By, str], parent: "PageObject") -> None:
        ...

    @overload
    def __init__(self, *, parent: "PageObject") -> None:
        ...

    def __init__(
        self,
        *,
        by: Optional[Tuple[By, str]] = None,
        context: Optional[WebElement] = None,
        parent: Optional["PageObject"] = None,
        driver: Optional[Driver] = None,
    ) -> None:
        ...

现在,mypy typecheck没有错误,而执行PageObject(Driver())被mypy和Python视为错误。相反,您现在需要执行PageObject(driver=Driver())。你知道吗

如果您想允许位置参数,恐怕需要重新设计代码。也许您可以考虑使用staticmethods或classmethods之类的方法,这样您就可以拥有不同的构造函数“风格”,基本上就是注释中建议的工厂模式。你知道吗

相关问题 更多 >

    热门问题